如何使用 Apache POI XSSF 创建从右到左对齐的工作表

发布于 2024-11-26 12:16:40 字数 291 浏览 2 评论 0原文

我正在尝试使用 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

I'm trying to create a sheet in the Excel file using Apache POI.

Since it's Excel 2007, I'm using XSSF and I'm looking a for way to make a sheet right-to-left aligned.

In HSSF there is a method org.apache.poi.hssf.usermodel.HSSFSheet.setRightToLeft(boolean), but I cannot find it in org.apache.poi.xssf.usermodel.XSSFSheet.

I'm using Apache POI 3.7

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦幻的味道 2024-12-03 12:16:40

解决方法:

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

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

The workaround:

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

Source: http://thread.gmane.org/gmane.comp.jakarta.poi.user/17099/focus=17110

落花浅忆 2024-12-03 12:16:40

因为它不存在,所以您需要做一些工作,抱歉...

首先,在 Excel 中从左到右创建一个简单的文件。然后,打开一个副本并将其在 Excel 中从右到左设置,然后保存。 了什么变化(我怀疑只是 /sheets/sheet1.xml 更改了 BICBW)

现在,解压缩这两个文件(.xlsx 是 xml 文件的 zip),然后比较 xml 以查看设置从右到左时发生 了解 XML 短期内需要更改什么,从 POI 获取低级 CT 对象并使用它们来操作它。例如,您可能会获取 CTWorkSheet,并在其上设置一个标志。

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

As it's not there, you'll need to do a little bit of work, sorry...

First, create a simple file in excel that's left to right. Then, open a copy and set it to right to left in excel, and save. Now, unzip both files (.xlsx is a zip of xml files), and diff the xml to see what changed when right to left was set (I suspect it'll just be /sheets/sheet1.xml that changes BICBW)

Once you know what XML needs changing, short term, grab the low level CT objects from POI and use those to manipulate it. For example, you might get the CTWorkSheet, and set a flag on that

Finally, report a new bug in the POI bugzilla for the missing setter/getter. Upload the two sample files, which can be used in a unit test, and include information on the XML that is changed and the CT objects that need setting. Someone can then quickly add the feature to POI. If you can, include a patch to XSSFSheet that does this too!

帥小哥 2024-12-03 12:16:40

如果您的工作表对象是 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();
    }
}

You can use reflection if your sheet object is instance of 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();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文