Java EasyWord导出word文档

参考链接:

https://blog.csdn.net/weixin_47215296/article/details/125149487

上面的文章已经说明了使用方法,我再说下我使用的经历。

maven依赖


    com.sushengren
    easyword
    1.1.5

模板生成

模板生成变量的插入有两种方式:

  1. 花括号加变量名,例如:{title}。我在实际使用过程中,发现这种方式有时候会插入失败,不知道什么原因。
  2. 在word中用书签的方式插入Java EasyWord导出word文档_第1张图片

这里我重点说一下,对于有表格导出需求的文档模板怎么设置。

1.单一表格。先在你的word文档中,加入表格,包含表头和一行tr。表格的样式你可以随意设置,最主要的是下面的一行tr,选中并给它一个书签(不要选择表头),书签名称就是你实体类中@WordProperty注解的内容,后面测试代码中可以很清楚的看到。表格行设置完成之后,再来设置单元格,单元格里面用花括号加上行的书签名称,下划线,单元格名称。

Java EasyWord导出word文档_第2张图片

我使用的时候遇到过表格只能展示一行的情况,可以这么操作,在插入行书签的时候,先选择两行,插入完书签之后删掉最后一行。Java EasyWord导出word文档_第3张图片

2.多个表格。先创建表格,选中你想循环创建表格的内容,并给上书签。

Java EasyWord导出word文档_第4张图片

然后选择表格行再加上书签。

Java EasyWord导出word文档_第5张图片

这是我测试的整体模板,以及最终的效果展示,供大家参考。

Java EasyWord导出word文档_第6张图片

 Java EasyWord导出word文档_第7张图片

测试代码

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 fruitTables;
    /**
     * 商品列表
     */
    @WordProperty("商品列表")
    private List 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;
    }

    @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 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 categoryTables1 = new ArrayList<>();
        CategoryTable a1 = new CategoryTable("芭蕉", "火焰山", 6.5, "烈日炎炎,芭蕉冉冉。");
        categoryTables1.add(a1);
        CategoryTable a2 = new CategoryTable("樱桃", "泰安", 25.0, "红了樱桃,绿了芭蕉。");
        categoryTables1.add(a2);
        List commodityTables = new ArrayList<>();
        CommodityTable c1 = new CommodityTable("水果", "这是一批水果", categoryTables1);
        commodityTables.add(c1);

        List 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.插入的段落中如果有“回车”,那么这个段落的最后会自动加上一个回车。

这是没有回车的,导出来很正常

Java EasyWord导出word文档_第8张图片Java EasyWord导出word文档_第9张图片

 如果我加上回车,就会看到导出的段落最后莫名的多了一个换行,这算是一个小坑吧。

Java EasyWord导出word文档_第10张图片Java EasyWord导出word文档_第11张图片

2.有图片书签,但是没有插入图片时报错问题。

解决思路

对于上述两个问题,我是直接覆盖了源代码,供大家参考。

Java EasyWord导出word文档_第12张图片

Java EasyWord导出word文档_第13张图片 

 

 

你可能感兴趣的:(Java,java,word,开发语言)