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。具体仓库地址可查阅相关文档站。版本方面建议参考更新日志选用合适的稳定版。
核心实现逻辑
整体思路分为三步:
- 使用 Document 类加载 Word 源文件
- 遍历文档中的段落和表格,分别提取内容
- 使用 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 调整为其他格式。