Apache POI方案(原生操作,灵活性强)
原理:通过Java API直接操作Word文档结构
适用场景:动态生成复杂格式文档(表格、图片、样式调整)
步骤:
-
添加Maven依赖:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency>
-
基础代码示例(生成.docx):
import org.apache.poi.xwpf.usermodel.*; public class PoiExport { public static void main(String[] args) throws Exception { // 1. 创建文档对象 XWPFDocument doc = new XWPFDocument(); // 2. 添加标题 XWPFParagraph title = doc.createParagraph(); title.setAlignment(ParagraphAlignment.CENTER); XWPFRun titleRun = title.createRun(); titleRun.setText("用户报告"); titleRun.setBold(true); titleRun.setFontSize(16); // 3. 添加表格(2行3列) XWPFTable table = doc.createTable(2, 3); table.getRow(0).getCell(0).setText("姓名"); table.getRow(0).getCell(1).setText("年龄"); table.getRow(0).getCell(2).setText("职业"); table.getRow(1).getCell(0).setText("张三"); table.getRow(1).getCell(1).setText("28"); table.getRow(1).getCell(2).setText("工程师"); // 4. 输出文件 FileOutputStream out = new FileOutputStream("report.docx"); doc.write(out); out.close(); } }
优点:精细控制文档元素
缺点:代码量大,样式需手动配置
Freemarker模板方案(数据驱动,高效批处理)
原理:将Word文档转为XML模板,动态填充数据
适用场景:固定格式文档批量生成(如合同、证书)
步骤:
-
准备模板文件:
- 用Word创建模板并另存为 XML文件(.ftl)
- 在占位符使用
${variable}
语法(如${userName}
)
-
添加依赖:
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.32</version> </dependency>
-
Java处理代码:
import freemarker.template.Configuration; import freemarker.template.Template; import java.io.*; import java.util.HashMap; import java.util.Map; public class FtlExport { public static void main(String[] args) throws Exception { // 1. 配置模板目录 Configuration cfg = new Configuration(Configuration.VERSION_2_3_32); cfg.setDirectoryForTemplateLoading(new File("/templates")); // 2. 加载模板文件 Template template = cfg.getTemplate("contract.ftl"); // 3. 准备动态数据 Map<String, Object> data = new HashMap<>(); data.put("userName", "李四"); data.put("signDate", "2025-10-15"); // 4. 生成Word文档 FileOutputStream out = new FileOutputStream("contract.docx"); Writer writer = new OutputStreamWriter(out, "UTF-8"); template.process(data, writer); writer.close(); } }
优点:解耦设计与代码,维护简单
缺点:复杂样式需调整XML结构
iText RTF方案(轻量级文本导出)
原理:通过RTF格式生成基础Word文档
适用场景:纯文本内容快速导出(无需复杂格式)
代码片段:
import com.lowagie.text.Document; import com.lowagie.text.Paragraph; import com.lowagie.text.rtf.RtfWriter2; public class RtfExport { public static void main(String[] args) throws Exception { Document doc = new Document(); RtfWriter2.getInstance(doc, new FileOutputStream("output.rtf")); doc.open(); doc.add(new Paragraph("简易报告内容")); doc.close(); } }
注意:RTF兼容性有限,非.docx标准格式
方案对比与选型建议
方案 | 适用场景 | 开发效率 | 格式支持 |
---|---|---|---|
Apache POI | 动态复杂文档 | 低 | |
Freemarker | 模板化批量生成 | 高 | |
iText (RTF) | 纯文本快速导出 | 极高 |
推荐选择:
- 企业级应用:优先用 Freemarker(维护成本低)
- 高度定制化需求:选择 Apache POI(灵活性高)
- 避免处理旧版
.doc
格式(POI对doc支持不完善)
避坑指南
- 中文乱码:
- POI设置字体:
run.setFontFamily("宋体")
- Freemarker模板用UTF-8编码
- POI设置字体:
- 文档损坏:
确保操作完成后调用doc.close()
和out.close()
- 性能优化:
批量导出时用SXSSFWorkbook
(POI流式API)
引用说明:
- Apache POI官方文档:https://poi.apache.org/
- Freemarker手册:https://freemarker.apache.org/
- 微软OpenXML标准:ECMA-376
本文代码基于JDK 1.8验证,请确保使用推荐依赖版本
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/40241.html