与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版相同了。 与Excel不同,Word实现导入导出,03版和07版差异较大。实现思路是:如果03版报异常,那就是用07版的解决办法。03版的解析相对简单。07版更复杂一下。1:创建03版doc对象:HWPFDocument doc = new HWPFDocument(xxx)    其中,xxx可以为文件流或者File对象,根据是不是需要保存为文件来自行选择。2:获取文件内容:String content ... public void importStaffInfo(MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws IOException { try { String name = file.getOriginalFilename(); HashMap<String,Object> map = null; 谢谢大佬,解决了我一个问题,配合下面的代码,可以判断一个url的图片是否存在,自己瞎写的,也想有更优雅的实现方式 [code=javascript] function isHasImg (url){//判断路径图片是否存在,文件不会,只找到image var Imgobj = new Image();//生成一个图片缓存,用来判断 Imgobj.onload = function () { if (Imgobj.fileSize > 0 || (Imgobj.width > 0 && Imgobj.height > 0)) { $("#addbook-upload").html('<img src=' + url + '></img><p>' + file.name + '</p>'); $("#addbook-upload").css("pointer-events", ""); ///完成之后,取消addbook - ok的失效 $(".addbook-ok").css("pointer-events", ""); } else { $("#addbook-upload").html('路径错误,请将图片放至目录!'); $("#addbook-upload").css("pointer-events", ""); ///完成之后,取消addbook - ok的失效 $(".addbook-ok").css("pointer-events", ""); Imgobj.src = url; [/code] MyBaTis报SSL错误Establishing SSL connection without server以及时区异常SQLxception: The server time zone value 谢谢大佬,已成功解决