在使用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所写)