由poi API创build的Excel文件:数据在那里,但只有一行是可见的?

我使用了在线代码中的简单代码,并且可以在for循环中的代码中调用该方法,并将其传递给数据和行号。 该文件正确创build,文件的大小(刷新我的文件资源pipe理器后)是每一个插入改变,但是当我完成我打开文件,我只能看到第一行在那里,当我closures它的大小文件从1.5MB减less到5个字节。 我用notepad ++(以字节字符打开)打开了1.5 MB的文件,实际上我可以看到除第一行以外我已经写入文件的数据,所有的行都在那里。 但是当我在Excel中打开它does not。

有什么我在这里失踪。 在每个插入到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个字节,当我closures文件)? 这里有什么问题?

感谢您的帮助,提前。

赛义德。

这里的问题是,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 (); } 

可能与您的问题不相关,但为了便于Excel生成,build议使用build立在POI之上的JXLS(http://jxls.sourceforge.net/)。 JXLS的美丽的部分是它使您能够创build一个Excel模板(当然使用Excel),然后您只需将数据放入模板。 它支持基本的逻辑运算,包括else和loop。

如果你能买得起商业解决scheme,请看看Templater 。 这非常容易使用。 免责声明:我是作者。