设计一款可扩展和基于windows系统的一键处理表格小工具思路

您所在的位置:网站首页 一健表格 设计一款可扩展和基于windows系统的一键处理表格小工具思路

设计一款可扩展和基于windows系统的一键处理表格小工具思路

#设计一款可扩展和基于windows系统的一键处理表格小工具思路| 来源: 网络整理| 查看: 265

原创总结/朱季谦

image

设计一款可扩展和基于windows系统的一键处理表格小工具思路

日常开发当中,业务人员经常会遇到一些重复性整理表格的事情,这时候,就可以通过一些方式进行自动化程序处理,提高工作(摸鱼)效率。

例如,业务人员有这样需要,日常需要手工整理以下原始xlsx表格数据,这些数据格式都是固定死,他们需要去除【手机号】这一列,然后在第一行增加一个表头标题【审计结果表】,同时需要将【日期】格式统一整理成yyyy-mm-dd格式的,最后需要在日期列前面增加一列【是否合格】,统一设置值为1。 image

整理后的表格如下: image

注意,真实需求会比以上需求更加复杂,这里只是以一个比较简单的需求展开演示,来设计一个可一键傻瓜式自动化整理日常表格的工具。

工具的开发环境如下:

Java,Bat,需要依赖处理表格的poi的maven依赖。

一、创建一个maven工程,pom.xml依赖如下 4.0.0 org.example auto-put-file 1.0-SNAPSHOT 3.1.0 3.8.1 3.1.2 2.8.2 2.5.2 3.1.2 org.projectlombok lombok 1.18.2 org.apache.commons commons-lang3 3.2.1 org.apache.poi poi 4.1.2 org.apache.poi poi-ooxml-schemas 4.1.2 org.apache.poi poi-scratchpad 4.1.2 org.apache.poi poi-ooxml 4.1.2 fr.opensagres.xdocreport xdocreport 2.0.2 org.apache.poi ooxml-schemas 1.4 maven-clean-plugin ${maven-clean-plugin.version} maven-deploy-plugin ${maven-deploy-plugin.version} maven-install-plugin ${maven-install-plugin.version} maven-jar-plugin ${maven-jar-plugin.version} org.apache.maven.plugins maven-compiler-plugin ${maven-compiler-plugin.version} UTF-8 1.8 1.8 org.apache.maven.plugins maven-assembly-plugin 3.1.1 com.put.AutoExcel jar-with-dependencies make-assembly package single

注意下, com.put.AutoExcel这一行需要填写你的main对应路径,如果路径不对的话,打成jar后,是无法通过java -jar xxx.jar运行的。

我在项目里依赖的4.1.2版本的org.apache.poi依赖包,最开始使用的是4.1.0版本的,但发现里面有一个很大的bug,就是使用XSSFSheet中处理指定行数据下移的方法sheet.shiftRows(0,sheet.getLastRowNum(),1,true,false)时,会发现指定下移位置之后的数据,都被删除完了,导致下移后的表格都成了一片空白。后来,我改成了4.1.2版本,才没有这个问题,但是,注意了,4.1.2版本依旧存在一个bug,那便是将第二列数据通过sheet.shiftColumns(1,sheet.getRow(0).getLastCellNum(),-1)左移覆盖掉第一列时,会出现以下异常:

Exception in thread "Thread-0" java.lang.IndexOutOfBoundsException at org.apache.xmlbeans.impl.store.Xobj.removeElement(Xobj.java:2206) at org.apache.xmlbeans.impl.store.Xobj.remove_element(Xobj.java:2236) at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.removeC(Unknown Source) at org.apache.poi.xssf.usermodel.XSSFRow.fixupCTCells(XSSFRow.java:612) at org.apache.poi.xssf.usermodel.XSSFRow.onDocumentWrite(XSSFRow.java:582) at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:3640) at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:3585) at org.apache.poi.ooxml.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:490) at org.apache.poi.ooxml.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:495) at org.apache.poi.ooxml.POIXMLDocument.write(POIXMLDocument.java:236) at com.put.service.impl.ConToImageServiceImpl.export(ConToImageServiceImpl.java:64) at com.put.AutoExcel.lambda$main$0(AutoExcel.java:26) at java.lang.Thread.run(Thread.java:745)

查看一些资料得知,即使到了5.x版本,该bug一直没有完全修复,只能通过先删除第一列后,再将第二列之后的数据往左移一列的方式,曲线解决这个反向移动问题。

二、基于Java SPI设计一套可便于后期扩展的接口实现

image

我在工程里使用到了Java SPI的服务发现机制,便于后期如果有需要进行工具处理新功能扩展,只需要增加一个实现类,放到com.put.service.DisposeService文件目录里,这样,后期就不需要改动原有工具的代码了。

1、先创建一个接口DisposeService:

package com.put.service; /** * TODO * * @author zhujiqian * @date 2023/3/16 09:38 **/ public interface DisposeService { public void export(String sourceFile, String sourceFileName); }

这里的sourceFile是包括文件后缀的字符串名,例如:“测试表格文件.xlsx”,用来读取文件内容。

sourceFileName是没有的文件后缀的字符串名,例如:“测试表格文件”,用来创建用于存放已经整理的文件的目录。

2、创建一个实现类DisposeServiceImpl:

package com.put.service.impl; import com.put.service.DisposeService; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import static com.put.utils.DateUtil.timeFormat; /** * TODO * * @author zhujiqian * @date 2023/3/16 16:40 **/ public class DisposeServiceImpl implements DisposeService { @Override public void export(String sourceFile,String sourceFileName) { System.out.println("开始整理"+sourceFileName+"文件"); try { FileInputStream file = new FileInputStream(sourceFile); XSSFWorkbook workbook = new XSSFWorkbook(file); //处理第一个sheet,若需要处理多个sheet,可以自行扩展 XSSFSheet sheet = workbook.getSheetAt(0); //移除表格第一列 removeCell(sheet,0); //移除表格第一列后,接着将原先第二列的数据往左边移动,即变成了第一列 sheet.shiftColumns(1,sheet.getRow(0).getLastCellNum(),-1); //表格最后一列往右移动一格 sheet.shiftColumns(sheet.getRow(0).getLastCellNum()-1,sheet.getRow(0).getLastCellNum(),1); //在倒数第二列地方新增一个表头标题 sheet.getRow(0).createCell(sheet.getRow(0).getLastCellNum() - 2).setCellValue("是否合格"); for(int i = 1; i{ service.export(sourceFile,sourceName); }).start(); } }

该方法里我用了多线程并发处理,因为各个文件的处理无任何依赖,若是大批量处理时,串行执行实在太慢,但多线程处理同时也会存在一个问题是,若大批量表格文件中每个文件数据量都很大的话,电脑内存太小的话,可能会出现内存溢出问题。

三、maven项目打成一个jar,然后编写一个可在windows运行的bat脚本。

image

拷贝最后一个auto-put-file-1.0-SNAPSHOT-jar-with-dependencies.jar到随意一个目录里,然后编写一个名字为start.bat脚本:

@echo off java -jar auto-put-file-1.0-SNAPSHOT-jar-with-dependencies.jar

将start.bat和auto-put-file-1.0-SNAPSHOT-jar-with-dependencies.jar放同一个目录里,然后将需要处理的Excel文件放到该目录下,点击start.bat即可运行。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3