package com.csw.springbootfileupDown.documentFilling;
import cn.afterturn.easypoi.cache.manager.POICacheManager;
import cn.afterturn.easypoi.word.WordExportUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.springframework.core.io.ClassPathResource;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 其他类型
* 通过Java实现在Word中创建可填充表单_java_脚本之家 https://www.jb51.net/article/278553.htm
* https://wenda.so.com/q/1685399461211766
* 字体尺寸对照表
*
* 于 {{}}如果左右在段落中间,前后最好要加空格,不然有些会识别不出来
* 特殊换行线不支持要输假换行线,或者自己手动重新设置换行线
* 右边对齐要选右边对齐
* 如果还无法填充就打断点
*/
public class WordDocumentFillerEasyPoi {
public static void main(String[] args) {
try {
// // 加载模板文件-本地
// FileInputStream templateFile = new FileInputStream("C:\\Users\\Admin\\Desktop\\统计表.docx");
// XWPFDocument document = new XWPFDocument(templateFile);
// 创建一个数据映射,用于替换模板中的占位符
Map<String, Object> dataMap = new HashMap<>();
//单个字段替换
dataMap.put("projectName", "新东方项目");
dataMap.put("order", "123454312");
//单行[段落]重复填充对对齐
String planContent = "";
for (int i = 0; i < 3; i++) {
String a1 = numberToChinese(i + 1);
String a2 = "将根据" + i;
String b1 = "发帖hi别扭uwi临潼预防天天顾客ii哦iu给预热而退i金鸡湖一股hi就uiuu由于uuuuu 的发帖hi别扭uwi临潼预防天天顾客ii哦iu给预热而退i金鸡湖一股hi就uiuu由于uuuuu 的发帖hi别扭uwi临潼预防天天顾客ii哦iu给预热而退i金鸡湖一股hi就uiuu由于uuuuu 的发帖hi别扭uwi临潼预防天天顾客ii哦iu给预热而退i金鸡湖一股hi就uiuu由于uuuuu 的发帖hi别扭uwi临潼预防天天顾客ii哦iu给预热而退i金鸡湖一股hi就uiuu由于uuuuu 的";
String xzxx = "(" + a1 + ")" + a2 + "\r\n" + " " + b1 + "\r\n";
if (StringUtils.isEmpty(planContent)) {
planContent = planContent + xzxx;
} else {
planContent = planContent + " " + xzxx;
}
}
//分组多行同时缩进插入
String groupMember = "";
dataMap.put("moreLine", planContent);
for (int i = 0; i < 3; i++) {
String a1 = "数据库" + i;
String a2 = "囧很尴尬" + i;
String xzxx = "" + a1 + " " + a2 + "\r\n ";
groupMember = groupMember + xzxx;
}
dataMap.put("groupMember", groupMember);
dataMap.put("name", "张三");
dataMap.put("sex", "男");
dataMap.put("age", "22");
// 添加更多的数据映射...
//查询员工家庭信息
List<Map<String, String>> menberlist = new ArrayList<>();
for (int i = 1; i < 3; i++) {
Map<String, String> map = new HashMap();
map.put("姓名", "小王" + i);
map.put("称呼", "称呼" + i);
map.put("生日", "1962年10月2日" + i);
menberlist.add(map);
}
dataMap.put("menberlist", menberlist);
//从项目读取路径
XWPFDocument doc = WordExportUtil.exportWord07(new ClassPathResource("统计表EasyPoi.docx").getPath(), dataMap);
// 获取表格
List<XWPFTable> tables = doc.getTables();
XWPFTable table = tables.get(0); // 假设我们要操作的是文档中的第一个表格
// 假设我们从Excel中读取数据
// 这里只是示例,你需要实现你的数据读取逻辑
String[][] data = {{"交公积金", "工具", "叫哦"}, {"uiu路", "意图偶哦ii", "右腿哦哦"}, {"与iinn你", "uyii", "投入以哦"}};
// 遍历数据填充表格
for (int i = 0; i < data.length; i++) {
XWPFTableRow row = table.getRow(i + 2); // 获取或创建行
if (row == null) {
row = table.createRow();
}
for (int j = 0; j < data[i].length; j++) {
XWPFTableCell cell = row.getCell(j);
if (cell == null) {
cell = row.createCell();
}
cell.setText(data[i][j]); // 设置单元格的文本
// 获取或创建单元格
List<XWPFParagraph> paragraphs = cell.getParagraphs();
List<XWPFRun> runs = paragraphs.get(0).getRuns();
XWPFRun run = runs.get(0);
// 设置字体样式
run.setBold(true); // 加粗
run.setFontSize(16); // 设置字体大小为20
run.setFontFamily("微软雅黑");
//run.setUnderline(UnderlinePatterns.SINGLE); // 下划线
}
}
//插入图片
// 遍历文档中的所有段落
setValue(doc.getParagraphs(), null);
// //生产
// try (XWPFDocument doc = WordExportUtil.exportWord07(new ClassPathResource("统计表EasyPoi.docx").getPath(), dataMap);) {
// String fileName = vo.getOrgName() + "的函.docx";
// response.setHeader("content-Type", "application/force-download");
// response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// response.setCharacterEncoding("UTF-8");
// doc.write(response.getOutputStream());
// } catch (Exception e) {
// e.printStackTrace();
// }
// 保存填充后的文档-本地
String path = "C:\\Users\\csw222\\Desktop\\统计表-2.docx";
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream outputFile = new FileOutputStream(file);
doc.write(outputFile);
outputFile.close();
System.out.println("文档填充完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
public static String numberToChinese(int num) {
String[] CN_NUMERIC = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
String[] CN_NUMERIC_UNITS = {"", "十", "百", "千"};
if (num == 0) {
return CN_NUMERIC[0];
}
StringBuilder sb = new StringBuilder();
int unit = 0;
while (num > 0) {
int digit = num % 10;
if (digit != 0) {
sb.insert(0, CN_NUMERIC[digit] + CN_NUMERIC_UNITS[unit]);
} else {
if (sb.length() > 0 && sb.charAt(0) != CN_NUMERIC[0].charAt(0)) {
sb.insert(0, CN_NUMERIC[0]);
}
}
num /= 10;
unit++;
}
return sb.toString();
}
private static void setValue(List<XWPFParagraph> list, Map<String, Object> dataMap) throws Exception {
for (XWPFParagraph paragraph : list) {
// 替换段落中的占位符
for (XWPFRun run : paragraph.getRuns()) {
String text = run.getText(0);
//整体吧图片:设置为html预设格式
if (text.equals("图片:")) {
int width = Units.pixelToEMU(100); // 设置图片宽度
int height = Units.pixelToEMU(100); // 设置图片高度
run.addPicture(POICacheManager.getFile(new ClassPathResource("盖章.png").getPath()), XWPFDocument.PICTURE_TYPE_PNG, "image.png", Units.toEMU(200), Units.toEMU(200));
}
}
}
}
// /**
// * @param table 表格
// * @param headerRow 标题行
// * @param styleRow 样式行
// * @param rowIndex 要插入的位置
// * @param map 数据
// */
// public static void CopyData(XWPFTable table, XWPFTableRow headerRow, XWPFTableRow styleRow, int rowIndex, Map<String, String> map) {
// // 在表格指定位置新增一行
// XWPFTableRow targetRow = table.insertNewTableRow(rowIndex);
// // 复制行属性(样式行)
// targetRow.getCtRow().setTrPr(styleRow.getCtRow().getTrPr());
// //标题行
// List<XWPFTableCell> headerCellList = headerRow.getTableCells();
// if (null == headerCellList) {
// return;
// }
// // 复制列及其属性和内容
// XWPFTableCell targetCell = null;
// for (int i = 0; i < headerCellList.size(); i++) {
// //标题行单元格
// XWPFTableCell headerCell = headerCellList.get(i);
// XWPFTableCell styleCell = styleRow.getTableCells().get(i);
// targetCell = targetRow.addNewTableCell();
//
// // 列属性
// targetCell.getCTTc().setTcPr(styleCell.getCTTc().getTcPr());
// // 段落属性
// if (styleCell.getParagraphs() != null && styleCell.getParagraphs().size() > 0) {
// styleCell.getParagraphs().get(0).getCTP().setPPr(styleCell.getParagraphs().get(0).getCTP().getPPr());
// if (styleCell.getParagraphs().get(0).getRuns() != null && styleCell.getParagraphs().get(0).getRuns().size() > 0) {
// XWPFRun cellR = targetCell.getParagraphs().get(0).createRun();
// targetCell.setText(map.get(headerCell.getText()));
// cellR.setBold(styleCell.getParagraphs().get(0).getRuns().get(0).isBold());
// } else {
// targetCell.setText(map.get(headerCell.getText()));
// }
// } else {
// targetCell.setText(map.get(headerCell.getText()));
// }
// }
// }
}
word文档填充easypoi
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...