参考链接:
https://blog.csdn.net/weixin_47215296/article/details/125149487
上面的文章已经说明了使用方法,我再说下我使用的经历。我们在使用Java EasyWord导出word的时候多行数据无法正确导出,解决方案如下,请参考
maven依赖
<dependency>
<groupId>com.sushengren</groupId>
<artifactId>easyword</artifactId>
<version>1.1.5</version>
</dependency>
模板生成
模板生成变量的插入有两种方式:
花括号加变量名,例如:{title}。我在实际使用过程中,发现这种方式有时候会插入失败,不知道什么原因。
在word中用书签的方式插入
这里我重点说一下,对于有表格导出需求的文档模板怎么设置。
1.单一表格。先在你的word文档中,加入表格,包含表头和一行tr。表格的样式你可以随意设置,最主要的是下面的一行tr,选中并给它一个书签(不要选择表头),书签名称就是你实体类中@WordProperty注解的内容,后面测试代码中可以很清楚的看到。表格行设置完成之后,再来设置单元格,单元格里面用花括号加上行的书签名称,下划线,单元格名称。
我使用的时候遇到过表格只能展示一行的情况,可以这么操作,在插入行书签的时候,先选择两行,插入完书签之后删掉最后一行。
2.多个表格。先创建表格,选中你想循环创建表格的内容,并给上书签。
然后选择表格行再加上书签。
这是我测试的整体模板,以及最终的效果展示,供大家参考。
测试代码
import com.sushengren.easyword.EasyWord;
import com.sushengren.easyword.annotation.WordProperty;
import com.sushengren.easyword.converters.PictureConverter;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
public class TestWord {
/**
* 标题
*/
@WordProperty("title")
private String title;
/**
* 水果列表
*/
@WordProperty("水果列表")
private List<FruitTable> fruitTables;
/**
* 商品列表
*/
@WordProperty("商品列表")
private List<CommodityTable> commodityTables;
/**
* 图片
*/
@WordProperty(value = "logo", converter = PictureConverter.class)
private InputStream logo;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class FruitTable {
/**
* 名称
*/
@WordProperty("名称")
private String name;
/**
* 来源
*/
@WordProperty("来源")
private String source;
/**
* 单价
*/
@WordProperty("单价")
private Double price;
/**
* 描述
*/
@WordProperty("描述")
private String desc;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class CommodityTable {
/**
* 商品类别
*/
@WordProperty("商品类别")
private String type;
/**
* 商品说明
*/
@WordProperty("商品说明")
private String desc;
/**
* 类别列表
*/
@WordProperty("类别列表")
private List<CategoryTable> categoryTable;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class CategoryTable {
/**
* 名称
*/
@WordProperty("名称")
private String name;
/**
* 来源
*/
@WordProperty("来源")
private String source;
/**
* 单价
*/
@WordProperty("单价")
private Double price;
/**
* 描述
*/
@WordProperty("描述")
private String desc;
}
public static void main(String[] args) throws FileNotFoundException {
List<FruitTable> fruitTables = new ArrayList<>();
FruitTable f1 = new FruitTable("苹果", "烟台", 5.0, "又红又大的苹果。");
fruitTables.add(f1);
FruitTable f2 = new FruitTable("芒果", "海南", 8.0, "好吃不贵的芒果。");
fruitTables.add(f2);
FruitTable f3 = new FruitTable("柑橘", "宜昌", 2.5, "好一个柑橘。");
fruitTables.add(f3);
List<CategoryTable> categoryTables1 = new ArrayList<>();
CategoryTable a1 = new CategoryTable("芭蕉", "火焰山", 6.5, "烈日炎炎,芭蕉冉冉。");
categoryTables1.add(a1);
CategoryTable a2 = new CategoryTable("樱桃", "泰安", 25.0, "红了樱桃,绿了芭蕉。");
categoryTables1.add(a2);
List<CommodityTable> commodityTables = new ArrayList<>();
CommodityTable c1 = new CommodityTable("水果", "这是一批水果", categoryTables1);
commodityTables.add(c1);
List<CategoryTable> categoryTables2 = new ArrayList<>();
CategoryTable a3 = new CategoryTable("空调", "小行星", 2800.0, "全靠空调续命。");
categoryTables2.add(a3);
CategoryTable a4 = new CategoryTable("热水器", "哈哈哈", 1525.0, "零冷水。");
categoryTables2.add(a4);
CommodityTable c2 = new CommodityTable("家电", "这是一堆家电", categoryTables2);
commodityTables.add(c2);
TestWord testWord = TestWord.builder()
.title("这是一个word导出测试")
.fruitTables(fruitTables)
.commodityTables(commodityTables)
.logo(new FileInputStream("D:\\Temp\\ai.png"))
.build();
File file = new File("D:\\Temp\\title.docx");
FileOutputStream out = new FileOutputStream("D:\\Temp\\测试.docx");
EasyWord.of(file).doWrite(testWord).toOutputStream(out);
}
}
写在最后
我使用的时候遇到一些问题:
1.插入的段落中如果有“回车”,那么这个段落的最后会自动加上一个回车。
这是没有回车的,导出来很正常
如果我加上回车,就会看到导出的段落最后莫名的多了一个换行,这算是一个小坑吧。
2.有图片书签,但是没有插入图片时报错问题。
解决思路
对于上述两个问题,我是直接覆盖了源代码,供大家参考。
原文链接:https://blog.csdn.net/weixin_41776616/article/details/128564791