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

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

 其中param1和param2是在表格之内的,而param3和param4是在表格之外的,之后我们分别对param1和param3使用“\r”换行,而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();
      //在表格内使用“\r”是不能换行的
      range.replaceText("${param1}", "参数1的内容\r换行");
      //(char)11就代表一个换行符可以用在表格中
      range.replaceText("${param2}", "参数2的内容"+(char)11+"换行");
      //非表格内使用“\r”是可以换行的
      range.replaceText("${param3}", "参数3的内容\r换行");
      //非表格内使用“(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使用“\r”没有换行,而表格内的参数使用“(char)11”则换行了;表格外的参数param3使用“\r”换行了,而表格外的参数param4使用“(char)11”也换行了。

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

posted @ 2014-11-12 10:30  雨中飞鹭  阅读(2306)  评论(1编辑  收藏  举报