Andriod中的文档在线查看功能,类似于网易邮箱大师中的附件预览功能,要求在app内直接打开office文档、pdf文档等。
思路一:后台统一转换文档格式,安卓端只预览一种格式文档。
在后台将office(Word、Excle、PPT)文档转换为pdf文档,在安卓端预览的时候,其实是从后台先把pdf文档下载到手机上,再去读取。
后台:openoffice + jodconverter将office文档转换为pdf格式。
集成难度不大,网上教程非常多,需要在服务器上安装openoffice,转换速度很慢(页数多特别明显,页数少的话速度在可以接受的范围之内,转换速度与文档大小关系不大,主要是文档页数)。
安卓端使用AndroidPdfViewer第三方库显示pdf文档。
就是使用第三方库,也很简单。
思路二:在安卓端完成文档转换
使用Apache的Poi组件,但是由于ppt在转换过程中需要用到java的awt,所以无法实现ppt的转换,也就是说只能实现word、excle的转换。如果项目中只是有转换word或者excle的需求,可以采用Poi。
具体是:使用Poi将doc、docx、xls、xlsx文档转换为html,再使用webview加载本地html。
这里要注意的是,Poi的jar包的导入。如果去apache的poi官网查看各组件的功能,以及要导入的jar包,但是网上的代码一般都是org.apache.poi.xwpf.converter.xhtml
这个库的。等你导入了这个库,又自己从官网上下载了poi、poi-ooxml等jar包引入后,很可能会导致编译出错,提示有重复文件。这是由于导入的jar包的版本不一致导致的。正确的导入方式可以参考下面的:
这个会自动把关联的jar包引入,从maven仓库可以看到这个jar的依赖,以及依赖的依赖,
总之很多,可以在project视图中External Libraries来查看这个库文件到底包含了哪些jar包。
compile 'fr.opensagres.xdocreport:org.apache.poi.xwpf.converter.xhtml:1.0.6'
---------------------------------------------------------------------------------------------------
这个主要是doc的转换用到的,可以不引入,网上也有很多转换方法没有用到这个库
//compile 'fr.opensagres.xdocreport:fr.opensagres.xdocreport.document:1.0.6'
---------------------------------------------------------------------------------------------------
这个库文件的版本至关重要,因为...xhtml:1.0.6中依赖的poi等jar的版本就是3.10-FINAL,
所以这里必须也是3.10-FINAL,不然编译肯定不会通过。
compile 'org.apache.poi:poi-scratchpad:3.10-FINAL'
总之,如果你在apache.poi官网上看各个组件之间的依赖关系有些困难,可以去maven看。
除了引入库文件以外,还需要在app的gradle文件中添加如下语句:
defaultConfig {
...
multiDexEnabled true
...
}
packagingOptions {
...
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
dexOptions {
javaMaxHeapSize "3g"
jumboMode = true
preDexLibraries = false
}
lintOptions {
abortOnError false
}
project.tasks.withType(com.android.build.gradle.tasks.Dex) {
additionalParameters = ['--core-library']
}
思路三:其他
POI由于预览效果不是很好,不建议使用(安卓无法转换ppt与pptx)
Flashpaper缺少后续支持,不建议使用(后台,与安卓无关)
第三方付费产品中,Office Web 365
完全依赖于第三方云服务,在安全性、灵活性、稳定性为验证,不建议使用
科瀚的SOAOffice和卓正软件的pageoffice需要浏览器Activex插件的支持,对用户不是很友好,不建议试用(后台,与安卓无关)
OpenOffice的预览效果稍差,但集成方便;
Office Web Apps预览效果最佳,钉钉、126等也采用此方式,但估计集成难度稍大,另外钉钉的预览偶尔也出现不稳定的情况;
永中office的预览效果和集成难度比较平衡,但需付费。
总之,除非需求必须,否则这种功能还是不要实现,因为难度很大,耗时费力,一般情况下交给系统去打开就行了。当然,主要功能是文档阅读的app除外。
一些代码参考
说明:大部分是从网上找的,仅供参考,功能没问题,但很多细节有待完善。
package com.ght.loginapp.utilities;
import org.apache.poi.hssf.converter.ExcelToHtmlConverter;
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.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
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.w3c.dom.Document;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
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 java.io.OutputStreamWriter;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
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.TransformerConfigurationException;
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.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apac