4

我正在尝试使用 Apache POI 在 Excel 文件中创建一个工作表。

由于它是 Excel 2007,我正在使用 XSSF,并且正在寻找一种方法来使工作表从右到左对齐。

在 HSSF 中有一种方法org.apache.poi.hssf.usermodel.HSSFSheet.setRightToLeft(boolean),但我在org.apache.poi.xssf.usermodel.XSSFSheet.

我正在使用 Apache POI 3.7

4

3 回答 3

9

解决方法:

 XSSFSheet sheet = workbook.createSheet();
 sheet.getCTWorksheet().getSheetViews().getSheetViewArray(0).setRightToLeft(true);

资料来源:http ://thread.gmane.org/gmane.comp.jakarta.poi.user/17099/focus=17110

于 2011-07-28T11:58:12.540 回答
2

因为它不在那里,所以你需要做一些工作,对不起......

首先,在 Excel 中创建一个从左到右的简单文件。然后,打开一个副本并在excel中将其设置为从右到左,然后保存。现在,解压缩这两个文件(.xlsx 是 xml 文件的 zip),然后比较 xml 以查看设置从右到左时发生的变化(我怀疑它只是 /sheets/sheet1.xml 会改变 BICBW)

一旦您知道 XML 需要在短期内更改哪些内容,就可以从 POI 中获取低级 CT 对象并使用它们来操作它。例如,您可能会获得 CTWorkSheet,并在其上设置一个标志

最后,在 POI bugzilla 中报告缺少 setter/getter 的新错误。上传两个示例文件,可以在单元测试中使用,并包含更改的 XML 和需要设置的 CT 对象的信息。然后有人可以快速将该功能添加到 POI。如果可以的话,包括一个 XSSFSheet 的补丁也可以做到这一点!

于 2011-07-28T10:45:41.740 回答
0

如果您的工作表对象是 XSSFSheet 的实例,则可以使用反射。

private void setCurrentSheetRtl() {
    try {
        final Field sh = currentSheet.getClass().getDeclaredField("_sh");
        sh.setAccessible(true);
        final XSSFSheet shObj = (XSSFSheet) sh.get(currentSheet);
        final Method method = shObj.getClass().getDeclaredMethod("getSheetTypeSheetViews");
        method.setAccessible(true);
        final CTSheetViews ctSheetViews = (CTSheetViews) method.invoke(shObj);
        ctSheetViews.getSheetViewArray(0).setRightToLeft(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
于 2018-12-03T05:15:07.907 回答