我使用了来自在线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关闭文件时的字节数)?这有什么不对?
提前感谢您的帮助。
赛。
答案 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。它非常易于使用。免责声明:我是作者。