Ссылки на листы в формулах POI Apache - PullRequest
2 голосов
/ 21 июня 2010

Я использую Apache POI 3.6 для создания листов Excel (2003).Я хочу вставить формулу в ячейку, которая вычисляет сумму определенных ячеек на нескольких листах.

У меня есть листы с именами a, b и c, и я хочу вычислить сумму ячеек A1

Я пытался:

cell.setCellFormula("a!A1+b!A1+c!A1");

POI не выдает никаких ошибок, но когда я открываю лист, я получаю ошибку в OpenOffice:

Err: 522 - =$#REF!.A1+$#REF!.A1+$#REF!.A1

Я провел небольшое исследование и по-видимомуесть ошибки при ссылке на несколько листов.(например, https://issues.apache.org/bugzilla/show_bug.cgi?id=46670) Кто-нибудь знает, как использовать формулы, используя несколько листов в POI?

-------------- исходный код -------------------

public static void main(String args[]){
    Workbook wb = new HSSFWorkbook();
    CreationHelper createHelper = wb.getCreationHelper();
    Sheet sheet = wb.createSheet("Total");

    Row row = sheet.createRow((short)0);
    Cell cell = row.createCell(0);

    cell.setCellFormula("a!A1+b!A1+c!A1");

    Sheet sheet1 = wb.createSheet("a");
    Sheet sheet2 = wb.createSheet("b");
    Sheet sheet3 = wb.createSheet("c");
    Sheet sheet4 = wb.createSheet("d");

    createVal(sheet1, createHelper, 5);
    createVal(sheet2, createHelper, 10);
    createVal(sheet3, createHelper, 15);
    createVal(sheet4, createHelper, 20);

    try {
        FileOutputStream fileOut = new FileOutputStream("workbook.xls");
        wb.write(fileOut);
        fileOut.close();
        System.out.println("done");
    } catch (IOException e) {
        e.printStackTrace();
    }   }

public static void createVal(Sheet sheet, CreationHelper createHelper, int i){
     Row row = sheet.createRow((short)0);
        // Create a cell and put a value in it.
        Cell cell = row.createCell(0);
        // Or do it on one line.
        row.createCell(0).setCellValue(i);

}

1 Ответ

6 голосов
/ 21 июня 2010

Ваш код будет работать нормально, если вы переместите создателя листа "Всего" на после заполнения отдельных листов.

Как показано ниже:

...    
    createVal(sheet1, createHelper, 5); 
    createVal(sheet2, createHelper, 10); 
    createVal(sheet3, createHelper, 15);
    createVal(sheet4, createHelper, 20); 

    Sheet sheet = wb.createSheet("Total"); 
    Row row = sheet.createRow((short)0); 
    Cell cell = row.createCell(0); 

    cell.setCellFormula("a!A1+b!A1+c!A1"); 

Ячейка Total!A1 показывает 30

...