Java实现Excel转Word:专业指南与代码示例

一、需求背景与技术选型

在企业级应用中,常需将Excel中的报表、数据清单转换为格式规范的Word文档。Java生态中有多种成熟方案可实现此功能:

  • Apache POI:功能全面,支持.xlsx和.xls格式,但操作较底层
  • docx4j:专注于Office Open XML文档操作,适合复杂排版
  • JXL:轻量级库,仅支持老版.xls格式

本文将以Apache POI + Apache POI-OOXML为例,演示如何保留Excel表格样式并生成结构化的Word文档。

二、环境配置与依赖引入

在Maven项目中添加以下依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-full</artifactId>
    <version>5.2.3</version>
</dependency>

三、核心转换代码实现

3.1 读取Excel文件

使用POI的Workbook接口读取Excel内容:

FileInputStream fis = new FileInputStream("input.xlsx");
Workbook workbook = WorkbookFactory.create(fis);
Sheet sheet = workbook.getSheetAt(0);

3.2 创建Word文档

构建XWPFDocument对象并创建表格:

XWPFDocument docxDocument = new XWPFDocument();
XWPFTable table = docxDocument.createTable(sheet.getLastRowNum()+1, sheet.getRow(0).getLastCellNum());

3.3 数据迁移与样式处理

遍历Excel单元格,设置Word表格内容:

for (int i = 0; i <= sheet.getLastRowNum(); i++) {
    Row excelRow = sheet.getRow(i);
    XWPFTableRow wordRow = table.getRow(i);
    for (int j = 0; j < excelRow.getLastCellNum(); j++) {
        Cell cell = excelRow.getCell(j);
        XWPFTableCell wordCell = wordRow.getCell(j);
        // 设置单元格文本
        wordCell.setText(cell.getStringCellValue());
        // 处理合并单元格(需额外逻辑)
    }
}

四、进阶功能扩展

  1. 样式同步:通过CellType获取单元格类型,使用CTP/CTTc操作底层XML保留字体、边框
  2. 公式转换:需要将Excel公式计算结果提取后再写入Word
  3. 图片嵌入:使用XWPFPictureData处理Excel中的图片资源

五、常见问题与优化建议

  • 内存溢出:处理大文件时采用SXSSFWorkbook流式读取
  • 编码问题:确保使用UTF-8处理中文内容
  • 格式丢失:复杂样式需操作OOXML底层XML结构

六、总结

通过Apache POI库,开发者可以灵活实现Excel到Word的转换。建议根据实际需求选择合适的技术方案,对于超大型文件可考虑分块处理策略。完整示例代码可通过Apache POI官方示例进一步参考。