最近在开发Android项目时,需要在应用内部打开Office资源文件。在查询了相关资料后得出了两种思路:
1.在后台统一资源格式,将Office格式转成PDF格式,Android端直接利用PDFView查看资源文件。后端利用 OpenOffice + jodconverter 将Office转为PDF。
2.Android端利用POI解析Office,很不幸POI在Android中无法解析PPT文件,而且Word、Excel解析后排版不美观,解析能力差。
本人采取第一种方案:
搭建好 OpenOffice + jodconverter 后,转换doc(97-2003)时正常,但是转换 docx 时报了以下错误:
java.lang.IllegalArgumentException: unknowndocumentformatforfile: E:\word.docx
查询了相关资料后,发现 jodconverter 2.2.1 版本不支持 docx、xlsx、pptx 转换。Maven 中也没有 2.2.2版本的,折腾了一番后终于找到解决方案,就是重写 jodconverter 中的BasicDocumentFormatRegistry方法
packagecom.artofsolving.jodconverter; importjava.util.ArrayList; importjava.util.Iterator; importjava.util.List; /*** CQL* 重写 BasicDocumentFormatRegistry 文档格式*/publicclassBasicDocumentFormatRegistryimplementsDocumentFormatRegistry { privateList/* <DocumentFormat> */documentFormats=newArrayList(); publicvoidaddDocumentFormat(DocumentFormatdocumentFormat) { documentFormats.add(documentFormat); } protectedList/* <DocumentFormat> */getDocumentFormats() { returndocumentFormats; } /*** @param extension* the file extension* @return the DocumentFormat for this extension, or null if the extension* is not mapped*/publicDocumentFormatgetFormatByFileExtension(Stringextension) { if (extension==null) { returnnull; } //new DefaultDocumentFormatRegistry();//将文件名后缀统一转化if (extension.indexOf("doc") >=0) { extension="doc"; } if (extension.indexOf("ppt") >=0) { extension="ppt"; } if (extension.indexOf("xls") >=0) { extension="xls"; } StringlowerExtension=extension.toLowerCase(); for (Iteratorit=documentFormats.iterator(); it.hasNext();) { DocumentFormatformat= (DocumentFormat) it.next(); if (format.getFileExtension().equals(lowerExtension)) { returnformat; } } returnnull; } publicDocumentFormatgetFormatByMimeType(StringmimeType) { for (Iteratorit=documentFormats.iterator(); it.hasNext();) { DocumentFormatformat= (DocumentFormat) it.next(); if (format.getMimeType().equals(mimeType)) { returnformat; } } returnnull; } }
注意:需要创建一个同名的包
亲测,docx、xlsx、ppts均转换成功!