• springMVC导出word模板


    • controller 调用
    @RequestMapping(value = "/exportWord")
    	public void exportWord(HttpServletResponse response, HttpServletRequest request) throws IOException {
    		String templatePath = request.getServletContext().getRealPath("") + "/template/税源信息比对.docx";  
    		String fileName = new String("税源信息比对".getBytes("gb2312"), "ISO8859-1") + ".docx";
            /*数据*/
    		Map<String, Object> params = new HashMap<String, Object>();  
            params.put("${name}", "aaaa");  
            params.put("${sex}", "bbbb");
            
           TempleWordUtil wordUtil = new TempleWordUtil();
      
            XWPFDocument doc;  
            InputStream is = new FileInputStream(templatePath);
          //  is = getClass().getClassLoader().getResourceAsStream(templatePath);  
            doc = new XWPFDocument(is);   //只能使用.docx的
      
            wordUtil.replaceInPara(doc, params);  
            //替换表格里面的变量  
            wordUtil.replaceInTable(doc, params);  
            OutputStream os = response.getOutputStream();  
      
            response.setContentType("application/vnd.ms-excel");  
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);  
      
            doc.write(os);  
      
            wordUtil.close(os);  
            wordUtil.close(is);  
      
            os.flush();  
            os.close();  
    	      
    	}
    
    • TempleWordUtil 工具类
    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;  
     
    /**
     * 写入word工具类
     * @author z
     *
     */
    public class TempleWordUtil {
     
        /** 
         * 替换段落里面的变量 
         * 
         * @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();  
                    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;  
                        }  
                    }  
                }  
       
                for (int i = start; i <= end; i++) {  
                    para.removeRun(i);  
                    i--;  
                    end--;  
                }  
       
                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();  
                }  
            }  
        }  
       
    }  
    
  • 相关阅读:
    十五天精通WCF——第六天 你必须要了解的3种通信模式
    十五天精通WCF——第五天 你需要了解的三个小技巧
    十五天精通WCF——第四天 你一定要明白的通信单元Message
    十五天精通WCF——第三天 client如何知道server提供的功能清单
    十五天精通WCF——第二天 告别烦恼的config配置
    十五天精通WCF——第一天 三种Binding让你KO80%的业务
    SimpleAdapter & BaseAdapter
    android:layout_gravity和android:gravity的区别
    Restrict & Cascade
    正确理解Mysql的列索引和多列索引
  • 原文地址:https://www.cnblogs.com/qnight/p/6762716.html
Copyright © 2020-2023  润新知