Почему индекс последнего столбца слишком низкий для функции Offset в Apache POI и как с этим бороться? - PullRequest
0 голосов
/ 28 ноября 2018

Я использую Apache POI для выполнения некоторых ручных вычислений, и недавно я столкнулся с проблемой, заключающейся в том, что я не могу использовать формулу OFFSET для столбцов, начинающихся с индекса 255.

Например

XSSFCell cell = sheet.getRow(1).createCell(1);
cell.setCellFormula("OFFSET(IV220,0,1)");

XSSFFormulaEvaluator evaluator = 
workbook.getCreationHelper().createFormulaEvaluator();

evaluator.evaluateInCell(cell)

И значение внутри переменной cell всегда равно #REF!.Кроме того, имейте в виду, что индекс столбца для IV220 равен 255. В случае, если я уменьшу индекс столбца на 1, тогда получится действительное значение:

cell.setCellFormula("OFFSET(IU220,0,1)");

Я обнаружил, чтоorg.apache.poi.ss.formula.functions.Offset имеет проверку, чтобы проверить, длиннее ли индекс столбца, чем 255. Это из-за поддержки некоторых устаревших форматов документов?

Я использую версию Apache POI: 4.0.0

1 Ответ

0 голосов
/ 28 ноября 2018

Возможно, вы используете файл .xls и собираетесь создать этот тип файла.Но он не поддерживает много столбцов

, он поддерживает максимум 65536 строк и 256 столбцов

Но если вы используете обновленный формат XLSX поддерживает 1048576 строки 16384 столбца

MS Excel с поддержкой соответствующих строк и столбцов

+-----------------+-----------+--------------+---------------------+
|                 | Max. Rows | Max. Columns | Max. Cols by letter |
+-----------------+-----------+--------------+---------------------+
| Excel 365*      | 1,048,576 | 16,384       | XFD                 |
| Excel 2013      | 1,048,576 | 16,384       | XFD                 |
| Excel 2010      | 1,048,576 | 16,384       | XFD                 |
| Excel 2007      | 1,048,576 | 16,384       | XFD                 |
| Excel 2003      | 65,536    | 256          | IV                  |
| Excel 2002 (XP) | 65,536    | 256          | IV                  |
| Excel 2000      | 65,536    | 256          | IV                  |
| Excel 97        | 65,536    | 256          | IV                  |
| Excel 95        | 16,384    | 256          | IV                  |
| Excel 5         | 16,384    | 256          | IV                  |
+-----------------+-----------+--------------+---------------------+

Но здесь вы используете XSSF , что означает, что ваш файл находится в .xlsx формат, поэтому он будет поддерживать этот предел.Но если ваш файл в формате .xls , то этот предел не поддерживается.

Если вы используете файл .xlsx , вы можете попробовать этот код.Может быть, это поможет вам.

private static void writeData() throws IOException {

        Workbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = (XSSFSheet) workbook.createSheet();

        int r = 0;
        for (int i=0;i<2;i++) {
            Row row = sheet.createRow(r++);
            int column = 0;
            for (int j =0;j<2;j++) {
                XSSFCell cell = (XSSFCell) row.createCell(column++);
                if (r == 1 || column == 1) cell.setCellValue(i);

                else if (column == 2) {
                    cell.setCellFormula("OFFSET(IU220,0,1)");
                }
            }
        }


        FileOutputStream fileOut = new FileOutputStream("stackProblem.xlsx");
        workbook.write(fileOut);
        workbook.close();
    }

Файл выглядит так:

enter image description here

evaluator.evaluateInCell(cell); больше не поддерживаетсязатем 255 столбцов.Вы можете использовать evaluator.evaluate(cell);

Попробуйте это

public static void main(String[] args) throws IOException {
        writeData();
    }

    private static void writeData() throws IOException {

        Workbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = (XSSFSheet) workbook.createSheet();


        XSSFRow row218 = sheet.createRow(218);
        XSSFCell vv2180 = (XSSFCell) row218.createCell(255);
        vv2180.setCellValue(50);

        XSSFCell vv2181 = (XSSFCell) row218.createCell(256);
        vv2181.setCellValue(69);

        XSSFRow row219 = sheet.createRow(219);
        XSSFCell vv0 = (XSSFCell) row219.createCell(255);
        vv0.setCellValue(40);

        XSSFCell vv = (XSSFCell) row219.createCell(256);
        vv.setCellValue(70);

        XSSFRow row220 = sheet.createRow(220);
        XSSFCell vv2200 = (XSSFCell) row220.createCell(255);
        vv2200.setCellValue(30);

        XSSFCell vv220 = (XSSFCell) row220.createCell(256);
        vv220.setCellValue(20);


        XSSFCell cell = sheet.createRow(1).createCell(1);
        cell.setCellFormula("OFFSET(IV220,0,1)");
        XSSFFormulaEvaluator evaluator =
                (XSSFFormulaEvaluator) workbook.getCreationHelper().createFormulaEvaluator();

        evaluator.evaluate(cell);


        FileOutputStream fileOut = new FileOutputStream("stackProblem.xlsx");
        workbook.write(fileOut);
        workbook.close();
    }

Хорошая ссылка на библиотеку poi: apche poi HSSF против XSSF

...