`
chembo
  • 浏览: 938429 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

poi完美word转html(表格、图片、样式)

    博客分类:
  • poi
阅读更多
直入正题,需求为页面预览word文档,用的是poi3.8,以下代码支持表格、图片,不支持分页,只支持doc,不支持docx;
/**
 * 
 */


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.List;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.PicturesManager;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.model.PicturesTable;
import org.apache.poi.hwpf.usermodel.CharacterRun;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Table;
import org.apache.poi.hwpf.usermodel.TableCell;
import org.apache.poi.hwpf.usermodel.TableIterator;
import org.apache.poi.hwpf.usermodel.TableRow;
import org.w3c.dom.Document;

/**
 * @author: Chembo Huang
 * @since: May 3, 2012
 * @modified: May 3, 2012
 * @version:
 */
public class Word2Html {

	public static void main(String argv[]) {
		try {
			convert2Html("D://1.doc","D://1.html");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void writeFile(String content, String path) {
		FileOutputStream fos = null;
		BufferedWriter bw = null;
		try {
			File file = new File(path);
			fos = new FileOutputStream(file);
			bw = new BufferedWriter(new OutputStreamWriter(fos,"GB2312"));
			bw.write(content);
		} catch (FileNotFoundException fnfe) {
			fnfe.printStackTrace();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} finally {
			try {
				if (bw != null)
					bw.close();
				if (fos != null)
					fos.close();
			} catch (IOException ie) {
			}
		}
	}

	public static void convert2Html(String fileName, String outPutFile)
			throws TransformerException, IOException,
			ParserConfigurationException {
		HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(fileName));//WordToHtmlUtils.loadDoc(new FileInputStream(inputFile));
		WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
				DocumentBuilderFactory.newInstance().newDocumentBuilder()
						.newDocument());
		 wordToHtmlConverter.setPicturesManager( new PicturesManager()
         {
             public String savePicture( byte[] content,
                     PictureType pictureType, String suggestedName,
                     float widthInches, float heightInches )
             {
                 return "test/"+suggestedName;
             }
         } );
		wordToHtmlConverter.processDocument(wordDocument);
		//save pictures
		List pics=wordDocument.getPicturesTable().getAllPictures();
		if(pics!=null){
			for(int i=0;i<pics.size();i++){
				Picture pic = (Picture)pics.get(i);
				System.out.println();
				try {
					pic.writeImageContent(new FileOutputStream("D:/test/"
							+ pic.suggestFullFileName()));
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				}  
			}
		}
		Document htmlDocument = wordToHtmlConverter.getDocument();
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		DOMSource domSource = new DOMSource(htmlDocument);
		StreamResult streamResult = new StreamResult(out);

		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer serializer = tf.newTransformer();
		serializer.setOutputProperty(OutputKeys.ENCODING, "GB2312");
		serializer.setOutputProperty(OutputKeys.INDENT, "yes");
		serializer.setOutputProperty(OutputKeys.METHOD, "html");
		serializer.transform(domSource, streamResult);
		out.close();
		writeFile(new String(out.toByteArray()), outPutFile);
	}
}





  • 大小: 118.2 KB
  • 大小: 106.9 KB
分享到:
评论
41 楼 zhanglongbin 2016-05-03  
感谢楼主分享!!
我遇到的问题:本地word转html 两个编码用GB2312,乱码! 两个改为UTF-8 解决。
部署到服务器 中文部分乱码,捣鼓来捣鼓去各种不同的转码都解决不了,最后
serializer.setOutputProperty(OutputKeys.ENCODING, "GB2312");
bw = new BufferedWriter(new OutputStreamWriter(fos,"UTF-8"));  这样转码服务器正常,但是本地调试中文乱码。   楼主知道其中原因么?为什么不同的电脑不一样?
40 楼 wjs876046992 2016-04-18  
文档编号显示不对,读出来全是1和1.1,我的文档是1,1.1,1.2.3.。。。。。这样子的。有什么办法解决吗?
39 楼 408729253 2015-12-09  
为什么我转换的是乱码?
38 楼 huazi221 2015-05-16  
请问楼主 ,用poi如何获取word文档中的每一个页面??

比如一个word有三个页面,我想获取这个3个页面 然后分别做处理 ,一直找不到api是哪个
求教
37 楼 chembo 2015-01-14  
jiefalcon 写道
怎么兼容读取docx.xlsx,xls


貌似支持不了。亲,上面就是源码了。
36 楼 jiefalcon 2015-01-08  
怎么兼容读取docx.xlsx,xls
35 楼 jiefalcon 2015-01-08  
哥们 可以把源码共享下吗
34 楼 奔跑者java 2014-12-10  
你好,我在项目中需要用到word转html,也从网上弄了个例子,但是总会报一个 The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)。网上查了下,没有找到问题。所以想像你请教一下,这问题你遇到过没?
33 楼 chembo 2014-10-28  
feng_xing2 写道
这种从本地读取的都简单,关键是实际项目中的读取是不会从本地读取的,一般都是通过文件上传读取的,不知道楼主从文件上传中获取word文件内容有没有做出来,我写的从文件上传中读取HWPFDocument doc = new HWPFDocument(request.getInputStream()); 这么写直接报错
java.io.IOException: Invalid header signature; read 0x65572D2D2D2D2D2D, expected 0xE11AB1A1E011CFD0

可以尝试先存入本地,再从本地读取。
32 楼 feng_xing2 2014-10-14  
这种从本地读取的都简单,关键是实际项目中的读取是不会从本地读取的,一般都是通过文件上传读取的,不知道楼主从文件上传中获取word文件内容有没有做出来,我写的从文件上传中读取HWPFDocument doc = new HWPFDocument(request.getInputStream()); 这么写直接报错
java.io.IOException: Invalid header signature; read 0x65572D2D2D2D2D2D, expected 0xE11AB1A1E011CFD0
31 楼 zhanghao88915 2014-09-17  
我引用的jar包不对吗 报错org.apache.poi.hwpf.model.CHPX cannot be cast to org.apache.poi.hwpf.usermodel.Range
30 楼 zhanghao88915 2014-09-17  
没有源码吗
29 楼 you2790 2014-08-18  
拨弦waitC 写道
为什么运行到这句wordToHtmlConverter.processDocument(wordDocument),
然后就出错,出错信息是:java.lang.NoSuchMethodError: org.w3c.dom.Attr.getTextContent()Ljava/lang/String;

你少了个包呗  poi-scratchpad-3.8-20120326.jar
28 楼 拨弦waitC 2014-04-25  
为什么运行到这句wordToHtmlConverter.processDocument(wordDocument),
然后就出错,出错信息是:java.lang.NoSuchMethodError: org.w3c.dom.Attr.getTextContent()Ljava/lang/String;
27 楼 e_endswell 2013-12-13  
如何区分来源 doc 的分页,然后我想尽量把输出的html 也做成类似doc的一页一页。然后转成pdf
26 楼 a30292330 2013-12-09  
楼主,你好,我想问一下,我按照你的方法进行转换以后,为什么格式会变化呢?
25 楼 chembo 2013-11-26  
waytofall 写道
chembo 写道
waytofall 写道
哥们儿一个奇怪的问题,
bw = new BufferedWriter(new OutputStreamWriter(fos,"GB2312"));
serializer.setOutputProperty(OutputKeys.ENCODING, "GB2312"); 
两处如果改成utf-8就会出现乱码。html页面显示是乱码,用notepad++打开源代码也是乱码。
很奇怪,按说这个只是输出的编码问题,word应该是默认unicode编码的吧,如果输出GB2312能正确,说明解码没问题,那为什输出utf-8会出问题呢?

是的,我也发现了这个问题,我的处理就是偷懒,写死了gb2312;后来也没时间去看一下源代码,你要是有时间发现问题在哪,记得也告诉我一下!

这个问题我知道怎么回事了,不是poi的问题,而是java读写文件的问题。以utf-8为编码写完文件用notepad++打开是能正常显示无乱码的,用菜单中的工具查看其编码为utf-8无bom。无bom格式的好像用浏览器打开是会乱码的(而GBK等ANSI编码的文件是能正确打开的),如果用notepad++将编码改为utf-8(也就是带bom的),则浏览器是能正确打开的(我用的chrome)。java写文件的时候都是默认不写bom的,你可以在文件开头把bom写进去,然后再写文件内容。:)

  专业素养!
24 楼 waytofall 2013-11-25  
chembo 写道
waytofall 写道
哥们儿一个奇怪的问题,
bw = new BufferedWriter(new OutputStreamWriter(fos,"GB2312"));
serializer.setOutputProperty(OutputKeys.ENCODING, "GB2312"); 
两处如果改成utf-8就会出现乱码。html页面显示是乱码,用notepad++打开源代码也是乱码。
很奇怪,按说这个只是输出的编码问题,word应该是默认unicode编码的吧,如果输出GB2312能正确,说明解码没问题,那为什输出utf-8会出问题呢?

是的,我也发现了这个问题,我的处理就是偷懒,写死了gb2312;后来也没时间去看一下源代码,你要是有时间发现问题在哪,记得也告诉我一下!

这个问题我知道怎么回事了,不是poi的问题,而是java读写文件的问题。以utf-8为编码写完文件用notepad++打开是能正常显示无乱码的,用菜单中的工具查看其编码为utf-8无bom。无bom格式的好像用浏览器打开是会乱码的(而GBK等ANSI编码的文件是能正确打开的),如果用notepad++将编码改为utf-8(也就是带bom的),则浏览器是能正确打开的(我用的chrome)。java写文件的时候都是默认不写bom的,你可以在文件开头把bom写进去,然后再写文件内容。:)
23 楼 chembo 2013-09-26  
waytofall 写道
哥们儿一个奇怪的问题,
bw = new BufferedWriter(new OutputStreamWriter(fos,"GB2312"));
serializer.setOutputProperty(OutputKeys.ENCODING, "GB2312"); 
两处如果改成utf-8就会出现乱码。html页面显示是乱码,用notepad++打开源代码也是乱码。
很奇怪,按说这个只是输出的编码问题,word应该是默认unicode编码的吧,如果输出GB2312能正确,说明解码没问题,那为什输出utf-8会出问题呢?

是的,我也发现了这个问题,我的处理就是偷懒,写死了gb2312;后来也没时间去看一下源代码,你要是有时间发现问题在哪,记得也告诉我一下!
22 楼 waytofall 2013-09-25  
哥们儿一个奇怪的问题,
bw = new BufferedWriter(new OutputStreamWriter(fos,"GB2312"));
serializer.setOutputProperty(OutputKeys.ENCODING, "GB2312"); 
两处如果改成utf-8就会出现乱码。html页面显示是乱码,用notepad++打开源代码也是乱码。
很奇怪,按说这个只是输出的编码问题,word应该是默认unicode编码的吧,如果输出GB2312能正确,说明解码没问题,那为什输出utf-8会出问题呢?

相关推荐

    poi将word转换成html、样式 表格 图片处理

    在本案例中,我们关注的是如何使用Apache POI将Word文档转换为HTML格式,并且保持原有的样式、表格和图片。下面我们将详细介绍这个过程中的关键知识点。 1. **Apache POI简介** Apache POI 提供了Java API,使得...

    poi完美word转html

    1. 表格:POI能识别Word文档中的表格,并将其转换为HTML中的table元素。 2. 图片:POI能识别Word文档中的图片,并将其转换为HTML中的img元素,同时保存图片文件并引用其路径。 3. 文本样式:虽然不能完全保留所有...

    利用POI将word转换成html实现在线阅读

    这包括添加适当的CSS样式来保持原始Word文档的布局和格式。 5. **在线阅读**:将生成的HTML文件上传至服务器,并在网页中通过iframe或者直接链接的方式展示,用户即可在线预览和阅读。 在实际操作中,需要注意以下...

    poi word转html例子及jar包

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Word(.doc、.docx)、Excel(.xls、.xlsx)和PowerPoint(.ppt、.pptx)。在Java环境中,Apache POI 提供了API,使得开发者能够读取、创建...

    基于poi导出word以及图片

    在本教程中,我们将重点讨论如何利用Apache POI 3.13版本来导出Word文档,并结合图片操作。 首先,Apache POI提供了一个叫做HWPF(Horrible Word Processor Format)的API来处理老版的Word(.doc)文件,而XWPF...

    word内容提取 word转html-POI wps doc docx转html

    1. **Word内容提取**:Apache POI提供了API来访问Word文档中的文本、样式、图像和表格。通过HWPFFactory和XWPFDocument类,我们可以分别处理旧版的.doc文件和较新的.docx文件。使用这些类,可以逐段、逐行地遍历文档...

    poi3.8 doc,excel转html

    标题提到的"poi3.8 doc,excel转html",指的是使用Apache POI库的3.8版本进行Microsoft Office文档(尤其是DOC和XLS)到HTML的转换。Apache POI是一个流行的Java库,专门用于读取、写入和操作Microsoft Office格式的...

    poi解析word文档 及 试卷数学公式导入wmf图片转成png图片

    在本场景中,可能涉及读取Word文档中的文本、样式、表格、图像等元素,以便进行进一步的处理或分析。 “试卷数学公式导入wmf图片转成png图片”这部分涉及到两个技术点。首先,试卷通常包含数学公式,这些公式可能以...

    cms.rar_cms word_poi word html_poi word转HTML_poi转Word

    "cms.rar_cms word_poi word html_poi word转HTML_poi转Word"这一标题提及的CMS可能是一个特定的项目或实现,它涉及到使用Apache POI库处理Microsoft Word文档,并将这些文档转换为HTML格式以供网页展示。Apache POI...

    java+poi实现word转换html兼容03和07

    `extractTextFromOldDoc`方法处理旧版Word文档,但在这里留空,因为实际的实现可能更复杂,需要处理样式、页眉、页脚、图片等。`extractTextFromNewDoc`方法则处理.docx文件,提取其中的段落和表格,并将其转换为...

    java+poi+word转pdf的简单demo,执行转换main方法不会抛异常

    在实践中,你可能还需要处理更复杂的格式和样式转换,例如图片、页眉和页脚、页边距等。这可能需要进一步研究iText库的API来实现。确保在处理过程中正确处理异常,以保证程序的健壮性。 提供的"word2pdfdemo"压缩包...

    Java Poi流根据Word模板插入相应的文本、表格和图片,并生成新的Word报告。

    在这个场景中,我们关注的是如何利用Java POI库通过Word模板生成包含特定文本、表格和图片的报告。 首先,我们需要了解Java POI中的XWPFDocument类,它是用来处理.docx文件的。XWPFDocument可以读取、修改和创建...

    poi操作word转html必须jar

    Apache POI 是一个开源项目,专门用于处理微软的Office...总之,Apache POI是一个强大的工具,它使Java开发者能够方便地处理Office文档,包括将Word转换为HTML,但可能需要一些额外的代码来处理特定的格式和样式问题。

    JAVA利用poi完成word转pdf,内容包括两个现成工具类和使用到的所有jar包

    1. 使用Apache POI的XWPF API读取Word文档,获取文档的文本、段落、表格等元素。 2. 创建一个Docx4j的WordprocessingMLPackage对象,加载POI解析出的Word文档内容。 3. 调用Docx4j的`WordprocessingMLPackage.toPDF...

    java word转html poi3.9

    在POI 3.9版本中,我们可以使用HWPF(Horrible Word Processor Format)来处理旧版的Word(.doc)文件,而XWPF则用于处理较新的Word 2007及以后版本的.docx文件。 转换Word到HTML的基本步骤如下: 1. **导入依赖**...

    java poi把word文档转化为html,支持doc。

    POI库提供API来访问Word文档的各个部分,如段落、表格、列表、图片等。 4. **使用步骤**: - 加载Word文档:使用POI的`HWPFDocument`类(针对.doc文件)或`XWPFDocument`类(针对.docx文件)打开Word文档。 - 遍历...

    java使用poi操作.doc word模板替换,循环插入表格

    本篇文章将深入探讨如何利用POI库在Word文档中进行模板替换以及循环插入表格的操作。 首先,我们需要理解Apache POI的工作原理。POI提供了HWPFOI(用于处理老版的.doc文件)和XWPF(用于处理新版的.docx文件)两个...

Global site tag (gtag.js) - Google Analytics