批量导出word,并导出一个zip文件

avatar
作者
筋斗云
阅读量:0

系统导出功能,多条数据分别导出word,多个word打包到一个zip进行导出,直接拷贝过去可用,如果缺包自行查找。

参考: Java使用word模板导出word_java根据模板导出word-CSDN博客.

    @Action(value = "exportToWordZip")     public String exportToWordZip() throws Exception {         HttpServletRequest request = ServletActionContext.getRequest();         WordUtil xwpfTUtil = null;         FileOutputStream os = null;         InputStream is = null;         List<String> files = new ArrayList<>();         for (int i = 0; i < 2; i++) {             //导出的数据处理             Map<String, Object> params = new HashMap<>();             params.put("${Name}", "Fisher3652");             params.put("${Sex}", "男");             params.put("${Desc}", "18岁\tJAVA开发\r熟悉JVM基本原理");             params.put("${@Pic}", "C:\\Users\\admin\\Desktop\\资源\\32.png");              //获取模版             is = FileUtil.class.getClassLoader().getResourceAsStream("static/letterWordDemo.docx");             xwpfTUtil = new WordUtil();             CustomXWPFDocument doc;             doc = new CustomXWPFDocument(is);             //模版替换成真实数据             xwpfTUtil.replaceInPara(doc, params);             xwpfTUtil.replaceInTable(doc, params);             //生成word到临时文件             String realPath = request.getSession().getServletContext().getRealPath("/");             String parentPath = new File(realPath).getParent() + "/exportToWordZipTemp" ;             File dir = new File(parentPath);             if (!dir.exists()) {                 dir.mkdirs();             }             String fileName = parentPath + "/" + i + ".docx";             System.out.println(fileName);             os = new FileOutputStream(fileName);             files.add(fileName);             doc.write(os);             System.out.println("word成功生成");         }         xwpfTUtil.close(os);         xwpfTUtil.close(is);         os.flush();         os.close();         writeZip(files, "文件汇总");         return null;     } 
package com.dazhi.itp.util.exportWord;  import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; 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 java.io.IOException; import java.io.InputStream;  public class CustomXWPFDocument extends XWPFDocument {     public CustomXWPFDocument(InputStream in) throws IOException {         super(in);     }      public CustomXWPFDocument(OPCPackage pkg) throws IOException {         super(pkg);     }      public void createPicture(String blipId,int id, int width, int height, XWPFParagraph paragraph)     {         final int EMU = 9525;         width *= EMU;         height *= EMU;          //给段落插入图片         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=\"" + id + "\" 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>";          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(id);         docPr.setName("Picture " + id);         docPr.setDescr("Generated");     } }   
package com.dazhi.itp.util.exportWord;  import com.dazhi.itp.util.exportWord.CustomXWPFDocument; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.xwpf.usermodel.*;  import java.io.*; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern;  public class WordUtil {      /**      * 替换段落里面的变量      *      * @param doc    要替换的文档      * @param params 参数      * @throws FileNotFoundException      * @throws InvalidFormatException      */     public void replaceInPara(CustomXWPFDocument doc, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException {         Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();         XWPFParagraph para;         while (iterator.hasNext()) {             para = iterator.next();             this.replaceInPara(para, params,doc);         }     }      /**      * 替换段落里面的变量      * 文本用${}标识,例如${Name},图片用${@},多一个@标识      * @param para   要替换的段落      * @param params 参数      * @throws FileNotFoundException      * @throws InvalidFormatException      */     public void replaceInPara(XWPFParagraph para, Map<String, Object> params, CustomXWPFDocument doc) throws InvalidFormatException, FileNotFoundException {         List<XWPFRun> runs;         Matcher matcher;         if (this.matcher(para.getParagraphText()).find()) {             runs = para.getRuns();             int start = -1;             int end = -1;             String str = "";             String text= "";             for (int i = 0; i < runs.size(); i++) {                 text += runs.get(i).toString();             }             for (int i = 0; i < runs.size(); i++) {                 XWPFRun run = runs.get(i); //                System.out.println("------>>>>>>>>>" + text);                 if (text.contains("$")) {                     start = text.indexOf("$");                 }                 if ((start != -1)) {                     str += text.substring(text.indexOf("$"), text.length()).trim();                     String paraList=runs.toString(); //                    System.out.println("未删除前"+paraList);                     Object[] runArr = runs.toArray();                     int size=runs.size();                     int $Index=0;                     for (int j = 0; j < runArr.length; j++) {                         if (runArr[j].toString().contains("$")) {                             $Index=j;                             break;                         }                     }                     int startIn=$Index;                     while (startIn<runs.size()) {                         para.removeRun(startIn); //                        System.out.println("删除中"+para.getRuns());                     } //                    System.out.println("删除后"+para.getRuns());                 }                 if ('}' == text.charAt(text.length() - 1)) {                     if (start != -1) {                         end = text.length() - 1;                         break;                     }                 }             } //            System.out.println("start--->"+start); //            System.out.println("end--->"+end); //            System.out.println("str---->>>" + str);              for (String key : params.keySet()) {                 if (str.equals(key)) {                     //判断是图片还是文本                     if(str.indexOf("@")==-1){                         String value= params.get(key).toString();                         para.createRun().setText(value);                         break;                     }else{                         //图片处理                         String value= params.get(key).toString();                         int length = para.getRuns().size();                         if (length > 0) {                             for (int i = (length - 1); i >= 0; i--) {                                 para.removeRun(i);                             }                         }                         String blipId = doc.addPictureData(new FileInputStream(new File(value)), CustomXWPFDocument.PICTURE_TYPE_PNG);                         doc.createPicture(blipId,doc.getNextPicNameNumber(CustomXWPFDocument.PICTURE_TYPE_PNG), 550, 250,para);                         break;                     }                 }             }           }     }      /**      * 替换表格里面的变量      *      * @param doc    要替换的文档      * @param params 参数      * @throws FileNotFoundException      * @throws InvalidFormatException      */     public void replaceInTable(CustomXWPFDocument doc, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException {         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,doc);                     }                 }             }         }     }      /**      * 正则匹配字符串      *      * @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();             }         }     } }   

模版

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!