Android中操作Excel文件导出报表时主要采用开源库jxl,最早用在java上,但也可用于Android。与之类似的POI,因为依赖库众多,所以只能用于java,而不能用于Android。
使用jxl需要在Android工程中导入jxl.jar包,jxl可以完成Excel的基本读写操作,其支持与不支持的情况如下:
1、jxl只支持Excel2003格式,不支持Excel2007格式。即支持xls文件,不支持xlsx文件。
2、jxl不支持直接修改excel文件,但可通过复制新文件覆盖原文件的方式来间接修改。
3、jxl只能识别PNG格式的图片,不能识别其他格式的图片。
上面可以看出,jxl不支持Excel2007,这个很不好,尤其是目前Excel2007已经成为Excel主流格式的时候。不过现在还有个实现Android读取2007格式的临时办法,如果我们仔细分析xlsx的文件格式,会发现xlsx文件其实是个压缩包,压缩包里有各种文件,其中数据一般是放在"xl/sharedStrings.xml"和"xl/worksheets/sheet1.xml"中。据此,我们判断Excel文件为2007格式时,便可以将其解压,然后从中提取出sharedStrings.xml和sheet1.xml,接着使用XML解析工具把具体数据解析出来。
下面是Excel文件的读写代码例子,其中支持2003格式的读和写,以及2007格式的读:
importjava.io.File;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipException;
importjava.util.zip.ZipFile;
importorg.xmlpull.v1.XmlPullParser;
importorg.xmlpull.v1.XmlPullParserException;
importandroid.util.Log;
importandroid.util.Xml;
importjxl.Sheet;
importjxl.Workbook;
importjxl.write.Label;
importjxl.write.WritableSheet;
importjxl.write.WritableWorkbook;
publicclassExcelUtil{
privatefinalstaticStringTAG="ExcelUtil";
publicstaticList>read(Stringfile_name){
Stringextension=file_name.lastIndexOf(".")==-1?"":file_name
.substring(file_name.lastIndexOf(".")+1);
if("xls".equals(extension)){//2003
Log.d(TAG,"read2003XLS,extension:"+extension);
returnread2003XLS(file_name);
}elseif("xlsx".equals(extension)){
Log.d(TAG,"read2007XLSX,extension:"+extension);
returnread2007XLSX(file_name);
}else{
Log.d(TAG,"不支持的文件类型,extension:"+extension);
returnnull;
}
}
publicstaticList>read2003XLS(Stringpath){
List>dataList=newArrayList>();
try{
Workbookbook=Workbook.getWorkbook(newFile(path));
//book.getNumberOfSheets();//获取sheet页的数目
//获得第一个工作表对象
Sheetsheet=book.getSheet(0);
intRows=sheet.getRows();
intCols=sheet.getColumns();
Log.d(TAG,"当前工作表的名字:"+sheet.getName());
Log.d(TAG,"总行数:"+Rows+",总列数:"+Cols);
List