用apache poi从Java编写Excel文件

时间:2012-03-31 10:26:05

标签: java excel apache-poi

我正在编写一个从Microsoft Access数据库读取数据并将此数据写入Excel工作表的应用程序。一切正常,但不是将新数据写入文件。这是代码:

private static XSSFWorkbook readFile(String filename) throws IOException {
    // return new XSSFWorkbook(new FileInputStream(filename));
    InputStream inp = new FileInputStream(filename);
    XSSFWorkbook wb = null;
    try {
        wb = (XSSFWorkbook) WorkbookFactory.create(inp);
    } catch (InvalidFormatException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return wb;
}

public void writeToFile(LinkedList<TimeRowWrapper> list) {

    try {
        // read file
        XSSFWorkbook workbook = readFile(fileName);

        // choose table from index
        XSSFSheet sheet = workbook.getSheetAt(kapaSheetIndex);

        for (Row row : sheet) {
            int rowNum = row.getRowNum();

            // iterate over list for row id
            for (TimeRowWrapper trw : list) {
                if (rowNum == trw.getRowNumber()) {

                    double hour = Math
                            .round(trw.getTotalTime() / 60.0 * 100.) / 100.;
                    Cell cell = row.getCell(timeCol);
                    cell.setCellValue(hour);
                }
            }
        }

        XSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);

        FileOutputStream out = new FileOutputStream(fileName);
        workbook.write(out);
        out.close();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
}

2 个答案:

答案 0 :(得分:0)

根据您对帖子的评论,我假设您在for循环中所做的事情是正确的。看起来你正在从代码中编写数值,而且你也在写入你读过的同一个工作簿。我有一个理论,你可能正在向Cell写正确但是做公式评估可能会做一些由于Excel喜欢格式化格式,所以数字很棘手。

尝试写入新文件而不是输入文件,看看是否会生成电子表格,至少。

另外,请尝试查看注释掉该行时会发生什么:

XSSFFormulaEvaluator.evaluateAllFormulaCells(workbook); 

答案 1 :(得分:0)

我发布的源代码是正确的。在Excelfile中有一些Colums与0一起 - 所以我试着写一个没有显示的专栏。