Как создать лист с выравниванием справа налево, используя Apache POI XSSF - PullRequest
4 голосов
/ 28 июля 2011

Я пытаюсь создать лист в файле Excel, используя Apache POI.

Поскольку это Excel 2007, я использую XSSF и ищу способ выравнивания листа справа налево.

В HSSF есть метод org.apache.poi.hssf.usermodel.HSSFSheet.setRightToLeft(boolean), но я не могу найти его в org.apache.poi.xssf.usermodel.XSSFSheet.

Я использую Apache POI 3.7

Ответы [ 3 ]

7 голосов
/ 28 июля 2011

Обходной путь:

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

Источник: http://thread.gmane.org/gmane.comp.jakarta.poi.user/17099/focus=17110

2 голосов
/ 28 июля 2011

Так как его там нет, вам нужно немного поработать, извините ...

Сначала создайте простой файл в Excel, который будет слева направо. Затем откройте копию и установите ее справа налево в Excel и сохраните. Теперь разархивируйте оба файла (.xlsx - это zip из файлов xml), и просмотрите xml, чтобы увидеть, что изменилось, когда был установлен справа налево (я подозреваю, что это будет просто /sheets/sheet1.xml, который изменит BICBW)

Как только вы узнаете, что XML нужно изменить, в краткосрочной перспективе, возьмите низкоуровневые CT-объекты из POI и используйте их для управления им. Например, вы можете получить CTWorkSheet и установить флаг для этого

Наконец, сообщите о новой ошибке в POZ bugzilla для отсутствующего установщика / получателя. Загрузите два примера файлов, которые можно использовать в модульном тесте, и включите информацию об измененном XML и объектах CT, которые необходимо настроить. Кто-то может быстро добавить эту функцию в POI. Если вы можете, включите патч для XSSFSheet, который делает это тоже!

0 голосов
/ 03 декабря 2018

Вы можете использовать отражение, если ваш объект листа является экземпляром 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();
    }
}
...