word文档填充easypoi

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()));
//            }
//        }
//    }


}
aaa.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350