springMVC导出word模板的方法

本文实例为大家分享了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();
      }
    }
  } 

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java使用poi将word转换为html

    使用poi将word转换为html,支持doc,docx,转换后可以保持图片.样式. 1.导入Maven包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.a

  • java使用Jsoup组件生成word文档

    先利用jsoup将得到的html代码"标准化"(Jsoup.parse(String html))方法,然后利用FileWiter将此html内容写到本地的template.doc文件中,此时如果文章中包含图片的话,template.doc就会依赖你的本地图片文件路径,如果你将图片更改一个名称或者将路径更改,再打开这个template.doc,图片就会显示不出来(出现一个叉叉).为了解决此问题,利用jsoup组件循环遍历html文档的内容,将img元素替换成${image_自增值}的标

  • java/word+fusionchart生成图表深入分析

    一个朋友的项目里用到了fusionchart,同时需要提供多个报表的word下载功能. 毫无疑问,只是一个很棘手的问题. fusionchart提供了服务端和客户端生成图片的功能,都是基于client端展示了flash以后做的. 朋友的项目是基于linux的,office本身的那套com机制是没办法通过jacob调用了. 纯java的操作word,POI和docx4j,可以生成word文档,table,插入图片. 一个可行的思路是点击下载报表时,先在一个新页面打开各个flash的图表,再依次调用

  • 一个JAVA小项目--Web应用自动生成Word

    前段时间接到一个Web应用自动生成Word的需求,现整理了下一些关键步骤拿来分享一下. 思路:(注:这里只针对WORD2003版本,其它版本大同小异.) 因为WORD文件内部的数据及格式等是通过XML文件的形式存储的,所以WORD文件可以很方便的实现由DOC到XML格式的相互转换,而操作XML文件就方便的多了,这样就实现了与平台无关的各种操作,通过节点的查询.替换.删除.新增等生成Word文件.所以,根据模板生成WORD文件实质就是由用户数据替换XML文件中特殊标签,然后另存为一个DOC文件的过

  • java使用poi读取ppt文件和poi读取excel、word示例

    Apache的POI项目可以用来处理MS Office文档,codeplex上还有一个它的.net版本.POI项目可创建和维护操作各种基于OOXML和OLE2文件格式的Java API.大多数MS Office都是OLE2格式的.POI通HSMF子项目来支持Outlook,通过HDGF子项目来支持Visio,通过HPBF子项目来支持Publisher. 使用POI抽取Word简单示例: 要引入poi-3.7.jat和poi-scratchpad-3.7.ajr这两个包. 复制代码 代码如下: p

  • java导出生成word的简单方法

    最近做的项目,需要将一些信息导出到word中.在网上找了好多解决方案,现在将这几天的总结分享一下. 目前来看,java导出word大致有6种解决方案: 1.Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用.DLL动态链接库的生成需要windows平台的支持.该方案只能在windows平台实现,是其局限性. 2.Apache POI包括一系列的API,它

  • java读取word-excel-ppt文件代码

    WORD: import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.poi.hwpf.extractor.WordExtractor; import java.io.File; import java.io.InputStream; import java.io.FileInputStream; import com.search.code.Ind

  • Java用freemarker导出word实用示例

    最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子. 一.模板的制作 先用Word做一个模板,如下图: (注意,上面是有表格的,我设置了边框不可见)然后另存为XML文件,之后用工具打开这个xml文件,有人用firstobject XML Editor感觉还不如notepad++,我这里用notepad++,主要是有高亮显示,和元素自动配对,效果如下: 上面黑色的地方基本是我们之后要替换的地

  • 实例讲解Java读取一般文本文件和word文档的方法

    一般文本文件 我们以日志文件.log文件为例: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class File_Test { /** * @param args */ pub

  • 使用Java读取Word文件的简单例子分享

    java读取word文档时,虽然网上介绍了很多插件poi.java2Word.jacob.itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用):java2Word.jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄:itxt好像写很方便但是我查了好久资料没有见到过关于读的好办法.经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,

随机推荐