由poi API创建的Excel文件:数据是否存在但只能查看一行?

时间:2012-01-21 07:29:20

标签: java excel apache-poi

我使用了来自在线code的简单代码,我能够在for循环中调用代码中的方法并传递数据和行号。文件是正确创建的,文件的大小(在刷新我的文件浏览器之后)在每次插入时都会更改,但是当我完成后我打开文件,我只能看到那里的第一行,当我关闭它的大小文件从1.5MB减少到5bytes。我在notepadd ++中打开了1.5 MB的文件(当然是用字节字符打开的)我实际上可以看到我在第一行以外写入文件的数据,我的所有行都在那里。但是当我在excel中打开它不会。

我在这里缺少一些东西吗?在每次插入excel文件时,我这样做:

fileOutputStream = new FileOutputStream(fileName,true);
sampleWorkbook.write(fileOutputStream);

之后在try块的finally块中:

finally {
    /**
     * Close the fileOutputStream.
    */
    try {
        if (fileOutputStream != null) {
            fileOutputStream.flush();
            fileOutputStream.close();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

但是如果文件大小正在改变并且我可以在记事本中查看数据,为什么excel会将除第一行之外的行视为临时数据(这就是我假设它正在执行的操作,因为它恢复到只有5关闭文件时的字节数)?这有什么不对?

提前感谢您的帮助。

赛。

3 个答案:

答案 0 :(得分:2)

这里的问题是xls不是一种简单的格式,在xls中添加一行并不意味着在文件的末尾附加几个字节。新数据将插入到文件的中间,因此您必须完全重写整个文件。 您的代码示例只是在现有工作簿之后写入另一个工作簿,这会使文件内容无效。因此,当您在Excel中打开它时,它会自动更正文件内容,删除除第一个工作簿之外的所有添加数据。

使用此代码示例:

InputStream in = new FileInputStream (path);
Workbook sampleWorkbook;
try{
  sampleWorkbook = new HSSFWorkbook (in);//or XSSFWorkbook depending on whether you use xls or xlsx
} finally
{
  in.close ();
}

//Add some rows into the workbook

OutputStream out = new FileOutputStream (path);
try{
  sampleWorkbook.write (out);
} finally
{
  out.close ();
}

答案 1 :(得分:0)

可能与您的问题无关,但为了便于Excel生成,建议使用建立在POI之上的JXLS(http://jxls.sourceforge.net/)。 JXLS的优点在于它使您能够创建Excel模板(当然使用Excel),然后您只需将数据放入模板中。它支持基本逻辑操作,包括if else和loop。

答案 2 :(得分:0)

如果您能负担得起商业解决方案,请查看Templater。它非常易于使用。免责声明:我是作者。