系统导出功能,多条数据分别导出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();}}}
}
模版