Java POI通过模板方法生成word文档

来源:互联网 发布:电音软件 编辑:程序博客网 时间:2024/06/05 19:25
    package util;            import org.apache.poi.xwpf.usermodel.*;      import org.junit.Test;            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;            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 参数          */          public void replaceInPara(XWPFDocument doc, Map<String, Object> params) {              Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();              XWPFParagraph para;              while (iterator.hasNext()) {                  para = iterator.next();                  this.replaceInPara(para, params);              }          }                /**          * 替换段落里面的变量          *          * @param para   要替换的段落          * @param params 参数          */          public void replaceInPara(XWPFParagraph para, Map<String, Object> params) {              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)) {                          para.createRun().setText((String) params.get(key));                          break;                      }                  }                          }          }                /**          * 替换表格里面的变量          *          * @param doc    要替换的文档          * @param params 参数          */          public void replaceInTable(XWPFDocument doc, Map<String, Object> params) {              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);                          }                      }                  }              }          }                /**          * 正则匹配字符串          *          * @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();                  }              }          }            }  


这个函数的实现方式,使用方法:

    @Action(value = "exportApplyForm")          public void exportApplyForm() throws Exception {                    String id = request.getParameter("id");              applyForm = applyFormService.retriveById(id);                    Map<String, Object> params = new HashMap<String, Object>();                    params.put("${name}", applyForm.getName());              params.put("${sex}", applyForm.getSex());              params.put("${political}", applyForm.getPolitical());              params.put("${place}", applyForm.getPlace());              params.put("${classes}", applyForm.getClasses());              params.put("${id}", applyForm.getStudentId());              params.put("${qq}", applyForm.getQq());              params.put("${tel}", applyForm.getTel());              params.put("${oldJob}", applyForm.getOldJob());              params.put("${swap}", applyForm.getSwap());              params.put("${first}", applyForm.getFirst());              params.put("${second}", applyForm.getSecond());              params.put("${award}", applyForm.getAward());              params.put("${achievement}", applyForm.getAchievement());              params.put("${advice}", applyForm.getAdvice());              params.put("${attach}", applyForm.getAttach());                    XwpfTUtil xwpfTUtil = new XwpfTUtil();                    XWPFDocument doc;              String fileNameInResource = "sta.docx";              InputStream is;              /*is = new FileInputStream(filePath);*/              is = getClass().getClassLoader().getResourceAsStream(fileNameInResource);              doc = new XWPFDocument(is);                    xwpfTUtil.replaceInPara(doc, params);              //替换表格里面的变量              xwpfTUtil.replaceInTable(doc, params);              OutputStream os = response.getOutputStream();                    response.setContentType("application/msword");              response.setHeader("Content-disposition","attachment;filename="+applyForm.getName());                    doc.write(os);                    xwpfTUtil.close(os);              xwpfTUtil.close(is);                    os.flush();              os.close();          }  



这个是word模板闻文件



从图片中可以看出,就是替换掉制定字符串的功能,最后将文件流输出到客户端浏览器供下载。

这里还需要导入poi依赖,我这里是使用maven导入依赖的:

<!--导入操作excel所需要的jar包-->          <dependency>              <groupId>org.apache.poi</groupId>              <artifactId>                  poi</artifactId>              <version>3.10-beta2</version>              <type>jar</type>              <scope>compile</scope>          </dependency>          <dependency>              <groupId>org.apache.poi</groupId>              <artifactId>poi-ooxml</artifactId>              <version>3.10-beta2</version>              <type>jar</type>          </dependency>          <dependency>              <groupId>org.apache.poi</groupId>              <artifactId>poi-ooxml-schemas</artifactId>              <version>3.10-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>  


0 0