通过easyexcel将文本文件转为excel xlsx文件

这个博客介绍了一个使用EasyExcel库将csv或文本文件转换为xlsx格式的Java工具。工具支持不同分隔符,能处理大量数据,并且在cmd和Linux环境下运行。它解决了业务部门对xlsx格式的需求,避免了手动转换的繁琐过程。
摘要由CSDN通过智能技术生成

搞出了啥?

通过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);

最终发现将一行内的单元格内容构造为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<
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用EasyExcel提供的读取Excel文件数据的功能,将数据读取到Java程序中,然后再使用JDBC将数据插入到数据库中。 以下是一个示例代码,演示如何使用EasyExcelExcel文件中的数据导入到MySQL数据库中: ```java // 读取Excel文件数据 String fileName = "example.xlsx"; List<DemoData> dataList = new ArrayList<>(); EasyExcel.read(fileName, DemoData.class, new DemoDataListener(dataList)).sheet().doRead(); // 将数据插入到数据库 String url = "jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; String username = "root"; String password = "password"; String sql = "INSERT INTO demo_data (id, name, age) VALUES (?, ?, ?)"; try (Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = conn.prepareStatement(sql)) { for (DemoData data : dataList) { pstmt.setInt(1, data.getId()); pstmt.setString(2, data.getName()); pstmt.setInt(3, data.getAge()); pstmt.executeUpdate(); } } catch (SQLException e) { e.printStackTrace(); } ``` 其中,`DemoData`是一个Java类,用于存储Excel文件中的数据。`DemoDataListener`是一个实现了EasyExcel监听器接口的类,用于处理读取Excel文件时的事件。在`DemoDataListener`的`invoke`方法中,将读取到的数据存储到`dataList`中。 在上述代码中,使用JDBC连接MySQL数据库,并将数据插入到`demo_data`表中。你需要根据自己的实际情况修改数据库连接信息和SQL语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马克布克打字机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值