使用poi 生成 word文档,带表格 带图片

@RequestMapping(value="exportApplyForm")

    public void exportApplyForm(HttpServletResponse response,HttpServletRequest request,Long id) throws Exception { 

AdmissionTicket admissionTicket= admissionTicketRepository.findOne(id);

            Map<String, Object> params = new HashMap<String, Object>(); 


            params.put("${name}", admissionTicket.getSpecTionId().getName()); 

            params.put("${admissionTicket}",admissionTicket.getSpecTionId().getGender()); 

            params.put("${degreeEdu}",admissionTicket.getSpecTionId().getDegreeEdu()); 

            params.put("${identityId}",admissionTicket.getSpecTionId().getIdentityId());

            params.put("${organizationId}",admissionTicket.getSpecTionId().getOrganizationId().getName());

            params.put("${photo}",admissionTicket.getSpecTionId().getPhoto());

            String ss=request.getServletContext().getRealPath("demo/stas.docx");

            File file=new File(ss);

            XwpfTUtil xwpfTUtil = new XwpfTUtil(); 


            XWPFDocument doc; 

            InputStream is; 

            /*is = new FileInputStream(filePath);*/ 

            is =new FileInputStream(file);;      //本身就在编译路径下。。。。


            doc = new XWPFDocument(is); 


            xwpfTUtil.replaceInPara(doc, params); 

            //替换表格里面的变量 

            xwpfTUtil.replaceInTable(doc, params);

            OutputStream os = response.getOutputStream(); 


            response.setContentType("application/vnd.ms-excel"); 

            response.setHeader("Content-disposition","attachment;filename=测试.docx"); 

            doc.write(os); 


            xwpfTUtil.close(os); 

            xwpfTUtil.close(is); 


            os.flush(); 

            os.close(); 

        } 





/****************************************************************************************************************方法类**********************

package com.yuyang.sicm.service;


import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

import org.apache.poi.util.Units;

import org.apache.poi.xwpf.usermodel.*;

import org.apache.xmlbeans.XmlCursor;

import org.junit.Test;

import sun.misc.BASE64Encoder;

import java.io.*; 

import java.util.HashMap; 

import java.util.Iterator; 

import java.util.List; 

import java.util.Map; 

import java.util.regex.Matcher; 

import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest; 


public class XwpfTUtil { 


    /*String filePath = "/sta.docx";

    InputStream is;

    XWPFDocument doc;

    Map<String, Object> params = new HashMap<String, Object>();

    {

        params.put("${name}", "xxx");

        params.put("${sex}", "男");

        params.put("${political}", "共青团员");

        params.put("${place}", "sssss");

        params.put("${classes}", "3102");

        params.put("${id}", "213123123");

        params.put("${qq}", "213123");

        params.put("${tel}", "312313213");

        params.put("${oldJob}", "sadasd");

        params.put("${swap}", "是");

        params.put("${first}", "asdasd");

        params.put("${second}", "综合事务部");

        params.put("${award}", "asda");

        params.put("${achievement}", "完成科协网站的开发");

        params.put("${advice}", "没有建议");

        params.put("${attach}", "无");

        try {

            is = new FileInputStream(filePath);

            doc = new XWPFDocument(is);

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }*/ 



    /**

    * 用一个docx文档作为模板,然后替换其中的内容,再写入目标文档中。

    *

    * @throws Exception

    */ 

    /*@Test

    public void testTemplateWrite() throws Exception {

        //替换段落里面的变量

        this.replaceInPara(doc, params);

        //替换表格里面的变量

        this.replaceInTable(doc, params);

        OutputStream os = new FileOutputStream("D:\\sta1.docx");

        doc.write(os);

        this.close(os);

        this.close(is);

    }*/ 


    /*@Test

    public void myTest1() throws Exception {

        *//*Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();

        XWPFParagraph para;

        while (iterator.hasNext()) {

            para = iterator.next();

            List<XWPFRun> runs = para.getRuns();

            para.removeRun(0);

            para.insertNewRun(0).setText("hello");

        }

        OutputStream os = new FileOutputStream("D:\\sta1.docx");

        doc.write(os);

        this.close(os);

        this.close(is);*//*

        System.out.println(this.matcher("报告日期:${reportDate}").find());

    }*/ 


    /*@Test

    public void myReplaceInPara() {

//        Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();

//        XWPFParagraph para;

//        while (iterator.hasNext()) {

//            para = iterator.next();

//            List<XWPFRun> runs = para.getRuns();

//

//

//        }

        System.out.println('{'=='{');

    }*/ 


    /**

    * 替换段落里面的变量

    *

    * @param doc    要替换的文档

    * @param params 参数

    * @throws IOException

    * @throws FileNotFoundException

    * @throws InvalidFormatException

    */ 

    public void replaceInPara(XWPFDocument doc, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException, IOException { 

        Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator(); 

        XWPFParagraph para; 

        while (iterator.hasNext()) { 

            para = iterator.next(); 

            this.replaceInPara(para, params); 

        } 

    } 


    /**

    * 替换段落里面的变量

    *

    * @param para  要替换的段落

    * @param params 参数

    * @throws IOException

    * @throws FileNotFoundException

    * @throws InvalidFormatException

    */ 

    public void replaceInPara(XWPFParagraph para, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException, IOException { 

        List<XWPFRun> runs; 

        Matcher matcher; 

        if (this.matcher(para.getParagraphText()).find()) { 

            runs = para.getRuns(); 


            int start = -1; 

            int end = -1; 

            String str = ""; 

            for (int i = 0; i < runs.size(); i++) { 

                XWPFRun run = runs.get(i); 

                String runText = run.toString(); 

                System.out.println("------>>>>>>>>>" + runText); 

                if ('$' == runText.charAt(0)&&'{' == runText.charAt(1)) { 

                    start = i; 

                } 

                if ((start != -1)) { 

                    str += runText; 

                } 

                if ('}' == runText.charAt(runText.length() - 1)) { 

                    if (start != -1) { 

                        end = i; 

                        break; 

                    } 

                } 

            } 

            System.out.println("start--->"+start); 

            System.out.println("end--->"+end); 


            System.out.println("str---->>>" + str); 


            for (int i = start; i <= end; i++) { 

                para.removeRun(i); 

                i--; 

                end--; 

                System.out.println("remove i="+i); 

            } 


            for (String key : params.keySet()) { 

                if (str.equals(key)) {

                if(str.equals("${photo}")) {

                para.createRun().addPicture(new FileInputStream(new File("F:/ceshi.PNG")), Document.PICTURE_TYPE_PNG, "测试",  Units.toEMU(200), Units.toEMU(200));

                break; 

                }

                    para.createRun().setText((String) params.get(key)); 

                    break; 

                } 

            } 



        } 

    } 


    /**

    * 替换表格里面的变量

    *

    * @param doc    要替换的文档

    * @param params 参数

    * @throws IOException

    * @throws FileNotFoundException

    * @throws InvalidFormatException

    */ 

    public void replaceInTable(XWPFDocument doc, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException, IOException { 

        Iterator<XWPFTable> iterator = doc.getTablesIterator(); 

        XWPFTable table; 

        List<XWPFTableRow> rows; 

        List<XWPFTableCell> cells; 

        List<XWPFParagraph> paras; 

        while (iterator.hasNext()) { 

            table = iterator.next(); 

            rows = table.getRows(); 

            for (XWPFTableRow row : rows) { 

                cells = row.getTableCells(); 

                for (XWPFTableCell cell : cells) { 

                    paras = cell.getParagraphs(); 

                    for (XWPFParagraph para : paras) { 

                        this.replaceInPara(para, params); 

                    } 

                } 

            } 

        } 

    } 


/*   

    public void replacePhoto(XWPFDocument xwpfDocument, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException, IOException {

    List<XWPFParagraph> xwpfParas=xwpfDocument.getParagraphs();//获取一格里的内容  list

    for(int i=0;i<xwpfParas.size();i++){

        XWPFParagraph xwpfParagraph = xwpfParas.get(i);

        String text=xwpfParagraph.getText();//获取单元格内的内容


        if(text.equals("${mark_newPicture}")) {

          XmlCursor cursor = xwpfParagraph .getCTP().newCursor();

              XWPFParagraph newPara = xwpfDocument.insertNewParagraph(cursor);

              newPara.setAlignment(ParagraphAlignment.CENTER);//居中

              XWPFRun newParaRun = newPara.createRun();

              newParaRun.addPicture(new FileInputStream("demo/juhua.jpg"),XWPFDocument.PICTURE_TYPE_PNG,"bus.png,",Units.toEMU(200), Units.toEMU(200));

              xwpfDocument.removeBodyElement(xwpfDocument.getPosOfParagraph(xwpfParagraph));

        }

    }

}

    *//**

    * 取得全部段落

    * @param xwpfDocument

    * @param params

    * @throws InvalidFormatException

    * @throws FileNotFoundException

    * @throws IOException

    *//*


    public void replaceInPhoto(XWPFDocument doc, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException, IOException { 

        Iterator<XWPFTable> iterator = doc.getTablesIterator(); 

        XWPFTable table; 

        List<XWPFTableRow> rows; 

        List<XWPFTableCell> cells; 

        List<XWPFParagraph> paras; 

        while (iterator.hasNext()) { 

            table = iterator.next(); 

            rows = table.getRows(); 

            for (XWPFTableRow row : rows) { 

                cells = row.getTableCells(); 

                for (XWPFTableCell cell : cells) { 

                    paras = cell.getParagraphs(); 

                    for (XWPFParagraph para : paras) { 

                        this.replaceInPhoto(para, params); 

                    } 

                } 

            } 

        } 

    } 

    *//**

    *

    * @param para  段落

    * @param params

    * @throws IOException

    * @throws FileNotFoundException

    * @throws InvalidFormatException

    *//*


    public void replaceInPhoto(XWPFParagraph para, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException, IOException { 

        List<XWPFRun> runs; 

        Matcher matcher; 

        if (this.matcher(para.getParagraphText()).find()) { 

            runs = para.getRuns(); 


            int start = -1; 

            int end = -1; 

            String str = ""; 

            for (int i = 0; i < runs.size(); i++) { 

                XWPFRun run = runs.get(i); 

                String runText = run.toString(); 

                System.out.println("------>>>>>>>>>" + runText); 

                if ('$' == runText.charAt(0)&&'{' == runText.charAt(1)) { 

                    start = i; 

                } 

                if ((start != -1)) { 

                    str += runText; 

                } 

                if ('}' == runText.charAt(runText.length() - 1)) { 

                    if (start != -1) { 

                        end = i; 

                        break; 

                    } 

                } 

            } 

            System.out.println("start--->"+start); 

            System.out.println("end--->"+end); 


            System.out.println("str---->>>" + str); 


            for (int i = start; i <= end; i++) { 

                para.removeRun(i); 

                i--; 

                end--; 

                System.out.println("remove i="+i); 

            } 


            for (String key : params.keySet()) { 

                if(str.equals("${photo}")) {

                para.createRun().addPicture(new FileInputStream(new File("demo/ceshi.PNG")), Document.PICTURE_TYPE_PNG, "测试",  Units.toEMU(200), Units.toEMU(200));


                break; 

                }

            } 



        } 

    } */


    /**

    * 正则匹配字符串

    *

    * @param str

    * @return

    */ 

    private Matcher matcher(String str) { 

        Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE); 

        Matcher matcher = pattern.matcher(str); 

        return matcher; 

    } 


    /**

    * 关闭输入流

    *

    * @param is

    */ 

    public void close(InputStream is) { 

        if (is != null) { 

            try { 

                is.close(); 

            } catch (IOException e) { 

                e.printStackTrace(); 

            } 

        } 

    } 


    /**

    * 关闭输出流

    *

    * @param os

    */ 

    public void close(OutputStream os) { 

        if (os != null) { 

            try { 

                os.close(); 

            } catch (IOException e) { 

                e.printStackTrace(); 

            } 

        } 

    }


    private String getImageStr(String path) {

    String imgFile = path;

    InputStream in = null;

    byte[] data = null;

    try {

    in = new FileInputStream(imgFile);

    data = new byte[in.available()];

    in.read(data);

    in.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    BASE64Encoder encoder = new BASE64Encoder();

    return encoder.encode(data);

    }


}






参考文章 https://hacpai.com/article/1504680819318#toc_h3_0

https://www.jianshu.com/p/de58ab550157

https://blog.csdn.net/mate_ge/article/details/50812831

https://blog.csdn.net/java_xuetu/article/details/79540622


Can't open the specified file: 'demo/demo.docx'

在导出图片的时候导出的图片不显示,  最后查得,这个是版本的问题,  最后换成3.16的版本就好

<dependency>

            <groupId>org.apache.poi</groupId> 

            <artifactId>poi</artifactId> 

            <version>3.16-beta2</version> 

            <type>jar</type> 

            <scope>compile</scope> 

        </dependency> 

        <dependency> 

            <groupId>org.apache.poi</groupId> 

            <artifactId>poi-ooxml</artifactId> 

            <version>3.16-beta2</version> 

            <type>jar</type> 

        </dependency> 

        <dependency> 

            <groupId>org.apache.poi</groupId> 

            <artifactId>poi-ooxml-schemas</artifactId> 

            <version>3.16-beta2</version> 

            <type>jar</type> 

            <scope>compile</scope> 

        </dependency> 

        <dependency> 

            <groupId>org.apache.poi</groupId> 

            <artifactId>poi-scratchpad</artifactId> 

            <version>3.0.2-FINAL</version> 

        </dependency> 

</dependencies>

推荐阅读更多精彩内容