1、 引入easypoi和poi依赖
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
maven版本按需更新即可
2、创建word数据模板 test.docx
3、将写好的模板放入项目中
这里将写好的模板放入项目的/resource/template/test.docx中
4、编写java代码
4.1 准备测试类Goods
@Data
public class Goods {
private String no;
private String itemName;
private String unitPriceCurrency;
private Integer quantity;
private BigDecimal unitPrice;
}
4.2 准备Goods测试数据
// 模拟填充商品表数据,该数据可能来自于数据库或其他地方
private List<Goods> getGoodsList() {
List<Goods> goodsList = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 10; i++) {
Goods goods = new Goods();
goods.setNo(i + "");
goods.setItemName("商品名称"+i);
goods.setQuantity(random.nextInt(10));
goods.setUnitPrice(new BigDecimal(random.nextInt(10)));
goods.setUnitPriceCurrency("RMB");
goodsList.add(goods);
}
return goodsList;
}
4.3 导出word表格逻辑代码
@RequestMapping("/exportWord")
public void exportWord(HttpServletResponse response) {
// 1 设置编码格式、文件名称
response.setCharacterEncoding("utf-8");
String contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
String fileName = "测试导出word.docx";
response.setContentType(contentType);
try {
fileName = URLEncoder.encode(fileName, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName);
Map<String, Object> map = new HashMap<>();
// 1.基本属性填充
map.put("attr1", "属性1");
map.put("attr2", "属性2");
map.put("attr3", "属性3");
map.put("attr4", "属性4");
map.put("attr5", "属性5");
map.put("attr6", "属性6");
map.put("attr7", "属性7");
map.put("attr8", "属性8");
// 2.商品详情列表填充
List<Map<String, Object>> goodsWordList = new ArrayList<>();
List<Goods> goodsList = getGoodsList();
DecimalFormat df = new DecimalFormat("0.00");
BigDecimal allTotalValue = new BigDecimal(BigInteger.ZERO);
for (Goods goods : goodsList) {
Map<String,Object> goodsMap = new HashMap<>();
// 序号
goodsMap.put("no",goods.getNo());
// 名称
goodsMap.put("itemName",goods.getItemName());
// 货币单位
goodsMap.put("unitPriceCurrency",goods.getUnitPriceCurrency());
// 数量
Integer quantity = goods.getQuantity();
goodsMap.put("quantity", quantity);
// 单价
BigDecimal unitPrice = goods.getUnitPrice();
goodsMap.put("unitPrice", df.format(unitPrice));
// 总价
BigDecimal totalValue = unitPrice.multiply(new BigDecimal(quantity));
goodsMap.put("totalValue",df.format(totalValue));
// 最终总价
allTotalValue = allTotalValue.add(totalValue);
goodsWordList.add(goodsMap);
}
map.put("allTotalPrice", df.format(allTotalValue));
map.put("goods", goodsWordList);
// 导出word
String location = "/template/test.docx";
try {
XWPFDocument document = new MyXWPFDocument(Objects.requireNonNull(this.getClass().getResourceAsStream(location)));
// 读取模板
WordExportUtil.exportWord07(document, map);
document.write(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
5、运行项目,查看导出结果
6、说明
1)模板test.docx中的{{ }}插值表达式属性名与结果map中属性名保持一致
2)模板test.docx中的列表循环采用{{$fe:goods t}},
格式必须是:{{$fe:xxx t}}格式,其中:goods是map中的goods集合
至此,java导出word表格功能完成,小伙伴快去动手试试吧!!!