精华内容
下载资源
问答
  • 2021-02-24 14:17:45

    模版word文件,内容和表格都已处理,保留了字体和样式,图片可以指定大小,docx类型的模版字段有问题的话,整个字段复制进去即可,不要手敲${}

    在这里插入图片描述

    生成的word文件

    在这里插入图片描述

    /**
     * word工具类
     *
     * @author lks
     * @date 2021/2/24 11:16
     */
    public class WordUtils {
    	//本地测试
    	                    /**
                         * 模版图片规则:${img-上传图片-200-200}   
                         * img:代表是图片
                         * 上传图片:模版的字段
                         * 200:宽(像素),可自定义
                         * 200:高(像素),可自定义
                         */
        public static void main(String[] args) throws IOException {
    
            //docx本地
            Map<String, Object> map = new HashMap<>();
            map.put("姓名", "张三");
            map.put("上传图片", "https://smart-form-dev.oss-cn-beijing.aliyuncs.com/fillImg/150a3d39976ab324/1632644009526_%E5%9B%BE%E7%89%871.png");
            FileInputStream in = new FileInputStream("/Users/liangkesai/Downloads/1.docx");
            XWPFDocument docx = new XWPFDocument(in);
            //表格内容替换添加
            Iterator<XWPFTable> itTable = docx.getTablesIterator();
            while (itTable.hasNext()) {
                //表格中所有的行
                List<XWPFTableRow> rows = itTable.next().getRows();
                for (XWPFTableRow row : rows) {
                    //获取每一行的格子
                    List<XWPFTableCell> cells = row.getTableCells();
                    for (XWPFTableCell cell : cells) {
                        if (cell != null) {
                            processParagraphs(cell.getParagraphs(), map);
                        }
                    }
                }
            }
            //替换段落中的指定文字
            processParagraphs(docx.getParagraphs(), map);
            docx.write(new FileOutputStream("/Users/liangkesai/Downloads/4.doc"));
    
    
            //doc 本地,doc暂时不支持图片,只能做到文本替换
    //        Map<String, Object> map = new HashMap<>();
    //        map.put("姓名", "张三");
    //        map.put("上传图片", "https://smart-form-dev.oss-cn-beijing.aliyuncs.com/fillImg/150a3d39976ab324/1632644009526_%E5%9B%BE%E7%89%871.png");
    //        FileInputStream in = new FileInputStream("/Users/liangkesai/Downloads/1.docx");
    //        HWPFDocument doc = new HWPFDocument(in);
    //        Range range = doc.getRange();
    //        for (Map.Entry entry : map.entrySet()) {
    //            String key = "${" + entry.getKey() + "}";
    //            range.replaceText(key, String.valueOf(entry.getValue()));
    //        }
    //        doc.write(new FileOutputStream("/Users/liangkesai/Downloads/4.doc"));
    
    
        }
    
        /**
         * 下载
         *
         * @param templateUrl
         * @param map
         * @param response
         * @param fileName
         */
        public static void downWordByTemplate(String templateUrl, Map<String, Object> map, HttpServletResponse response, String fileName) {
            //输出流
            OutputStream os = null;
            InputStream in = null;
    
            try {
                // 生成word文档并读取模板
                in = new URL(templateUrl).openStream();
                if (!templateUrl.endsWith("doc") && !templateUrl.endsWith("docx")) {
                    throw new CustomException("文件类型错误");
                }
                if (templateUrl.endsWith("doc")) {
                    HWPFDocument doc = new HWPFDocument(in);
                    Range range = doc.getRange();
                    for (Map.Entry entry : map.entrySet()) {
                        String key = "${" + entry.getKey() + "}";
                        range.replaceText(key, String.valueOf(entry.getValue()));
                    }
    
                    fileName = fileName + ".doc";
                    response.reset();
                    response.setContentType("application/msword");
                    response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
    
                    os = response.getOutputStream();
                    doc.write(os);
    
                    doc.close();
                } else {
                    XWPFDocument docx = new XWPFDocument(in);
                    //表格内容替换添加
                    Iterator<XWPFTable> itTable = docx.getTablesIterator();
                    while (itTable.hasNext()) {
                        //表格中所有的行
                        List<XWPFTableRow> rows = itTable.next().getRows();
                        for (XWPFTableRow row : rows) {
                            //获取每一行的格子
                            List<XWPFTableCell> cells = row.getTableCells();
                            for (XWPFTableCell cell : cells) {
                                if (cell != null) {
                                    processParagraphs(cell.getParagraphs(), map);
                                }
                            }
                        }
                    }
    
                    //替换段落中的指定文字
                    processParagraphs(docx.getParagraphs(), map);
    
                    fileName = fileName + ".docx";
                    response.reset();
                    response.setContentType("application/msword");
                    response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
    
                    os = response.getOutputStream();
                    docx.write(os);
                    docx.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (os != null) {
                        os.close();
                    }
                    if (in != null) {
                        in.close();
                    }
    
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
            }
        }
    
        /**
         * 替换文字和图片
         *
         * @param paragraphs
         * @param map
         */
        protected static void processParagraphs(List<XWPFParagraph> paragraphs, Map<String, Object> map) {
            for (XWPFParagraph paragraph : paragraphs) {
                List<XWPFRun> runs = paragraph.getRuns();
                for (XWPFRun run : runs) {
                    String textTemp = StrUtil.subBetween(run.getText(run.getTextPosition()), "${", "}");
    
                    if (StrUtil.isNotBlank(textTemp)) {
                        // 图片规则,${img-上传图片-200-200}   img-字段名-宽-高
                        if (textTemp.startsWith("img-")) {
                            String[] split = textTemp.split("-");
                            if (split.length == 4 && StrUtil.isNotBlank(split[1]) && map.containsKey(split[1])) {
                                try {
                                    String imgurl = String.valueOf(map.get(split[1]));
                                    String picType = null;
                                    if (imgurl.contains(".")) {
                                        picType = imgurl.substring(imgurl.lastIndexOf(".") + 1);
                                    }
                                    byte[] bs = IOUtils.toByteArray(new URL(imgurl).openStream());
                                    int width = Units.toEMU(Double.parseDouble(split[2]));
                                    int height = Units.toEMU(Double.parseDouble(split[3]));
                                    run.setText("", 0);
                                    run.addPicture(new ByteArrayInputStream(bs), getPictureType(picType), "", width, height);
                                } catch (IOException | InvalidFormatException e) {
                                    run.setText(String.valueOf(map.get(split[1])), 0);
                                }
                            }
                        } else {
                            if (map.containsKey(textTemp)) {
                                run.setText(String.valueOf(map.get(textTemp)), 0);
                            }
                        }
                    }
                }
            }
        }
    
    
        /**
         * 根据图片类型,取得对应的图片类型代码
         *
         * @param picType
         * @return int
         */
        private static int getPictureType(String picType) {
            int res = Document.PICTURE_TYPE_JPEG;
            if (picType != null) {
                if (picType.equalsIgnoreCase("png")) {
                    res = Document.PICTURE_TYPE_PNG;
                } else if (picType.equalsIgnoreCase("dib")) {
                    res = Document.PICTURE_TYPE_DIB;
                } else if (picType.equalsIgnoreCase("emf")) {
                    res = Document.PICTURE_TYPE_EMF;
                } else if (picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")) {
                    res = Document.PICTURE_TYPE_JPEG;
                } else if (picType.equalsIgnoreCase("wmf")) {
                    res = Document.PICTURE_TYPE_WMF;
                } else {
                    res = Document.PICTURE_TYPE_JPEG;
                }
            }
            return res;
        }
    
    
    更多相关内容
  • 1、poi版本3.13 2、可进行表格替换。复制、图片导出 3、可直接运行
  • java使用poi导出word并且带图片

    万次阅读 2019-12-04 15:27:28
    最近在开发中有按照模板导出word的需求,并且把echarts图例附到word里,我开始使用freework取ftl模板的,不过由于转换麻烦,需定义好格式xml再转为ftl文件所以改为使用poi取word模板直接赋值的方式,并且通过拼接...

    最近在开发中有按照模板导出word的需求,并且把echarts图例附到word里,我开始使用freework取ftl模板的,不过由于转换麻烦,需定义好格式xml再转为ftl文件所以改为使用poi取word模板直接赋值的方式,并且通过拼接标签实现图片的附带和定义宽度高度

    1、controller代码

    package com.springboot.util;
    
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.math.BigInteger;
    import java.net.URLDecoder;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.util.IOUtils;
    import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
    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.apache.xmlbeans.XmlException;
    import org.apache.xmlbeans.XmlToken;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
    import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblBorders;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVerticalJc;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    
    import net.sf.json.JSONObject;
    
    
    @Controller
    public class WordTest {
    
        @RequestMapping("/exportSellPlan")
        public @ResponseBody void exportSellPlan(Long id, HttpServletRequest request, HttpServletResponse response)throws Exception{
             String rpName=request.getParameter("rpName")==null?"":request.getParameter("rpName");
                rpName=java.net.URLDecoder.decode(rpName,"UTF-8")  ;
                String title = rpName;
                OutputStream out = null;
                String path="C:\\Users\\Administrator\\Desktop\\demo.docx";
                //String path = request.getSession().getServletContext().getRealPath("/efficiency/EnergyCellReport/中能瑞通模板.docx"); 
                try {
                    out = response.getOutputStream();
                    
                    /**
                     * 读取word
                     */
                    XWPFDocument docx = PropertiesUtil.importWord(path);
                    //docx = mFaultReportManageService.fillWordDataByList(docx, maps);
                    /**
                     * 数据组装
                     */
                    //获取所有需要填充的数据
                    //List<Map<String,String>> codeList = energyUnitService.queryEnergyReportDiList(rpId, consId);
                    
                    Map<String, String> wdmap = new HashMap<String, String>();
                    com.alibaba.fastjson.JSONObject json=new com.alibaba.fastjson.JSONObject();
    //                String appId=UserUtil.getAppId();
    //                json.put("appId", appId);        
    //                TenantAppClone app=energyUnitService.selectObjectByID(json);
                    wdmap.put("Title-N01","aaa");
                    Map<String,Object> map = new HashMap<>();
                    map.put("filepath", "C:\\Users\\Administrator\\Desktop\\50a6dcc7ly1g2g62aqxzpj22re1ulx6p.jpg");
                    map.put("width", "100");
                    map.put("height", "100");
                    wdmap.put("img-scoreimg",String.valueOf(JSONObject.fromObject(map)));
                    replaceInPara(docx,wdmap);
                    /*boolean flag_cp=false;
                    if(codeList!=null&&codeList.size()>0){
                        for(Map<String,String> map:codeList){
                             if(map.get("CODE_VALUE").equals("the-cpname")){
                                 flag_cp=true;
                             }
                             
                        }
                    }
                    //填充word中的产品表格
                    if(flag_cp){
                        this.queryProduct(docx,rpTime);
                    }
                    //填充值 
                    //this.writeInWord(codeList,docx,rpTime);
                    Map<String, String> wdmap = new HashMap<String, String>();
                    if(codeList!=null&&codeList.size()>0){
                        for(int i=0;i<codeList.size();i++){
                            Map map = codeList.get(i);
                            wdmap.put(map.get("CODE_VALUE").toString(),map.get("RP_VALUE").toString());  //公司名称
                        }
                    }
                    //修改word中的值
                    replaceInPara(docx,wdmap);*/
                    /**
                     * 生成word
                     */
                    PropertiesUtil.exportWord(docx, title, out, request, response);
                    
                    
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (out != null) {
                            out.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
        }
        
        
        /**
         *  word中 的文字填入
         * @param docx
         * @param params
         */
        public void replaceInPara(XWPFDocument docx, Map<String, String> params) {
            Iterator<XWPFParagraph> itPara = docx.getParagraphsIterator();
            while (itPara.hasNext()) {
                XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
                Set<String> set = params.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++) {
                        System.out.println(run.get(i).getText(run.get(i).getTextPosition())+"-------------------------");
                        if (run.get(i).getText(run.get(i).getTextPosition()) != null&& run.get(i).getText(run.get(i).getTextPosition()).equalsIgnoreCase(key)) {
                            if (!(key.startsWith("img-"))) { 
                                run.get(i).setText(params.get(key), 0);
                            } else {
    
                                run.get(i).setText("", 0);
                                
                                Map<String, String> pic = new HashMap<String, String>();
                                System.err.println(params.get(key));
                                JSONObject jsonObject = JSONObject.fromObject(params.get(key));
                                for (Iterator<?> iter = jsonObject.keys(); iter.hasNext();)
                                {
                                    String k = (String) iter.next();
                                    String v = jsonObject.get(k).toString();
                                    pic.put(k, v);
                                }
                                
                                int width = Integer.parseInt(pic.get("width").toString()); 
                                int height = Integer.parseInt(pic.get("height").toString()); 
    
                                byte[] byteArray = null;  
                                FileInputStream in = null;
                                try {  
                                    in = new FileInputStream(pic.get("filepath").toString());
                                    int total = in.available();  
                                    byteArray = new byte[total];  
                                    in.read(byteArray);  
                                } catch (IOException e) {  
                                    e.printStackTrace();
                                }finally{
                                    try {
                                        in.close();
                                    } catch (Exception e2) {
                                        System.out.println("关闭流失败");
                                    }
                                }
                                
                                int picType = XWPFDocument.PICTURE_TYPE_PNG;  
                                ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);  
                                try {  
                                    String ind = docx.addPictureData(byteInputStream,picType);  
                                    //docx.createPicture(width , height,paragraph);
                                    
                                    final int EMU = 9525;    
                                    width *= EMU;    
                                    height *= EMU;    
                                    String blipId = ind;    
                                    CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();    
                                    String picXml = ""    
                                            + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"    
                                            + "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"    
                                            + "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"    
                                            + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""    
                                            + 1    
                                            + "\" name=\"Generated\"/>"    
                                            + "            <pic:cNvPicPr/>"    
                                            + "         </pic:nvPicPr>"    
                                            + "         <pic:blipFill>"    
                                            + "            <a:blip r:embed=\""    
                                            + blipId    
                                            + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"    
                                            + "            <a:stretch>"    
                                            + "               <a:fillRect/>"    
                                            + "            </a:stretch>"    
                                            + "         </pic:blipFill>"    
                                            + "         <pic:spPr>"    
                                            + "            <a:xfrm>"    
                                            + "               <a:off x=\"0\" y=\"0\"/>"
                                            + "               <a:ext cx=\""    
                                            + width    
                                            + "\" cy=\""    
                                            + height    
                                            + "\"/>"  
                                            + "            </a:xfrm>"    
                                            + "            <a:prstGeom prst=\"rect\">"    
                                            + "               <a:avLst/>"    
                                            + "            </a:prstGeom>"    
                                            + "         </pic:spPr>"    
                                            + "      </pic:pic>"    
                                            + "   </a:graphicData>" + "</a:graphic>";    
    
                                    inline.addNewGraphic().addNewGraphicData();    
                                    XmlToken xmlToken = null;    
                                    try {    
                                        xmlToken = XmlToken.Factory.parse(picXml);    
                                    } catch (XmlException xe) {    
                                        xe.printStackTrace();    
                                    }    
                                    inline.set(xmlToken);   
    
                                    inline.setDistT(0);      
                                    inline.setDistB(0);      
                                    inline.setDistL(0);      
                                    inline.setDistR(0);      
    
                                    CTPositiveSize2D extent = inline.addNewExtent();    
                                    extent.setCx(width);
                                    extent.setCy(height);
    
                                    CTNonVisualDrawingProps docPr = inline.addNewDocPr();      
                                    docPr.setId(1);      
                                    docPr.setName("图片" + 1);      
                                    docPr.setDescr("测试");
                                        
                                        
                                    
                                } catch (Exception e) {  
                                    e.printStackTrace();  
                                }  
                                
                            }
                        }
                        
                    }
                }
            }
    
        }
    }

    2、PropertiesUtil代码:

    package com.springboot.util;
        
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.lang3.StringUtils;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFTable;
    import org.apache.poi.xwpf.usermodel.XWPFTableCell;
    import org.apache.poi.xwpf.usermodel.XWPFTableRow;
    
    
    /**
     * @Description 加载属性配置文件工具类
     */
    public class PropertiesUtil {
        /**
         * 导出word
         * @param docx
         * @param title
         * @param out
         * @param request
         * @param response
         * @throws Exception
         */
        public static void exportWord(XWPFDocument docx, String title, OutputStream out, HttpServletRequest request,
                HttpServletResponse response) throws Exception {
            // 兼容浏览器
            String userAgent = request.getHeader("USER-AGENT");
            if (!StringUtils.contains(userAgent, "Mozilla")) {// 火狐浏览器
                title = URLEncoder.encode(title, "UTF-8");// 其他浏览器
            } else {
                title = new String(title.getBytes("UTF-8"), "ISO8859-1");
            }
            response.setContentType("application/msword");
            response.addHeader("Accept-Ranges", "bytes");
            response.addHeader("Content-Disposition", "attachment;filename=" + title + ".doc");
            // 创建word文档
            try {
                docx.write(out);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                out.close();
            }
        }
        /**
         * 读取word
         * @param fileName
         * @return
         * @throws Exception
         */
        public static XWPFDocument importWord(String fileName) throws Exception {
            InputStream in = null;
            XWPFDocument docx = null;
            try {
                in = new FileInputStream(new File(fileName));
                docx = new XWPFDocument(in);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                in.close();
            }
            return docx;
        }
        
            /**
             * 表格填充值
             * @param table
             * @return
             */
            public static int getNullValuePos(XWPFTable table) {
                List<XWPFTableRow> rows = null;
                List<XWPFTableCell> cells = null;
                XWPFTableRow row = null;
                rows = table.getRows();
                // 至少第一行是标题行 从表题行的下一行进行查询
                int t = -1;
                for (int i = 0; i < rows.size(); i++) {
                    // 获取当前行
                    row = rows.get(i);
                    // 获取当前行的所有cell
                    cells = row.getTableCells();
                    // 获取cell的size
                    int cellSize = cells.size();
                    // 获取最后一个cell的内容
                    XWPFTableCell cell = cells.get(cellSize - 1);
                    String text = cell.getText().trim();
                    if (StringUtils.isBlank(text)) {
                        t = i;
                        break;
                    }
                }
                return t;
            }
    }

    3、excel模板:(根据代码我只示例了一个赋值的参数一个图片的参数)

    填充值:

    填充图片:

    代码赋值示例:(图片需要三个参数地址、宽度、高度)

     

    3、效果

    值效果:

    图片效果:

    展开全文
  • 最近项目中需要用到数据的导出Word,本在项目中使用POI将数据导入到Word,代码示例非常简洁,代码包含pom依赖文件,下载解压即可到本地调试运行。
  • poi导出word的几种方法

    2018-09-20 11:38:25
    这是grails框架的类似java开发,只是类型用def定义所有类型。
  • poi导出word例子(图片
  • springboot整合POI导出word(文字加图片)

    1、引入Poi依赖

    <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.8.2</version>
    </dependency>
    

    2、设置word模板

    在这里插入图片描述
    注意"{{}}"为中文模式下符号,图片占位{{@pic}},文字为{{text}}。

    3、(工具类)Utils

    import com.deepoove.poi.XWPFTemplate;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.net.URLEncoder;
    import java.util.Map;
    
    public class ExportWordUtils {
        public static void exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {
            if (!temDir.endsWith("/")) {
                temDir = temDir + File.separator;
            }
            File dir = new File(temDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            try {
                XWPFTemplate doc = XWPFTemplate.compile(templatePath).render(params);
                String tmpPath = temDir + fileName;//新文件路径
                FileOutputStream fos = new FileOutputStream(tmpPath);
                doc.write(fos);
                fos.flush();
                fos.close();
                doc.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //delFileWord(temDir,fileName);//这一步看具体需求,要不要删
            }
        }
        public static void delFileWord(String filePath, String fileName){//删除文件
            File file =new File(filePath+fileName);
            File file1 =new File(filePath);
            file.delete();
            file1.delete();
        }
    }
    

    4、Controller

    import com.deepoove.poi.data.PictureRenderData;
    import com.qh.makeword.utils.ExportWordUtils;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    @Controller
    public class WordController {
        @RequestMapping("/export")
        public void export(HttpServletRequest request, HttpServletResponse response) throws IOException {
            Map<String,Object> params = new HashMap<>();
            //key值与模板中的占位符一致
            params.put("id","2020212345");
            params.put("name","李四");
            params.put("Image", new PictureRenderData(100, 140, new ClassPathResource("static/1.jpg").getFile().getPath()));
            ClassPathResource oldDoc = new ClassPathResource("word/export.docx");
            //一行代码
            ExportWordUtils.exportWord(oldDoc.getFile().getPath(),"newWord/","new.docx",params,request,response);
        }
    }
    

    5、文件放置

    在这里插入图片描述

    export.docx为模板,1.jpg为插入模板的图片

    6、运行结果

    在这里插入图片描述
    参考:
    https://blog.csdn.net/weixin_43694038/article/details/106123534?spm=1001.2014.3001.5506

    https://blog.csdn.net/qq_41938882/article/details/89445678?utm_source=app&app_version=5.3.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

    展开全文
  • POI导出Word包含页眉 页脚的设置,标题的设置以及显示显示设置,包括POI操作Word完整的jar包
  • java poi导出word文档DEMO

    2017-08-24 17:18:55
    java poi导出word文档DEMO
  • org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> &

    1.导入依赖
    maven版:

    <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>
    <dependency>
        <groupId>org.jxls</groupId>
        <artifactId>jxls</artifactId>
        <version>2.6.0</version>
        <exclusions>
            <exclusion>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.jxls</groupId>
        <artifactId>jxls-poi</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.core</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.document</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.template</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.23</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.5</version>
    </dependency>
    

    gradle版:

        compile "fr.opensagres.xdocreport:fr.opensagres.xdocreport.core:2.0.2"
        compile "fr.opensagres.xdocreport:fr.opensagres.xdocreport.document:2.0.2"
        compile "fr.opensagres.xdocreport:fr.opensagres.xdocreport.document.docx:2.0.2"
        compile "fr.opensagres.xdocreport:fr.opensagres.xdocreport.template:2.0.2"
        compile "fr.opensagres.xdocreport:fr.opensagres.xdocreport.template.freemarker:2.0.2"
        compile "org.freemarker:freemarker:2.3.23"
        compile "commons-io:commons-io:2.5"
        compile "org.apache.poi:poi:3.14"
        compile "org.apache.poi:poi-ooxml:3.14"
    

    2.创建导出模板
    在这里插入图片描述
    纯文字使用${}占位,图片使用建立初始化图片并添加书签的方式占位,
    书签名就是datamap的键名,多张图片添加多个书签
    在这里插入图片描述

    3.编写代码(这里使用浏览器下载方式导出)
    (1)导出工具方法

    /**
         * 导出工具方法
         * //    *
         * //    * @param response 相应头
         * //    * @param map 集合外数据
         * //    * @param list 遍历数据
         * //    * @param fileName 文件名称(带后缀)
         * //    * @return 是否导出成功
         * //    * @throws IOException
         * //    * @throws XDocReportException
         */
        public static void exportFile (
                HttpServletResponse response,
                Map<String, File> fileDataMap,
                String fileName,
                Map<String, Object> map,
                List<Object> list) throws IOException, XDocReportException {
                // 获取Word模板,模板存放路径在项目的resources目录下
                // 这里的Kit为当前工具方法的类名,如果不是静态方法可以直接用this
              InputStreamins= Kit.class.getResourceAsStream(fileName);
                // 注册xdocreport实例并加载FreeMarker模板引擎
    		  IXDocReportreport=XDocReportRegistry.getRegistry().loadReport(ins, TemplateEngineKind.Freemarker);
                // 创建xdocreport上下文对象
                IContext context = report.createContext();
                //添加文本数据
                if (map != null) {
                    for (String s : map.keySet()) {
                        context.put(s, map.get(s));
                    }
                }
                //添加循环表格数据(需要自行添加,模板对应加上关键字)
                if (list != null) {
                    context.put("resultList", list);
                    // 创建字段元数据
                    FieldsMetadata fm = report.createFieldsMetadata();
                    // Word模板中的表格数据对应的集合类型
                    fm.load("resultList", Object.class, true);
                }
                FieldsMetadata metadata = report.createFieldsMetadata();
                // 替换word模板中的动态图片
                if (fileMap != null) {
                    for (String s : fileMap.keySet()) {
                        IImageProvider zp = new FileImageProvider((fileMap.get(s)), true);
                        zp.setSize(130F, 130F);
                        metadata.addFieldAsImage(s);
                        report.setFieldsMetadata(metadata);
                        context.put(s, zp);
                    }
                }
                // 浏览器端下载
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/msword");
                response.setHeader(
                        "Content-Disposition",
                        "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
                report.process(context, response.getOutputStream());
    
        }
    

    (2)业务逻辑代码

    try{
    		Map<String, File> fileMap = null;
    		Map<String, Object> exportMap = new hashMap();
    		exportMap.put("???","data");
                int num = 1;
                //由于poitl和导入功能用的poi版本冲突,无法用,这里使用IXDocReport对象做导出
                //可以循环添加,键名可以拼接为img1,img2,img3。。。,模板书签名对应
                //需要导出的文件集合,对接实际业务service
                List<File> list = new arrayList();
               	if(list != null) {
               	fileMap = new hashMap();
                for (File f : list) {
                	fileMap.put("img" + num , f);
                	num ++;
               }
            }
             Kit.exportFile(response, fileMap, "模板名称.docx", exportMap, null);
           } catch (Exception e) {
             e.printStackTrace();
           }
    

    (3)因为我们业务文件接口返回的是byte数组,所以这里提供一个byte数组转File对象的方法(网上c的)

        /**
         * byte数组转file对象工具方法(中方法)
         *
         * @param inputStream
         * @param name
         * @param ext
         * @param tmpDirFile
         * @return
         * @throws IOException
         */
        public static File createTmpFile(
                InputStream inputStream, String name, String ext, File tmpDirFile) throws IOException {
            File resultFile = File.createTempFile(name, '.' + ext, tmpDirFile);
            resultFile.deleteOnExit();
            FileUtils.copyToFile(inputStream, resultFile);
            return resultFile;
        }
    
        /**
         * byte数组转file对象工具方法
         *
         * @param bytes    文件byte数组
         * @param fileType 输出文件类型
         * @return file对象
         * @throws IOException io异常
         */
        public static File bytesToFile(byte[] bytes, String fileType) throws IOException {
            return createTmpFile(
                    new ByteArrayInputStream(bytes),
                    UUID.randomUUID().toString(),
                    fileType,
                    Files.createTempDirectory("tempFile").toFile());
        }
    

    4.那么问题来了,图片数量不定怎么确定初始化图片再添加书签呢,困扰了很久,最后直接用20张纯白图片(这里采用微信截图,截了很小一张,100张也没有几k,全都添加对应书签,不够20张也看不出来,缺点是不满20张会空一行出来),弄好后调用方法点击导出ok

    注:方法思路由该贴而来
    https://blog.csdn.net/plxddyxnmd/article/details/109129838
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 一个使用Apache的poi使用word模板循环输出表格行并导出的例子
  • https://gitee.com/hffs/poi-tl
  • Apache poi 根据word模板生成word报表 替换 循环列表 图片,代码调试过了,修改相应的图片位置,word模板路径即可运行
  • java 使用poi根据模版导出word文件 将文件中的标签替换成文字或者文件 文件中标签用{xxxx}生成新文件
  • /***写入图片*@paramdocument*@parampicName*@paramwidth*@paramheight*@paramalignment*/privatevoidWriteImage(CustomXWPFDocumentdocument,StringpicName,intwidth,intheight,ParagraphAlignmen...
  • poi 导出 word 表格样式

    2022-05-17 15:24:59
    XWPFDocument document = new XWPFDocument(); // 基本信息表格 XWPFTable infoTable = document.createTable(); //水平边框 (类型,大小,厚度,颜色) infoTable.setInsideHBorder(XWPFTable.XWPFBorderType.THICK, 2,...
  • apache poi 导出excel、word,替换word内容,导出word-文本、图片、表格
  • 项目中,有时候需要使用poi实现将固定数据导入word中 效果图: 代码: package poiword; import java.io.File; import java.io.FileOutputStream; import java.math.BigInteger; import org.apache.poi.xwpf....
  • java使用poi导出word

    2022-04-24 11:22:14
    1.代码如下 package doc; import java.io....import org.apache.poi.poifs.filesystem.DirectoryEntry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; public class ExportDoc { public
  • java poi 导出word文档数据含图片导出(占位符方式),图片怎么导出
  • POI导出简单的图片Word文档

    千次阅读 2018-03-01 20:49:03
    由于导出的文档中需要插入图片,因此需要新建类来处理由于插入图片引进的错误即“导出word文档在打开时会报内容出现错误,无法打开文件” 新建处理类为: import org.apache.poi.xwpf.usermodel.XWPFDocument; ...
  • Java使用POI导出Word文档的操作教程,poiword一、主要pom依赖org.apache.poipoi-ooxml3.16二、需要导出word模板三、相关导出代码package com.iflytek.chy;import java.io.FileInputStream;import java.io....
  • POI导出word工具类

    2022-03-08 15:59:25
    1:导出07版word(docx) 2:支持文本、图片、表格、页脚、纸张大小、纸张方向、页边距 3:方便扩展 4:使用实例 (在 类WordExporter 的main方法中)
  • POI报表Word导出

    2017-02-06 14:31:07
    POI报表Word导出
  • Spring boot + poi 导出Word

    2021-12-28 10:44:45
    spring boot + poi 遍历导出 Word
  • 使用POI导出word文档

    2021-07-16 16:18:02
    使用POI导出word文档 步骤一、创建一个需要导出的word文档模板。将表里需要填充的数据对应好要填充的键最后在表的最前方加入一个书签(一个table一个书签) 步骤二、工具类 public class WordExport { /** 内部...
  • poi导出word带复选框控件

    千次阅读 2020-09-23 17:08:38
    网上搜了很多很多资料,都没有实现。机缘巧合之下发现一个特简单的方法。...org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> <
  • Java使用poiWord导出

    2022-05-22 18:23:42
    poi使用,Java导出word文档
  • 导出word文档的过程中因为文档信息展示需要,要在指定位置插入图片,遇到的一系列问题整理: POI框架在处理Excel文档方面功能的确很强大,但是在处理word文档方面就略显劣势,使用poi在文档中插入图片时打开文档...
  • Java POI导出Word文档详解

    万次阅读 多人点赞 2019-08-28 14:58:06
    一、POI 生成导出Word样式 二、详细代码 pom.xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,983
精华内容 2,393
关键字:

poi导出word带图片