admin管理员组文章数量:1662626
我需要读取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/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;
}
本文标签: PageOffice
版权声明:本文标题:使用pageoffice的坑 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1729954988a1217279.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论