学习笔记:POI导出word

以下是使用Apache POI导出Word文档的完整实现方案:


一、基础环境配置

  1. Maven依赖

    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>5.2.3</version>
    </dependency>
    
    • 需使用poi-ooxml模块支持.docx格式
  2. 文档对象模型

    • XWPFDocument:代表整个Word文档
    • XWPFParagraph:处理段落文本
    • XWPFTable:操作表格结构

二、核心实现方式

1. 基础文档生成
XWPFDocument doc = new XWPFDocument();
// 创建段落
XWPFParagraph p = doc.createParagraph();
XWPFRun run = p.createRun();
run.setText("Hello World");
// 输出文件
FileOutputStream out = new FileOutputStream("output.docx");
doc.write(out);
out.close();
  • 通过XWPFRun设置文本样式(字体、颜色等)
2. 模板替换方案
Map<String, String> data = new HashMap<>();
data.put("name", "张三");
data.put("date", "2025-05-23");

XWPFDocument doc = new XWPFDocument(new FileInputStream("template.docx"));
for (XWPFParagraph p : doc.getParagraphs()) {
  String text = p.getText();
  for (Map.Entry<String, String> entry : data.entrySet()) {
    text = text.replace("${" + entry.getKey() + "}", entry.getValue());
  }
  p.getRuns().get(0).setText(text, 0);
}
  • 需在模板中使用${key}作为占位符
3. 表格生成示例
XWPFTable table = doc.createTable(3, 2);
table.getRow(0).getCell(0).setText("姓名");
table.getRow(0).getCell(1).setText("年龄");
table.getRow(1).getCell(0).setText("李四");
table.getRow(1).getCell(1).setText("28");
  • 通过行列索引操作单元格内容

三、高级功能实现

  1. 样式控制

    XWPFRun run = p.createRun();
    run.setBold(true);
    run.setFontSize(14);
    run.setFontFamily("宋体");
    
    • 支持字体加粗、大小、颜色等属性设置
  2. 图片插入

    run.addPicture(inputStream, 
      XWPFDocument.PICTURE_TYPE_PNG, 
      "image.png", 
      Units.toEMU(200), 
      Units.toEMU(100));
    
    • 需指定图片类型(PNG/JPEG)和尺寸

四、方案对比

实现方式优点缺点
直接生成灵活控制所有元素代码复杂度高
模板替换快速实现格式保留需预先制作模板文件
POI-TL扩展库支持复杂模板语法需额外学习新API

五、常见问题处理

  1. 中文乱码

    • 确保模板文件编码为UTF-8
    • 输出时设置响应头:
      response.setContentType("application/msword;charset=UTF-8"); 
      
  2. 性能优化

    • 大数据量导出时采用分页处理
    • 复用XWPFDocument对象减少内存开销

以上方案可根据实际需求组合使用,建议复杂场景优先选择模板替换方案。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值