• POI写入word doc 03 模板的实例


     在使用POI写word doc文件的时候我们必须要先有一个doc文件才行,因为我们在写doc文件的时候是通过HWPFDocument来写的,而HWPFDocument是要依附于一个doc文件的。所以通常的做法是我们先在硬盘上准备好一个内容空白的doc文件,然后建立一个基于该空白文件的HWPFDocument。之后我们就可以往HWPFDocument里面新增内容了,然后再把它写入到另外一个doc文件中,这样就相当于我们使用POI生成了word doc文件。

           在实际应用中,我们在生成word文件的时候都是生成某一类文件,该类文件的格式是固定的,只是某些字段不一样罢了。所以在实际应用中,我们大可不必将整个word文件的内容都通过HWPFDocument生成。而是先在磁盘上新建一个word文档,其内容就是我们需要生成的word文件的内容,然后把里面一些属于变量的内容使用类似于“${paramName}”这样的方式代替。这样我们在基于某些信息生成word文件的时候,只需要获取基于该word文件的HWPFDocument,然后调用Range的replaceText()方法把对应的变量替换为对应的值即可,之后再把当前的HWPFDocument写入到新的输出流中。这种方式在实际应用中用的比较多,因为它不但可以减少我们的工作量,还可以让文本的格式更加的清晰。下面我们就来基于这种方式做一个示例。

           假设我们现在拥有一些变动的信息,然后需要通过这些信息生成如下格式的word doc文件: 

        

           那么根据上面的描述,首先第一步,我们建立一个对应格式的doc文件作为模板,其内容是这样的: 

           有了这样一个模板之后,我们就可以建立对应的HWPFDocument,然后替换对应的变量为相应的值,再把HWPFDocument输出到对应的输出流即可。下面是对应的代码。

    public class HwpfTest {
      
       @Test
       public void testWrite() throws Exception {
          String templatePath = "D:\word\template.doc";
          InputStream is = new FileInputStream(templatePath);
          HWPFDocument doc = new HWPFDocument(is);
          Range range = doc.getRange();
          //把range范围内的${reportDate}替换为当前的日期
          range.replaceText("${reportDate}", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
          range.replaceText("${appleAmt}", "100.00");
          range.replaceText("${bananaAmt}", "200.00");
          range.replaceText("${totalAmt}", "300.00");
          OutputStream os = new FileOutputStream("D:\word\write.doc");
          //把doc输出到输出流中
          doc.write(os);
          this.closeStream(os);
          this.closeStream(is);
       }
      
       /**
        * 关闭输入流
        * @param is
        */
       private void closeStream(InputStream is) {
          if (is != null) {
             try {
                is.close();
             } catch (IOException e) {
                e.printStackTrace();
             }
          }
       }
     
       /**
        * 关闭输出流
        * @param os
        */
       private void closeStream(OutputStream os) {
          if (os != null) {
             try {
                os.close();
             } catch (IOException e) {
                e.printStackTrace();
             }
          }
       }
      
     
    }

    Word换行

    Word换行主要有两大类,一类是表格单元格文本的换行,另一类是表格之外的文本的换行。对于表格外的文本我们可以使用“ ”或者“(char)11”来换行,然而对于表格内的文本我们只能使用“(char)11”来进行换行操作。

     下面来看一个示例,我们有如下这样一个word文件作为模板。

     其中param1和param2是在表格之内的,而param3和param4是在表格之外的,之后我们分别对param1和param3使用“ ”换行,而param2和param4用“(char)11”来换行,程序代码如下所示

    public void newLine() throws Exception {
          String templatePath = "D:\word\newLine.doc";
          InputStream is = new FileInputStream(templatePath);
          HWPFDocument doc = new HWPFDocument(is);
          Range range = doc.getRange();
          //在表格内使用“
    ”是不能换行的
          range.replaceText("${param1}", "参数1的内容
    换行");
          //(char)11就代表一个换行符可以用在表格中
          range.replaceText("${param2}", "参数2的内容"+(char)11+"换行");
          //非表格内使用“
    ”是可以换行的
          range.replaceText("${param3}", "参数3的内容
    换行");
          //非表格内使用“(char)11”也是可以换行的
          range.replaceText("${param4}", "参数4的内容"+(char)11+"换行");
          OutputStream os = new FileOutputStream("D:\word\newLine2.doc");
          doc.write(os);
          this.closeStream(os);
          this.closeStream(is);
       }

      程序运行之后,生成的文件newLine2的内容如下所示:

     我们可以看到表格内的param1使用“ ”没有换行,而表格内的参数使用“(char)11”则换行了;表格外的参数param3使用“ ”换行了,而表格外的参数param4使用“(char)11”也换行了。

    (注:本文是基于poi3.9所写)

  • 相关阅读:
    Swing-文本输入组件(一)
    JFrame常用属性设置模板
    Swing-BoxLayout用法-入门
    linux创建和查看用户命令
    elasticsearch,http://ip:9200访问不到的解决办法
    U盘制作Linux系统盘
    Linux中oracle的安装,亲测
    Linux中yum的安装
    Linux中oracle安装时候报ora-00119解决办法
    eclipse中多个工程编译到同一个目录下
  • 原文地址:https://www.cnblogs.com/estellez/p/4091364.html
Copyright © 2020-2023  润新知