Java 中 Word 文档转 Excel 的技术实践

Word 与 Excel 是日常开发中常见的两种文档格式,前者侧重文字处理与排版,后者侧重数据计算与分析。在某些业务场景下——例如需要提取 Word 文档中的表格数据进行分析,或将报告内容迁移至电子表格——会涉及 Word 到 Excel 的转换需求。本文将对这一技术场景进行梳理,并给出基于第三方库的实现方案。

转换的前提与适用边界

需要先明确一点:Word 与 Excel 的渲染逻辑差异较大。Word 文档中可能包含复杂的段落排版、嵌套表格、图片和分页结构,这些元素在 Excel 中很难原样呈现。因此,直接"原封不动"地将任意 Word 文档转为 Excel 并非一个合理的目标。

较为务实的场景是:Word 文档的主要内容为表格数据,目标是将这些表格导出到 Excel 中以便分析处理。如果文档是表格与文字段落混合,也可以按先后顺序将段落写入单元格、将表格进行逐格映射。本文的实现即基于这一思路。

技术方案概述

Java 生态中可用的路线主要有以下几种:

  • LibreOffice 命令行调用:免费且格式兼容性稳定,但需要在服务器上安装完整套件,进程管理和并发控制需自行处理。
  • Apache POI 底层操作:通过解析 Word 文档的 XML 结构来提取内容,再用 XSSFWorkbook 写入 Excel。灵活性高,但编码量大,对外提供的能力偏底层。
  • 商业文档处理库:如 Spire.Doc for Java 等,以 jar 包形式引入,无需在服务器上安装办公套件。

本文选用第三种方式进行演示,使用 Spire.Doc for Java 进行 Word 文档的读取与内容提取,配合 Spire.XLS for Java 完成 Excel 工作簿的创建与数据写入。

环境配置

在 pom.xml 中添加所需依赖。以引入 Spire.Office 为例,该依赖包含 Document 和 Spreadsheet 两个模块:

<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.office</artifactId>
        <version>11.3.0</version>
    </dependency>
</dependencies>

如仅需 Word 处理能力,也可单独引入 spire.doc。具体仓库地址可查阅相关文档站。版本方面建议参考更新日志选用合适的稳定版。

核心实现逻辑

整体思路分为三步:

  1. 使用 Document 类加载 Word 源文件
  2. 遍历文档中的段落和表格,分别提取内容
  3. 使用 Workbook 类创建 Excel 工作簿,将提取的内容逐条写入单元格

以下是代码示例:

import com.spire.doc.*;
import com.spire.doc.documents.Paragraph;
import com.spire.xls.*;

public class WordToExcelConverter {

    public static void main(String[] args) {
        // 加载 Word 文档
        Document doc = new Document();
        doc.loadFromFile("input.docx");

        // 创建工作簿
        Workbook wb = new Workbook();
        wb.getWorksheets().clear();
        Worksheet sheet = wb.createEmptySheet("WordToExcel");

        int row = 1;
        int column = 1;

        // 遍历 Word 文档中的节
        for (int i = 0; i < doc.getSections().getCount(); i++) {
            Section section = doc.getSections().get(i);

            // 遍历节中的子对象
            for (int j = 0; j < section.getBody().getChildObjects().getCount(); j++) {
                DocumentObject obj = section.getBody().getChildObjects().get(j);

                if (obj instanceof Paragraph) {
                    // 段落:直接写入指定单元格
                    Paragraph para = (Paragraph) obj;
                    sheet.getCellRange(row, column).setText(para.getText());
                    row++;
                }

                if (obj instanceof Table) {
                    // 表格:逐行逐格写入
                    Table table = (Table) obj;
                    row = exportTable(sheet, row, table);
                }
            }
        }

        // 自动调整列宽和行高
        sheet.getAllocatedRange().autoFitColumns();
        sheet.getAllocatedRange().autoFitRows();

        // 保存 Excel 文件
        wb.saveToFile("output.xlsx", ExcelVersion.Version2013);
    }

    private static int exportTable(Worksheet sheet, int startRow, Table table) {
        int row = startRow;
        for (int i = 0; i < table.getRows().getCount(); i++) {
            TableRow tbRow = table.getRows().get(i);
            for (int j = 0; j < tbRow.getCells().getCount(); j++) {
                TableCell cell = tbRow.getCells().get(j);
                String cellText = extractCellText(cell);
                sheet.getCellRange(row, j + 1).setText(cellText);
            }
            row++;
        }
        return row;
    }

    private static String extractCellText(TableCell cell) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < cell.getChildObjects().getCount(); i++) {
            DocumentObject obj = cell.getChildObjects().get(i);
            if (obj instanceof Paragraph) {
                Paragraph p = (Paragraph) obj;
                if (sb.length() > 0) sb.append("\n");
                sb.append(p.getText());
            }
        }
        return sb.toString();
    }
}

上述代码演示了基础的内容提取与写入流程。如果业务中需要保留字体、颜色、对齐方式等格式信息,可以通过 TextRange 对象获取字符格式属性,再映射到 Excel 的富文本设置上。

几个值得注意的细节

格式保真度有限。前述提到过,Word 排版和 Excel 布局存在本质差异。段落样式、首行缩进、页眉页脚等元素无法在 Excel 中还原。如果转换质量要求极高,建议先评估源文档的结构复杂度。

表格单元格可能包含多段内容。Word 表格的单元格可以容纳多个段落。在代码中已用换行符处理这种情况,实际使用时可根据业务需求调整拼接方式。

性能考虑。对于页数较多的 Word 文档,逐段遍历的耗时通常在可接受范围内,但表格密集的文档建议关注循环中的对象调用次数。批量转换场景中可复用 Workbook 实例,并在完成后及时释放资源。

字体与中文支持。如果 Excel 输出中出现中文乱码,通常与运行环境的字体配置相关。Linux 服务器需确保安装了对应的中文字体包。

适用场景评估

以下类型的需求比较适合使用本文方案:

  • Word 文档中的表格数据需要导入 Excel 做进一步统计或分析
  • 需要将混合内容的 Word 报告转为结构化的 Excel 工作表
  • 服务器环境不允许安装 Office 或 LibreOffice 套件,希望通过纯 jar 包完成转换

以下场景则建议谨慎评估或采用其他方案:

  • Word 文档以纯文字段落为主,不含表格——转为 Excel 的意义有限,转为 PDF 可能更合适
  • 源文档排版极其复杂,包含大量分栏、图文混排等结构——Excel 难以承载这类内容
  • 对输出格式有严格一致性要求——自动化转换可能无法达到人工排版的效果

小结

本文记录了一次 Word 转 Excel 的技术实现过程。从结果来看,对于以表格数据为主的 Word 文档,段落遍历加单元格映射的方式能够完成基本的内容迁移;但对于排版复杂的文档,转换后的 Excel 在结构还原上存在明显局限。在实际项目中,是否采用这一方案,取决于源文档的内容特征——如果文档本身以结构化表格为核心,该方案具备可行性;如果文档以自由排版为主,可能需要重新评估转换的必要性,或考虑将输出目标从 Excel 调整为其他格式。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容