系统一开始使用的Excel格式进行导出,但是在使用过程中,每次导出的数据量逐渐增多,达到了excel最大行数1048576。
一般会出现如下错误:
java.lang.IllegalArgumentException: Invalid row number (1048576) outside allowable range (0..1048575) at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:105)
这时为了能够满足业务发展的需求,我们把Excel格式改为了Csv格式,保证导出数据的正常
Csv格式的文件,其实就是一行行文本,然后每一行用逗号分隔。
修改为Csv格式之后,第一次尝试导出,出现了中文乱码的问题,把编码修改为GBK就可以解决了。
而后又出现用Excel文件打开文件,里面的数字一旦超过13位就默认采取科学计数法的方式进行展示,当然你可以用excel另存为其他文件,修复这个问题,但是作为开发者,不应该让使用者多出这么一个步骤。
后续在网上搜索解决方案,总体思路就是让excel认为这个数字是字符文本就可以,而不要当成数字来解析。
基本的解决方案都是在数字的前面或后面增加一个制表符,这样就不会影响文档的准确性,只是增加一个制表符即可,也即“\t”。
当我增加之后,我又尝试了一遍导出,但是仍然没有效果,之后又尝试前面增加,或者其他方式,依然没有任何效果。
后来突然觉得是不是在写的时候有特殊处理,然后就看了一下CsvWriter.writeRecord(String[])方法,果然发现一些猫腻,代码如下
if(!var2 && var1.length() >0) {
var1 = var1.trim();
}
以上代码在判断为true的情况下,就会对字符串进行前后清除空格的操作,其中var1就是需要写入的数字,var2是CsvWriter.writeRecord方法的第二个参数
后来改为调用CsvWriter.writeRecord(String[],true)方法,成功解决了问题
对于打开显示########的解决方法,同上类似。