邮件域代码,定义邮件域代码,名称和你的实体类字段名称对应
其中的序号使用域代码里面的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;
}