zoukankan      html  css  js  c++  java
  • poi读写doc和docx

     

    https://www.cnblogs.com/always-online/p/4800131.html

     POI是 Apache 旗下一款读写计算机中的 word 以及 excel 文件的工具。

     poi文档官方网站https://poi.apache.org/

    • HWPF 是 POI 支持 Word(97-2003) 的 Java 组件,支持读写Word文档,但是写功能目前只实现一部分;它也提供更早版本的Word6和Word95版本的简单的文本摘录功能。

    • XWPF是 POI 支持 Word 2007+ 的 Java组件,提供简单文件的读写功能。

    • HSSF提供读写Microsoft Excel XLS格式档案的功能
    • XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。
    • HSLF提供读写Microsoft PowerPoint格式档案的功能。
    • HDGF提供读Microsoft Visio格式档案的功能。
    • HPBF提供读Microsoft Publisher格式档案的功能。
    • HSMF提供读Microsoft Outlook格式档案的功能。

    组件图

    Apache POI发行版包括对许多文档文件格式的支持。几个Jar文件中提供了此支持。并非每种格式都需要所有的Jar。下表显示了POI组件,Maven存储库标签和项目的Jar文件之间的关系。

    零件应用类型Maven工件ID笔记
    POIFS OLE2文件系统 poi 需要使用基于OLE2 / POIFS的文件
    惠普 OLE2属性集 poi  
    高速钢 Excel XLS poi 仅对于HSSF,如果需要通用SS,请参见下文
    HSLF PowerPoint PPT 便签本  
    硬毛PF Word文档 便签本  
    高密度纤维蛋白 Visio VSD 便签本  
    高炉 发布者PUB 便签本  
    HSMF 展望味精 便签本  
    DDF 埃舍尔普通图纸 poi  
    汉王 WMF图纸 便签本  
    OpenXML4J OOXML poi-ooxml加上poi-ooxml-schemas
    ooxml-schemasooxml-security
    请参阅以下注释,了解这些选项之间的差异
    XSSF Excel XLSX poi-ooxml  
    XSLF PowerPoint PPTX poi-ooxml  
    XWPF Word DOCX poi-ooxml  
    XDGF Visio VSDX poi-ooxml  
    普通SL PowerPoint PPT和PPTX poi-scratchpadpoi-ooxml SL代码位于核心POI jar中,但实现位于poi-scratchpad和poi-ooxml中。
    普通SS Excel XLS和XLSX poi-ooxml WorkbookFactory和朋友们都需要poi-ooxml,而不仅仅是核心poi

    docx需要依赖

    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.document</artifactId>
        <version>1.0.5</version>
    </dependency>
    <dependency>  
        <groupId>fr.opensagres.xdocreport</groupId>  
        <artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>  
        <version>1.0.5</version>  
    </dependency>

    doc需要依赖

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.12</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-scratchpad</artifactId>
        <version>3.12</version>
    </dependency>

    package com.test.word;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    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.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.converter.PicturesManager;
    import org.apache.poi.hwpf.converter.WordToHtmlConverter;
    import org.apache.poi.hwpf.usermodel.PictureType;
    import org.apache.poi.xwpf.converter.core.FileImageExtractor;
    import org.apache.poi.xwpf.converter.core.FileURIResolver;
    import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
    import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.junit.Test;
    import org.w3c.dom.Document;
    
    /**
     * word 转换成html
     */
    public class WordToHtml {
        
        /**
         * 2007版本word转换成html
         * @throws IOException
         */
        @Test 
        public void Word2007ToHtml() throws IOException {
            String filepath = "C:/test/";
            String fileName = "滕王阁序2007.docx";
            String htmlName = "滕王阁序2007.html";
            final String file = filepath + fileName;
            File f = new File(file);  
            if (!f.exists()) {  
                System.out.println("Sorry File does not Exists!");  
            } else {  
                if (f.getName().endsWith(".docx") || f.getName().endsWith(".DOCX")) {  
                      
                    // 1) 加载word文档生成 XWPFDocument对象  
                    InputStream in = new FileInputStream(f);  
                    XWPFDocument document = new XWPFDocument(in);  
      
                    // 2) 解析 XHTML配置 (这里设置IURIResolver来设置图片存放的目录)  
                    File imageFolderFile = new File(filepath);  
                    XHTMLOptions options = XHTMLOptions.create().URIResolver(new FileURIResolver(imageFolderFile));  
                    options.setExtractor(new FileImageExtractor(imageFolderFile));  
                    options.setIgnoreStylesIfUnused(false);  
                    options.setFragment(true);  
                      
                    // 3) 将 XWPFDocument转换成XHTML  
                    OutputStream out = new FileOutputStream(new File(filepath + htmlName));  
                    XHTMLConverter.getInstance().convert(document, out, options);  
                    
                    //也可以使用字符数组流获取解析的内容
    //                ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    //                XHTMLConverter.getInstance().convert(document, baos, options);  
    //                String content = baos.toString();
    //                System.out.println(content);
    //                 baos.close();
                } else {  
                    System.out.println("Enter only MS Office 2007+ files");  
                }  
            }  
        }  
        
        /**
         * /**
         * 2003版本word转换成html
         * @throws IOException
         * @throws TransformerException
         * @throws ParserConfigurationException
         */
        @Test 
        public void Word2003ToHtml() throws IOException, TransformerException, ParserConfigurationException {
            String filepath = "C:/test/";
            final String imagepath = "C:/test/image/";
            String fileName = "滕王阁序2003.doc";
            String htmlName = "滕王阁序2003.html";
            final String file = filepath + fileName;
            InputStream input = new FileInputStream(new File(file));
            HWPFDocument wordDocument = new HWPFDocument(input);
            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) {
                    File imgPath = new File(imagepath);
                    if(!imgPath.exists()){//图片目录不存在则创建
                        imgPath.mkdirs();
                    }
                    File file = new File(imagepath + suggestedName);
                    try {
                        OutputStream os = new FileOutputStream(file);
                        os.write(content);
                        os.close();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return imagepath + suggestedName;
                }
            });
            
            //解析word文档
            wordToHtmlConverter.processDocument(wordDocument);
            Document htmlDocument = wordToHtmlConverter.getDocument();
            
            File htmlFile = new File(filepath + htmlName);
            OutputStream outStream = new FileOutputStream(htmlFile);
            
            //也可以使用字符数组流获取解析的内容
    //        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    //        OutputStream outStream = new BufferedOutputStream(baos);
    
            DOMSource domSource = new DOMSource(htmlDocument);
            StreamResult streamResult = new StreamResult(outStream);
    
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer serializer = factory.newTransformer();
            serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
            serializer.setOutputProperty(OutputKeys.INDENT, "yes");
            serializer.setOutputProperty(OutputKeys.METHOD, "html");
            
            serializer.transform(domSource, streamResult);
    
            //也可以使用字符数组流获取解析的内容
    //        String content = baos.toString();
    //        System.out.println(content);
    //        baos.close();
            outStream.close();
        }
    }

    更多参考:https://www.iteye.com/blog/elim-2031335

    关于异常

    无端错误一般都是jar包问题,jar包冲突

    org.apache.poi.poifs.filesystem.OfficeXmlFileException: 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)

     处理2003的doc(OLE2 )不能处理2007的docx(+XML),doc——HWPF,docx需要XWPF

    poi操作报错java.lang.NoSuchMethodError: org.apache.poi.util.POILogger.log(I[Ljava/lang/Object;)

    这个错误最可能的原因是poi的jar包使用了多个版本,好吧,其实我已经把老jar包从java build path里面删掉了,但是还有这个报错。

    有一个可以检测class文件走哪个jar包的代码,很不错,以后迷茫时可以用用,这里粘过来分享下:

    ClassLoader classloader =
       org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
    URL res = classloader.getR

    esource(
                 "org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
    String path = res.getPath();
    System.out.println("POI Core came from " + path);

    classloader = org.apache.poi.POIXMLDocument.class.getClassLoader();
    res = classloader.getResource("org/apache/poi/POIXMLDocument.class");
    path = res.getPath();
    System.out.println("POI OOXML came from " + path);

    classloader = org.apache.poi.hslf.HSLFSlideShow.class.getClassLoader();
    res = classloader.getResource("org/apache/poi/hslf/HSLFSlideShow.class");
    path = res.getPath();
    System.out.println("POI Scratchpad came from " + path);

    检测后,发现确实有一个class走了老包,只删java build path没生效。后来把workspace里面的包删了再把project clean一下,然后重新部署,OK,问题解决了!

    lhttp://blog.sina.com.cn/s/blog_66dddb8b0102xp9s.html

  • 相关阅读:
    使用VC++生成调试信息
    在Xp home上安装Rose 2003
    SkyDrive注册方法
    vsftpd同时使用系统用户和虚拟用户验证
    如何查看linux系统版本
    在RedHat AS中安装SVN
    Vnc & Gdm
    (转)如何:在设备上安装 SQL Server Compact 3.5
    java培训学习笔记一
    因为此版本的应用程序不支持其项目类型(.csproj),若要打开它,请使用支持此类型项
  • 原文地址:https://www.cnblogs.com/lvhouhou/p/12016716.html
Copyright © 2011-2022 走看看