当前位置:   article > 正文

通过easyexcel将文本文件转为excel xlsx文件_easyexcel.write生成文件的格式为xlsx

easyexcel.write生成文件的格式为xlsx

搞出了啥?

通过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出来先,而后考虑以下问题:

  1. 分隔符如果不是逗号而是其他符号呢,比如竖线(|),或者井号(#),或者是字符串(如$$$,用三个连续的美元符号作为分隔符);
  2. 文件后缀名一定得是csv吗,其他的行不行,比如txt、DAT等等;
  3. 文本数据里有没有表头?
  4. 是一个个的写文件名去转换,还是直接转换同jar路径下的所有文件?
  5. 一个文本文件有多少行数据?xlxs最大也就1048576行,对于几百万行的要如何处理?
  6. 测试过程中一个十多万行的文本跑不出来,打断点观察发现跑到8w多9w的时候,有点跑不动的样子,行数count累加的很慢。POI HSSF貌似不能流输出?

代码

通过easyexcel将文本文件转xlsx。
之前一度卡在如何不建实体类来写xlsx文件上,看官网都是如下代码,感觉都要建个实体类?

excelWriter = EasyExcel.write(fileName, DemoData.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
excelWriter.write(data(), writeSheet);
  • 1
  • 2
  • 3

最终发现将一行内的单元格内容构造为List<List>的样式即可,代码为:

List<List<String>> list = new ArrayList<List<String>>();
list.add(Arrays.asList(getTrimStrs(line, Delimiter_in)));
writer.write(list, sheet);
  • 1
  • 2
  • 3

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(
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/469325
推荐阅读
相关标签
  

闽ICP备14008679号