使用pageoffice的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37817685/article/details/81741248

               我需要读取pageoffice编辑保存后的文档内容,但是我们新建的word文件大多数都是iso88591格式的,所以读出后都是乱码,用了各种解码编码都不行,pageoffice生成的.htm文件本身是gb2312格式的,所以我用gb2312格式读出再转utf-8格式后没有出现乱码
               
               具体核心代码如下
               
     File fi=new File(htmlPath);
        if(fi.exists()) {
            try {
             ByteArrayOutputStream outHtml = new ByteArrayOutputStream(); 
             InputStream inn = new FileInputStream(fi);
             byte[] buffer = new byte[4096];  
             int len = 0;
             while((len = inn .read(buffer))!= -1 ){
                outHtml.write(buffer,0,len);
             }
             byte[] data = outHtml.toByteArray();
             htm=new String(data,"gb2312");
             htm=gb2312ToUtf8(htm);
             htm=htm.replaceAll(FileName,allcommonimagePath);
            }catch(IOException e) {
                e.printStackTrace();
                return false;
            }
        }
        
        
        // 将 GB2312 编码格式的字符串转换为 UTF-8 格式的字符串:

public static String gb2312ToUtf8(String str) {

        String urlEncode = "" ;

        try {
            urlEncode = URLEncoder.encode (str, "UTF-8" );

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        }
        
        return urlEncode;

}


但是对于生成的word文件怎么试都不行,读出都是乱码,我使用文件流写入另外一个文件也没乱码问题啊,后来发现因为两个文件编码格式都是iso88591,所以正常,

后来看资料说poi方式可以正常读出,试了一下果然可以,喜出望外,不料又带来了新的问题,poi的方式在不同电脑上会表现出不一样的,我的word编辑器是wps,使用如下方式读出文件内容(jar包自己网上找,我记得我用的是3.16,但是有个高版本的确没有,这里也被坑)
            FileInputStream fis = new FileInputStream(file);
                        HWPFDocument cx = new HWPFDocument(fis);
                        txtContent=cx.getDocumentText();

但是到了同事电脑(office)上却没有反应,查看日志报错了,错误the supplied data appears to be in the office 2007+xml,you are calling the part of POI that with OLE2 office Document .you need to call a different part of POI to process this data(eq XSSF of HSSF)
大致意思就是我需要调用不同的POI去处理不同的文档,网上看了一下XSSF表示2007+(2007之后的excel),HSSF支持2007-(2007之前的),
等效猜想word在HWPFD和XWPFD也是类似的特性,网上查了一下HWPF 是 POI 支持 Word(97-2003) 的 Java 组件,支持读写Word文档,但是写功能目前只实现一部分,XWPF是 POI 支持 Word 2007+ 的 Java组件
而我使用的的wps,我就郁闷了,于是查了一下wps和office的区别,wps兼容office,office不兼容wps,国产委屈脸。。
查看了一下解压安装包,发现我的wps外层文件夹是office6,也就解释通了我用了office6可以同事的office2007不行。
可能使用HWPFD和XWPFD对于wps和office来说就像excel对应XSSF和HSSF一样的特性,我试了wps的两个版本,office6和office7用XWPF都不行,但是用HWPDF确可以,office2007和office2013用XWPDF可以。
所以为了让用户都能读到数据,无论安装office还是wps,我就用了如下的写法:
File file=new File(pgFilePath);//创建一个新的file实例
        if(file.exists()){
            FileInputStream fis = new FileInputStream(file);
            logger.debug("读取内容前");
            XWPFDocument doc=null;
            try {
                OPCPackage po=OPCPackage.open(fis);
                doc = new XWPFDocument(po);
            } catch (InvalidFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(doc!=null){
                    XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
                    txtContent = extractor.getText();
                    extractor.close();
                    }else{
                        HWPFDocument cx = new HWPFDocument(fis);
                        txtContent=cx.getDocumentText();
                        cx.close();
                        fis.close();
                    }
                  return txtContent;
            }
        }else{
            return txtContent;
        }
        
以为问题解决了,但是一直出现
org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature; read 0x0000000000000000, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document
,郁闷,单独用XWPDF或者HWPFD都行,这样一起为什么不行
弄了好久没弄好,然后看到这里
https://stackoverflow.com/questions/33879515/notole2fileexception-invalid-header-signature-read-0x0000000000000000-expecte
So that explains why I get this error the next time I run the program and try to write the workbook on the same Excel file.
猛然悟出原来是自己习惯问题,文件流这里一直强调使用完需要关闭,我第一次    OPCPackage po=OPCPackage.open(fis);使用了FileInputStream,但是没有关闭,因为我的是wps,所以会走else,但是上一次的额fileinputstream并没有关闭,就直接想接着使用第二次,
两个连接用到inputstream,所以出现了该错误,改成如下后问题解决,不管if还是else都保证了文件字节流关闭,问题解决。


File file=new File(pgFilePath);//创建一个新的file实例
        if(file.exists()){
            FileInputStream fis = new FileInputStream(file);
            logger.debug("读取内容前");
            XWPFDocument doc=null;
            try {
                OPCPackage po=OPCPackage.open(fis);
                doc = new XWPFDocument(po);
            } catch (InvalidFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(doc!=null){
                    XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
                    txtContent = extractor.getText();
                    extractor.close();
                    fis.close();
                    }else{
                        fis.close();
                        fis = new FileInputStream(file);
                        HWPFDocument cx = new HWPFDocument(fis);
                        txtContent=cx.getDocumentText();
                        cx.close();
                        fis.close();
                    }
                  return txtContent;
            }
        }else{
            return txtContent;
        }

猜你喜欢

转载自blog.csdn.net/weixin_37817685/article/details/81741248
今日推荐