Java实现Word的导入和导出

与Excel不同,Word实现导入导出,03版和07版差异较大。实现思路是:如果03版报异常,那就是用07版的解决办法。

03版的解析相对简单。07版更复杂一下。

1:创建03版doc对象:HWPFDocument doc = new HWPFDocument(xxx)    其中,xxx可以为文件流或者File对象,根据是不是需要保存为文件来自行选择。

2:获取文件内容:String content = doc.getDocumentText()。    如此就完成了03版doc的解析。

    需要注意的一点时,doc中为换行会解析为\r,使用时需要注意。

如果文件为07版,那么03版解析不正常,会报OfficeXmlFileException异常(大概是这个,具体可以试一下)。如果是其他类型的文件,那么就无能为力了。只能捕获一个异常然后提示文件类型错误。

07版的解析,可以在捕获OfficeXmlFileException后,执行07版的解析工作。

07版的解析是以段落为依据的。

1:创建07版doc对象:XWPFDocument docx = new XWPFDocument(xxx)      这里xxx同03版一样。

2:获取段落组合:List<XWPFParagraph> paragraphList = docx.getParagraphs();

3:创建一个StringBuilder来连接段落内容:StringBuilder content = new StringBuilder();

4:使用循环来获取整个内容:其中,使用XWPFPrargraph的实例方法:getText()来获取段落的字符串内容。

for( int i=0 ;i< paragraphList.size(); i++){

    if(i!=0){

        content.append("<br/>");    //这里是为除了第一段的段落前增加换行符

    }

    content.append(paragraphList.get(i).getText());

}

这就完成了word导入的解析。


导出Word。这里实现的思路是:本地有word模板,我们使用程序来完成对模板指定内容的替换,然后再导出。

这里先导出03版:

1:创建doc对象:HWPFDocument doc = new HWPFDocument(xxx)        这里xxx指定doc模板的路径

2:获取Rang对象:Rang range = doc.getRange()    此处不传参数代表整个doc范围。

3:替代文本中的内容:range.replaceText("${name}","赵四");    这里假设需要把doc中的${name}替换为 赵四。

下面还要输出内容。

4:设置response的头信息:response.setHeader("Content-Disposition","attachment;filename=xxx.doc");

5:获取输出流:ServletOutputStream outputStream = response.getOutputStream();

6:写doc:doc.write(outputStream);

这里直接写出了doc,没有先保存。

07版的导出更复杂一些:

1:创建doc对象:XWPFDocument docx = new XWPFDocument("xxx");    xxx为模板路径

2:获取段落组合:List<XWPFParagraph> paragraphList = docx.getParagraphs();

3:使用双层循环。外层循环段落,内层循环runs(runs为Run的集合,Run为一段中,没当文字格式变化了,那么就是一个新的Run),其中使用:Run的实例方法:getText(run.getTextPosition())来获取run的内容。然后替换run中的内容。如下代码:

for(XWPFParagraph paragraph : paragraphList){

    List<XWPFRun> runs = paragraph.getRuns();

    for(XWPFRun run : runs){

        String str = run.getText(run.getTextPosition());
        str = str.replace("${name}","赵四");        //由于String的不可变性,这里重新为str赋值。

    }

}
后面输出内容就和03版相同了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值