导出指定格式的文档 -宏变量

这篇博客介绍了如何使用Java的Apache POI库动态生成Word文档。首先创建一个预设格式的Word模板,然后通过XWPFDocument对象读取模板,替换宏变量为实际数据,如用户ID、姓名和状态。最后,将生成的Word文档以HTTP响应的方式输出给用户下载。整个过程涉及到文件流处理和字符串替换操作。
摘要由CSDN通过智能技术生成

1、首先自己新建一个word文档,将需要导出的文档格式事先编辑好,设置宏变量后,后续替换成对应的数据;
例如:
需要导出的指定格式的文档
后面##就是宏变量需要替换对应的数据;

2、由于导出docx文档,需要使用到XWPFDocument对象,需引入依赖:

<dependency>
  <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version>
  </dependency>

poi-ooxml 是 poi的升级版本,所以之前excel导入时引的poi依赖也可以用这个依赖替代
3、service核心代码
wordInfo方法:给controller层调用的方法

public void wordInfo(HttpServletResponse response){
    //获取用户信息
    UserEntity userEntity = testMapper.queryUser("1");
    //生成word文档
    XWPFDocument xwpfDocument = this.exportWord(userEntity);
    //5、输出流
    BufferedOutputStream fos = null;
    try{
      String fileName = "学生信息表.docx";
      response.setContentType("application/x-msdownload");
      response.setHeader("Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("UTF-8"), "ISO8859-1" ));
      fos = new BufferedOutputStream(response.getOutputStream());
      xwpfDocument.write(fos);
      fos.close();
    }catch (Exception e){
      log.error("新债信息模板数据转字节输出流异常!"+e);
    }
  }

生成word文件的方法:exportWord

private XWPFDocument exportWord(UserEntity userEntity) {
    //通过文件路径获取到文件流转化为word,并将其中的宏变量替换成对应的数据
    XWPFDocument xwpfDocument = null;
    try {
      String fileName = "file_model" + File.separator  + "学生信息表.docx";
      ClassPathResource classPathResource = new ClassPathResource(fileName);
      InputStream is = classPathResource.getInputStream();
      xwpfDocument = new XWPFDocument(is);
      List<XWPFTable> tables = xwpfDocument.getTables();
      for (XWPFTable table : tables) {
        List<XWPFTableRow> rows = table.getRows();
        for (XWPFTableRow row : rows) {
          List<XWPFTableCell> cells = row.getTableCells();
          for (XWPFTableCell cell : cells) {
            List<XWPFParagraph> paragraphs = cell.getParagraphs();
            for (XWPFParagraph paragraph : paragraphs) {
              String paragraphText = paragraph.getText();
              List<XWPFRun> runs = paragraph.getRuns();
              Iterator<XWPFRun> xwpfRunIterator = runs.iterator();
              while (xwpfRunIterator.hasNext()) {
                XWPFRun xwpfRun = xwpfRunIterator.next();
                xwpfRun.setText("", 0);
              }
              this.replaceXwpfRunsText(paragraphText, runs, userEntity);
            }
          }
        }
      }
    } catch (Exception e) {
      log.error("生成学生信息表异常!" + e);
    }
    return xwpfDocument;
  }

替换word文本中的宏变量的方法:replaceXwpfRunsText

 public void replaceXwpfRunsText(String xwpfParagraphText, List<XWPFRun> runs,
      UserEntity entity) {
    if (!StringUtils.hasText(xwpfParagraphText) || CollectionUtils.isEmpty(runs)) {
      return;
    }
    if (xwpfParagraphText.contains("#USER_ID#")) {
      String userId = entity.getUserId();
      if (!StringUtils.hasText(userId)) {
        userId = "";
      }
      xwpfParagraphText = xwpfParagraphText.replaceAll("#USER_ID#", userId);
    }
    if (xwpfParagraphText.contains("#NAME#")) {
      String userName = entity.getUserName();
      if (!StringUtils.hasText(userName)) {
        userName = "";
      }
      xwpfParagraphText = xwpfParagraphText.replaceAll("#NAME#", userName);
    }
    if (xwpfParagraphText.contains("#STATUS#")) {
      String userStatus = entity.getUserStatus();
      if (!StringUtils.hasText(userStatus)) {
        userStatus = "";
      }
      xwpfParagraphText = xwpfParagraphText.replaceAll("#STATUS#", userStatus);
    }
    runs.get(0).setText(xwpfParagraphText, 0);
  }

4、运行结果:
浏览器输入controller配置的路径,调用刚刚写好的方法
导出的word文档效果如下:
结果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值