搞出了啥?
通过easyexcel将csv文本文件转换为excel xlsx的jar包小工具。
- csv是逗号分隔符,该小工具也支持其他分隔符如竖线(|)、井号(#)或其他自定义的字符串。
- csv只是文本文件后缀名,也可以是txt或其他后缀名的文本文件。
- 编译环境jdk1.8
- cmd、linux下可运行
- 自动转换同jar包路径下的所有
- 自动trim(去除单元格里内容的前后空格)
- 字符集UTF8。
背景
业务部门天天找运维部门导数据,一般数据库导出csv文件还是可以的。但业务部门说只会用xls、xlsx,其他的不会。导出的文本文件有时候到几十上百M了,这是要多少行数据。
业务部门要看几百万数据量的excel?xlsx文件单个sheet最多也就1048576行,双击打开都要开半天。这是何苦呢。
运维的同事暂时也没啥好的办法,只能是split按行数先拆分文件,然后复制粘贴到excel,最后交付给业务部门。
Linux下也可以用Gnumeric ssconvert。主要是我也不会,还是写个jar给他们用吧。
ssconvert参考:
1、在Linux中CSV转换成XLSX
2、The Gnumeric Manual, version 1.12。见14.8.Converting Files
需求
需要一个将csv转换为xlsx文件的工具。
问题
先写了一个普通的通过POI HSSF将csv转excel的demo出来先,而后考虑以下问题:
- 分隔符如果不是逗号而是其他符号呢,比如竖线(|),或者井号(#),或者是字符串(如$$$,用三个连续的美元符号作为分隔符);
- 文件后缀名一定得是csv吗,其他的行不行,比如txt、DAT等等;
- 文本数据里有没有表头?
- 是一个个的写文件名去转换,还是直接转换同jar路径下的所有文件?
- 一个文本文件有多少行数据?xlxs最大也就1048576行,对于几百万行的要如何处理?
- 测试过程中一个十多万行的文本跑不出来,打断点观察发现跑到8w多9w的时候,有点跑不动的样子,行数count累加的很慢。POI HSSF貌似不能流输出?
代码
通过easyexcel将文本文件转xlsx。
之前一度卡在如何不建实体类来写xlsx文件上,看官网都是如下代码,感觉都要建个实体类?
excelWriter = EasyExcel.write(fileName, DemoData.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
excelWriter.write(data(), writeSheet);
最终发现将一行内的单元格内容构造为List<List>的样式即可,代码为:
List<List<String>> list = new ArrayList<List<String>>();
list.add(Arrays.asList(getTrimStrs(line, Delimiter_in)));
writer.write(list, sheet);
jar包代码:
public class CsvToXlsxUtil {
//默认参数
static String Delimiter_in = "|";
static String fileType = "txt";
static long rowmax = 1000000;// 最大行数100w行
static boolean isHeader = true;
static Pattern r = Pattern.compile("^\\.\\d+$");
private static boolean getInput() {
Scanner scanner=new Scanner(System.in);
//输入分隔符,默认为竖线
System.out.print("请输入分隔符,带双引号,如:, | #(默认为竖线|):");
String din=scanner.nextLine();
if(din!=null && din.length()>0){
Delimiter_in=getDelimiter(din);
}else{
Delimiter_in=getDelimiter(Delimiter_in);
}
// 输入文件后缀名,默认为txt
System.out.print("请输入待转换为xlsx的文件后缀名,如:txt csv(默认为txt):");
String fin=scanner.nextLine<