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();  
            }  
        }  
    }  
   
}  
原文地址:https://www.cnblogs.com/qnight/p/6762716.html