「时光不负,创作不停,本文正在参加2022年中总结征文大赛」
小白第一次发布文章,最近帮朋友开发工作上的一个小软件,提取word文档表格内容。 有些所获所得。
总体流程
- 读取某文件夹下所有word文档
- 读取word文档中表格数据,
- 一个word文档中的表格数据,作为Excel表格中的一行,写入Excel中。
- 打包成可运行Jar包,
对我这种小白来说, 难点还是蛮多的:
- 读取Word文档里面的表格内容;
- 把内容写入Excel文档;
- 打成可运行jar包;
项目很简单,先看一下项目结构
主要代码都在ReadWordFile类中。主要采用XWPFDocument来处理word文档, 主要利用
Iterator<XWPFTable> it = xwpf.getTablesIterator();
获取表格,然后迭代获取表格内容。 看一下主要方法,此方法主要是读取word表格中的内容,返回一个RealEstate对象,所有数据都存在该对象中
/**
* Read word文件内容
*
* @param path
* @return buffer
*/
public static RealEstate readWord(String filePath) {
RealEstate realEstate = new RealEstate();
try {
FileInputStream in = new FileInputStream(filePath);// 载入文档 //如果是office2007 docx格式
if (filePath.toLowerCase().endsWith("doc")) {
// word 2007 图片不会被读取, 表格中的数据会被放在字符串的最后
XWPFDocument xwpf = new XWPFDocument(in);// 得到word文档的信息
// List<XWPFParagraph> listParagraphs = xwpf.getParagraphs();//得到段落信息
Iterator<XWPFTable> it = xwpf.getTablesIterator();// 得到word中的表格
// 表格1
XWPFTable table = it.next();
List<XWPFTableRow> rows = table.getRows();
// 读取每一行数据
for (int i = 0; i < rows.size(); i++) {
XWPFTableRow row = rows.get(i);
// 读取每一列数据
List<XWPFTableCell> cells = row.getTableCells();
switch (i) {
case 1:
realEstate.setCode(cells.get(1).getText());
break;
case 3:
realEstate.setName(cells.get(1).getText());
break;
// 省略剩余case
}
}
// 表格2
XWPFTable table2 = it.next();
List<XWPFTableRow> rows2 = table2.getRows();
for (int x = 0; x < rows2.size(); x++) {
XWPFTableRow row2 = rows2.get(x);
// 读取每一列数据
List<XWPFTableCell> cells2 = row2.getTableCells();
switch (x) {
case 1:
realEstate.setArticle(cells2.get(1).getText());
break;
}
}
System.out.println(realEstate);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("读取表格内容失败!");
}
return realEstate;
}
看一下RealEstate类, 类中省略get/set等方法
import com.alibaba.excel.annotation.ExcelProperty;
public class RealEstate {
// 预编号
@ExcelProperty("预编号")
private String code;
// 权力人
@ExcelProperty("权力人")
private String name;
// 身份证
@ExcelProperty("身份证")
private String idNumber;
// 联系电话
@ExcelProperty("联系电话")
private String tel;
// 省略其余字段
}
类中关键在于用到了EasyExcel的@ExcelProperty() 注解设置表头。EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:github.com/alibaba/eas… 我们看一下写入表格的代码
public static void run(File file) {
// 初始化excel
ExcelWriterBuilder write = EasyExcel.write("result.xlsx", RealEstate.class);
ExcelWriterSheetBuilder sheet = write.sheet(0);
List<RealEstate> resList = new ArrayList<>();
File[] listFiles = file.listFiles();
for (int i = 0; i < listFiles.length; i++) {
File filepath = listFiles[i];
// System.out.println(filepath.toString());
RealEstate readWord = readWord(filepath.toString());
resList.add(readWord);
}
sheet.doWrite(resList);
}
EasyExcel.write() 传入两个参数一个是生成的excel文件路径, 一个是实体类类,返回一个ExcelWriterBuilder类型,ExcelWriterBuilder类型可以获取一个根据顺序,名称获取一个sheet页,从而来操作数据。最后sheet.doWrite()写入数据。
最后打包,在maven项目中,打包需要借助插件。 打包方式有多种
- 使用
maven-jar-plugin和maven-dependency-plugin插件 - 使用
maven-assembly-plugin插件 - 使用
maven-shade-plugin插件
下面采用的是maven-shade-plugin插件打包
<build>
<finalName>shange-0.0.1-SNAPSHOT</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<!-- 打包插件配置 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<!-- 指定启动类 -->
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>xyz.ganghua.shange.ShangeApplication</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
在eclipse中选中项目"Run as" -> "Maven build..." 在Goals中输入 "clean package", 点击Run运行。
小结:巩固了Java基础知识,利用XWPFDocument读取文档,EasyExcel写入Excel,maven-shade-plugin插件打包