使用Aspose和邮件合并域操作word,处理多级list嵌套实现多级列表导出

邮件域代码,定义邮件域代码,名称和你的实体类字段名称对应

其中的序号使用域代码里面的listNum,可以实现自动自动增长序号。不需要序号的可以不加,在列表中的级别就是几级序号  一级就是1.  二级就是1.1  三级就是1.1.1  以此类推。

最终实现效果就是下面这种

代码部分

    /**
     * 填充数据到word模板
     *
     * @param templatePath
     * @param targetPath
     * @param pramsModel
     * @param fileType
     */
    public static void fillWordDataByMap(Document doc, GenerateReviewTablePramsVO pramsModel) {
        try {
            DocumentBuilder builder = new DocumentBuilder(doc);

            Map<String, Object> data = getStringObjectMap(pramsModel);
            updateData(doc, builder, data);
            for (FileNameModel fileNameModel : pramsModel.getFileNameModelList()) {
                data = getStringObjectMap(fileNameModel);
                updateData(doc, builder, data);
                for (SheetNameModel sheetNameModel : fileNameModel.getSheetNameModelList()) {
                    data = getStringObjectMap(sheetNameModel);
                    updateData(doc, builder, data);
                    for (CellModel cellModel : sheetNameModel.getCellModelList()) {
                        data = getStringObjectMap(cellModel);
                        updateData(doc, builder, data);
                    }
                }
            }
            doc.getMailMerge().execute(new String[0], new String[0]);
            // 处理样式
            processingStyle(doc);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }



    /**
     * 将数据填入表格
     *
     * @param doc     文档对象
     * @param builder 文档builder
     * @param data    数据data
     * @throws Exception
     */
    private static void updateData(Document doc, DocumentBuilder builder, Map<String, Object> data) throws Exception {
        Map<String, String> toData = new HashMap<>();
        for (Map.Entry<String, Object> en : data.entrySet()) {
            String key = en.getKey();
            Object value = en.getValue();
            if (key == null || value == null) {
                continue;
            }
            if (value instanceof List) {
                //写入表数据
                DataTable dataTable = fillListData((List) value, key);
                doc.getMailMerge().executeWithRegions(dataTable);
            }

            if (value instanceof BufferedImage) {
                builder.moveToMergeField(key);
                builder.insertImage((BufferedImage) value);
            }

            String valueStr = String.valueOf(en.getValue());
            toData.put(key, valueStr);
        }

        String[] fieldNames = new String[toData.size()];
        String[] values = new String[toData.size()];
        int i = 0;
        for (Map.Entry<String, String> entry : toData.entrySet()) {
            fieldNames[i] = entry.getKey();
            values[i] = entry.getValue();
            i++;
        }
        //合并数据
        doc.getMailMerge().execute(fieldNames, values);
    }

   /**
     * 封装 list 数据到 word 模板中(word表格)
     *
     * @param list      数据
     * @param tableName 表格列表变量名称
     * @return word表格数据DataTable
     */
    private static DataTable fillListData(List<Object> list, String tableName) throws Exception {
        //创建DataTable,并绑定字段
        DataTable dataTable = new DataTable(tableName);
        if (list == null || list.size() == 0) {
            return dataTable;
        }
        Class<?> objClass = list.get(0).getClass();
        Field[] fields = objClass.getDeclaredFields();
        // 绑定表头字段
        for (int i = 0; i < fields.length; i++) {
            dataTable.getColumns().add(fields[i].getName());
        }
        for (Object obj : list) {
            //创建DataRow,封装该行数据
            DataRow dataRow = dataTable.newRow();
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), objClass);
                Method method = pd.getReadMethod();
                dataRow.set(i, method.invoke(obj));
            }
            dataTable.getRows().add(dataRow);
        }
        return dataTable;
    }

实体部分

package com.tj.pdf.model;

import com.tj.archive.dal.record.dto.TjRecordCoordinateDTO;
import lombok.Data;

import java.util.List;

/**
 * @author qixin
 * @date 2024/5/24
 */
@Data
public class GenerateReviewTablePramsVO {
    /**
     * 层级  几级审核
     */
    private String level;
    /**
     * 项目名称
     */
    private String projectName;
    /**
     * 项目所属期间开始
     */
    private String projectBelongStartTime;
    /**
     * 项目所属期间结束
     */
    private String projectBelongEndTime;
    /**
     * 项目负责人
     */
    private String managerUserName;
    /**
     * 项目审核人
     */
    private String auditUserName;
    /**
     * 审核时间
     */
    private List<AuditTime> auditTimeList;
    /**
     * 文件名称
     */
    private List<FileNameModel> fileNameModelList;
    /**
     * 复核记录坐标信息
     */
    private List<TjRecordCoordinateDTO> tjRecordCoordinateList;


}

package com.tj.pdf.model;

import lombok.Data;

import java.util.List;

@Data
public
class FileNameModel {

    private String fileName;

    List<SheetNameModel> sheetNameModelList;


}
package com.tj.pdf.model;

import com.tj.pdf.model.sign.CellModel;
import lombok.Data;

import java.util.List;

@Data
public class SheetNameModel {

    private String sheetName;

    private List<CellModel> cellModelList;

}
package com.tj.pdf.model.sign;

import com.tj.pdf.model.ContentModel;
import lombok.Data;

import java.util.List;

/**
 * @author qixin
 * @date 2024/5/28
 */
@Data
public class CellModel {

    private String cellContent;

    List<ContentModel> contentModelList;


}
package com.tj.pdf.model;

import lombok.Data;

@Data
public class ContentModel {

    private String content;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值