poi 4.11版本 word模板操作

    写代码之前先说说遇到的问题,之前word模板是使用poi 3.9的包实现的,之后又写了exlce上传下载的功能使用的是poi 4.11的版本,他们之间融合的时候发现包冲突,总有一个功能不能使用,之后发现poi 4 之后把一些poi 3支持的方法直接放弃了,导致之前好用的功能不好用。为了看poi4.11版本如何操作word模板网上找了很多资料没有一个可以直接拿来用的,后来又通过各种调试修改终于搞成了。输入的文本只能是.docx,生成的可以是.docx也可以是.doc。

   操作word模板文本和表格还不是一个方法,新版本设置个字体都挺费劲,网上可用的资料太少了。废话不说了直接上代码

   注:实际的操作中有的时候会发现 ${name} 这样一个标记为有的时候会被代码认成是 ${、name 、} 这三个字符导致替换失败,解决办法是,把${name}写在txt里然后直接粘贴在word里,不要在word里手敲${name} ,这真是个坑人的点。

 

一、pom.xnl

依赖的核心包

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.1</version>
        </dependency>

二、代码

public class WordDoUtil {

    public static void main(String[] args) {

        System.out.println("path:"+System.getProperty("user.dir").toString());

        Map map=new HashMap();
        map.put("${name}","张三");
        map.put("${num}","123456");
        map.put("${agree}","■");
        map.put("${refuse}","□");
        map.put("${ha}","11111");
        getBuild("doc/在校证明.docx",map,"D:/在校证明1.doc");


    }

    public static void getBuild(String  tmpFile, Map<String, String> map, String exportFile){

        XWPFDocument document = null;
        try {
            document = new XWPFDocument( POIXMLDocument.openPackage(System.getProperty("user.dir").toString()+"\\"+tmpFile));

        } catch (IOException e) {
            e.printStackTrace();
        }
        // 替换段落中的指定文字
        Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
        while (itPara.hasNext()) {
            XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
            String s = paragraph.getParagraphText();
            System.out.println("s:"+s);

            Set<String> set = map.keySet();
            Iterator<String> iterator = set.iterator();
            while (iterator.hasNext()) {
                String key = iterator.next();
                List<XWPFRun> run=paragraph.getRuns();
                for(int i=0;i<run.size();i++)
                {
                    if(run.get(i).getText(run.get(i).getTextPosition())!=null && run.get(i).getText(run.get(i).getTextPosition()).equals(key))
                    {
                        /**参数0表示生成的文字是要从哪一个地方开始放置,设置文字从位置0开始
                         * 就可以把原来的文字全部替换掉了
                         * */
                        run.get(i).setText(map.get(key),0);
                    }
                }
            }
        }
        // 替换表格中的指定文字
        Iterator<XWPFTable> itTable = document.getTablesIterator();
        while (itTable.hasNext()) {
            XWPFTable table = (XWPFTable) itTable.next();
            int rcount = table.getNumberOfRows();
            for (int i = 0; i < rcount; i++) {
                XWPFTableRow row = table.getRow(i);
                List<XWPFTableCell> cells = row.getTableCells();
                for (XWPFTableCell cell : cells) {
                    String tempText = cell.getText();
                    int have = 0;
                    for (Map.Entry<String, String> e : map.entrySet()) {
                        if (tempText.contains(e.getKey())) {
                            have =1;
                            tempText = tempText.replace(e.getKey(),e.getValue());
                        }
                    }
                    if(have ==1) {
                        cell.removeParagraph(0);
                        //------------设置字体式样-----
                        XWPFParagraph pIO =cell.addParagraph();
                        XWPFRun rIO = pIO.createRun();
                        rIO.setFontFamily("楷体");
                        rIO.setFontSize(9);
                        rIO.setText(tempText);
                        //这样写格式没用
                        // cell.setText(tempText);
                    }
                }
            }
        }
        FileOutputStream outStream = null;
        try {
            outStream = new FileOutputStream(exportFile);
            document.write(outStream);
            outStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 

资源丰富的的网盘资源:网盘资源大全! 推荐一个适合零基础学习SQL的网站:不用安装数据库,在线轻松学习SQL!
posted @ 2021-08-19 13:05  万笑佛  阅读(324)  评论(0编辑  收藏  举报