读取word中表格数据写入Excel中,并打包成可执行jar文件

354 阅读2分钟

「时光不负,创作不停,本文正在参加2022年中总结征文大赛

小白第一次发布文章,最近帮朋友开发工作上的一个小软件,提取word文档表格内容。 有些所获所得。

总体流程

  • 读取某文件夹下所有word文档
  • 读取word文档中表格数据,
  • 一个word文档中的表格数据,作为Excel表格中的一行,写入Excel中。
  • 打包成可运行Jar包,

对我这种小白来说, 难点还是蛮多的:

  1. 读取Word文档里面的表格内容;
  2. 把内容写入Excel文档;
  3. 打成可运行jar包;

项目很简单,先看一下项目结构

image.png

主要代码都在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插件打包