POI在WORD中任意处多次插入文字和表格


import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.xmlbeans.XmlCursor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import java.io.*;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;

@Slf4j
public class PoiWordUtil {

    /**
     * 添加标题和表格
     *
     * @param key          需要替换的key
     * @param document     文档
     * @param tableTreeMap TreeMap<标题, List<List<内容>>>
     * @param titleStyle   标题格式
     * @param tableStyle   内容格式
     */
    public static void addTitleTable(String key, XWPFDocument document, TreeMap<String, List<List<String>>> tableTreeMap, FontStyle titleStyle, FontStyle tableStyle) {
        log.info("tableTreeMap:{}", JSONUtilPlus.parseToString(tableTreeMap));
        List<String> tableKeyList = new ArrayList<>(tableTreeMap.keySet());
        CollectionUtilPlus.reverse(tableKeyList);
        List<XWPFParagraph> paragraphList = document.getParagraphs();
        if (paragraphList != null && paragraphList.size() > 0) {
            for (int l = 0; l < paragraphList.size(); l++) {
                XWPFParagraph paragraph = paragraphList.get(l);
                List<XWPFRun> runs = paragraph.getRuns();
                for (int i = 0; i < runs.size(); i++) {
                    // String text = runs.get(i).getText(0).trim();
                    String text = null;
                    if (runs.get(i) != null && StringUtilPlus.isNotBlank(runs.get(i).getText(0))) {
                        text = runs.get(i).getText(0).trim();
                    }
                    if (text != null) {
                        if (text.indexOf(key) >= 0) {
                            runs.get(i).setText(text.replace(key, ""), 0);
                            // 在指定游标位置插入表格
                            for (String name : tableKeyList) {
                                //填文字
                                XmlCursor cursor111 = paragraph.getCTP().newCursor();
                                XWPFParagraph xwpfParagraph = document.insertNewParagraph(cursor111);
                                XWPFRun run = xwpfParagraph.createRun();
                                run.addCarriageReturn();
                                run.setText(name);
                                addRunStyle(run, titleStyle);

                                //填表格
                                XmlCursor cursor = paragraph.getCTP().newCursor();
                                XWPFTable table = document.insertNewTbl(cursor);
                                CTTblPr tablePr = table.getCTTbl().getTblPr();
                                CTTblWidth width = tablePr.addNewTblW();
                                width.setW(BigInteger.valueOf(8500));
                                List<List<String>> listListString = tableTreeMap.get(name);
                                insertInfo(table, listListString, tableStyle);
                            }
                            break;
                        }
                    }
                }
            }
        }
    }

    /**
     * 添加格式
     *
     * @param run        run
     * @param titleStyle 样式
     */
    private static void addRunStyle(XWPFRun run, FontStyle titleStyle) {
        if (titleStyle.getFontFamily() != null) {
            run.setFontFamily(titleStyle.getFontFamily().getValue());
        }
        if (titleStyle.getFontSize() != null) {
            run.setFontSize(titleStyle.getFontSize());
        }
    }

    /**
     * 添加表格
     *
     * @param table          表格
     * @param listListString 数据
     * @param tableStyle     样式
     */
    private static void insertInfo(XWPFTable table, List<List<String>> listListString, FontStyle tableStyle) {
        if (listListString.size() < 1) {
            return;
        }
        //创建表
        XWPFTable tab = table;
        tab.setWidthType(TableWidthType.PCT);
        for (int i = 0; i < listListString.size(); i++) {
            List<String> lieList = listListString.get(i);

            XWPFTableRow row;
            if (i == 0) {
                row = tab.getRow(0);
            } else {
                row = tab.createRow();
            }

            for (int j = 0; j < lieList.size(); j++) {
                //只有第一列需要加列,且第一列的第一个是存在的
                if (!((i == 0 && j == 0) || i > 0)) {
                    row.addNewTableCell();
                }
                XWPFTableCell cell = row.getCell(j);
                CTP ctP = (cell.getCTTc().sizeOfPArray() == 0) ? cell.getCTTc().addNewP() : cell.getCTTc().getPArray(0);
                XWPFParagraph p = cell.getParagraph(ctP);
                XWPFRun headRun0 = p.createRun();
                headRun0.setText(lieList.get(j));
                //水平居中
                p.setAlignment(ParagraphAlignment.CENTER);
                //字体样式
                addRunStyle(headRun0, tableStyle);

                CTTc cttc = cell.getCTTc();
                CTTcPr ctPr = cttc.addNewTcPr();
                ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
                cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
            }
        }
        mergeCellsVertically(tab, 0, 1, listListString.size() - 1);
    }

    /**
     * 跨行合并
     * table要合并单元格的表格
     * col要合并哪一列的单元格
     * fromRow从哪一行开始合并单元格
     * toRow合并到哪一个行
     */
    public static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
            XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
            if (rowIndex == fromRow) {
                // The first merged cell is set with RESTART merge value
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                // Cells which join (merge) the first one, are set with CONTINUE
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
            //  cell.setText("测试");

            //将单元格中的数据上下左右居中
            CTTc cttc = cell.getCTTc();
            CTTcPr ctPr = cttc.addNewTcPr();
            ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
            cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);

            XWPFParagraph cellParagraph = cell.getParagraphArray(0);
            cellParagraph.setVerticalAlignment(TextAlignment.CENTER);
        }
    }

    public static void main(String[] args) throws IOException {

        List<List<String>> listListString1 = new ArrayList<>();
        List<String> strings = CollectionUtilPlus.asList("姓名", "序号", "省份", "分数", "评估方式");
        List<String> strings1 = CollectionUtilPlus.asList("一眼真", "1", "妈妈省", "100", "唱");
        List<String> strings2 = CollectionUtilPlus.asList("丁假", "2", "妈妈省", "100", "跳");
        List<String> strings3 = CollectionUtilPlus.asList("蔡怅眺", "3", "妈妈省", "100", "rap");
        List<String> strings4 = CollectionUtilPlus.asList("肖黑子", "4", "妈妈省", "98", "篮球");
        listListString1.add(strings);
        listListString1.add(strings1);
        listListString1.add(strings2);
        listListString1.add(strings3);
        listListString1.add(strings4);
        TreeMap<String, List<List<String>>> tableTreeMap = new TreeMap<>();
        tableTreeMap.put("韩专家", listListString1);
        tableTreeMap.put("陈专家", listListString1);
        tableTreeMap.put("郝专家", listListString1);
        tableTreeMap.put("爱新觉罗专家", listListString1);

        InputStream is = new FileInputStream("D:\\测试.docx");
        XWPFDocument doc = new XWPFDocument(is);
        FontStyle fontStyle = new FontStyle();
        fontStyle.setFontFamily(FontFamily.FANG_SONG);
        fontStyle.setFontSize(16);

        /**
         * 此处在word中的某处输入与key相同的字符串
         */
        addTitleTable("请在word中输入您想替换的文字", doc, tableTreeMap, fontStyle, fontStyle);

        FileOutputStream out = new FileOutputStream(new File("D:\\替换1.docx"));
        doc.write(out);
        out.flush();
        out.close();
    }
}

加plus的去掉就可以了,然后在word中加入自己想替换的文字

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
您可以使用Apache POI库来读取Word文档文字表格。以下是使用Spring Boot和POI库的示例代码: 1. 添加POI库依赖 在pom.xml文件添加以下依赖: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 读取Word文档 使用以下代码读取Word文档文字表格: ``` import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.springframework.stereotype.Service; import java.io.FileInputStream; import java.io.IOException; import java.util.List; @Service public class WordService { public void readWord(String filePath) throws IOException { FileInputStream fis = new FileInputStream(filePath); XWPFDocument document = new XWPFDocument(fis); // 读取文字 List<XWPFParagraph> paragraphs = document.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { System.out.println(paragraph.getText()); } // 读取表格 List<XWPFTable> tables = document.getTables(); for (XWPFTable table : tables) { List<XWPFTableRow> rows = table.getRows(); for (XWPFTableRow row : rows) { List<String> cells = row.getTableICells(); for (String cell : cells) { System.out.print(cell + "\t"); } System.out.println(); } } fis.close(); } } ``` 3. 调用方法 在Spring Boot应用程序调用readWord方法: ``` @Autowired private WordService wordService; public void test() throws IOException { String filePath = "path/to/word/document.docx"; wordService.readWord(filePath); } ``` 希望这可以帮助您读取Word文档文字表格

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值