Android操作Excel文件的功能实现
程序员文章站
2023-11-29 13:32:52
android中操作excel文件导出报表时主要采用开源库jxl,最早用在java上,但也可用于android。与之类似的poi,因为依赖库众多,所以只能用于java,而不...
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格式的读:
import java.io.file; import java.io.ioexception; import java.io.inputstream; import java.util.arraylist; import java.util.list; import java.util.zip.zipentry; import java.util.zip.zipexception; import java.util.zip.zipfile; import org.xmlpull.v1.xmlpullparser; import org.xmlpull.v1.xmlpullparserexception; import android.util.log; import android.util.xml; import jxl.sheet; import jxl.workbook; import jxl.write.label; import jxl.write.writablesheet; import jxl.write.writableworkbook; public class excelutil { private final static string tag = "excelutil"; public static list<list<object>> read(string file_name) { string extension = file_name.lastindexof(".") == -1 ? "" : file_name .substring(file_name.lastindexof(".") + 1); if ("xls".equals(extension)) {// 2003 log.d(tag, "read2003xls, extension:" + extension); return read2003xls(file_name); } else if ("xlsx".equals(extension)) { log.d(tag, "read2007xlsx, extension:" + extension); return read2007xlsx(file_name); } else { log.d(tag, "不支持的文件类型, extension:" + extension); return null; } } public static list<list<object>> read2003xls(string path) { list<list<object>> datalist = new arraylist<list<object>>(); try { workbook book = workbook.getworkbook(new file(path)); // book.getnumberofsheets(); //获取sheet页的数目 // 获得第一个工作表对象 sheet sheet = book.getsheet(0); int rows = sheet.getrows(); int cols = sheet.getcolumns(); log.d(tag, "当前工作表的名字:" + sheet.getname()); log.d(tag, "总行数:" + rows + ", 总列数:" + cols); list<object> objlist = new arraylist<object>(); string val = null; for (int i = 0; i < rows; i++) { boolean null_row = true; for (int j = 0; j < cols; j++) { // getcell(col,row)获得单元格的值,注意getcell格式是先列后行,不是常见的先行后列 log.d(tag, (sheet.getcell(j, i)).getcontents() + "\t"); val = (sheet.getcell(j, i)).getcontents(); if (val == null || val.equals("")) { val = "null"; } else { null_row = false; } objlist.add(val); } log.d(tag, "\n"); if (null_row != true) { datalist.add(objlist); null_row = true; } objlist = new arraylist<object>(); } book.close(); } catch (exception e) { log.d(tag, e.getmessage()); } return datalist; } public static list<list<object>> read2007xlsx(string path) { list<list<object>> datalist = new arraylist<list<object>>(); string str_c = ""; string v = null; boolean flat = false; list<string> ls = new arraylist<string>(); try { zipfile xlsxfile = new zipfile(new file(path)); zipentry sharedstringxml = xlsxfile.getentry("xl/sharedstrings.xml"); if (sharedstringxml == null) { log.d(tag, "空文件:" + path); return datalist; } inputstream inputstream = xlsxfile.getinputstream(sharedstringxml); xmlpullparser xmlparser = xml.newpullparser(); xmlparser.setinput(inputstream, "utf-8"); int evttype = xmlparser.geteventtype(); while (evttype != xmlpullparser.end_document) { switch (evttype) { case xmlpullparser.start_tag: string tag = xmlparser.getname(); if (tag.equalsignorecase("t")) { ls.add(xmlparser.nexttext()); } break; case xmlpullparser.end_tag: break; default: break; } evttype = xmlparser.next(); } zipentry sheetxml = xlsxfile.getentry("xl/worksheets/sheet1.xml"); inputstream inputstreamsheet = xlsxfile.getinputstream(sheetxml); xmlpullparser xmlparsersheet = xml.newpullparser(); xmlparsersheet.setinput(inputstreamsheet, "utf-8"); int evttypesheet = xmlparsersheet.geteventtype(); list<object> objlist = new arraylist<object>(); string val = null; boolean null_row = true; while (evttypesheet != xmlpullparser.end_document) { switch (evttypesheet) { case xmlpullparser.start_tag: string tag = xmlparsersheet.getname(); if (tag.equalsignorecase("row")) { } else if (tag.equalsignorecase("c")) { string t = xmlparsersheet.getattributevalue(null, "t"); if (t != null) { flat = true; // 字符串型 // log.d(tag, flat + "有"); } else { // 非字符串型,可能是整型 // log.d(tag, flat + "没有"); flat = false; } } else if (tag.equalsignorecase("v")) { v = xmlparsersheet.nexttext(); if (v != null) { if (flat) { str_c += ls.get(integer.parseint(v)) + " "; val = ls.get(integer.parseint(v)); null_row = false; } else { str_c += v + " "; val = v; } objlist.add(val); } } break; case xmlpullparser.end_tag: if (xmlparsersheet.getname().equalsignorecase("row") && v != null) { str_c += "\n"; if (null_row != true) { datalist.add(objlist); null_row = true; } objlist = new arraylist<object>(); } break; } evttypesheet = xmlparsersheet.next(); } log.d(tag, str_c); } catch (zipexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } catch (xmlpullparserexception e) { e.printstacktrace(); } if (str_c == null) { str_c = "解析文件出现问题"; log.d(tag, str_c); } return datalist; } public static int writeexcel(string file_name, list<list<object>> data_list) { try { writableworkbook book = workbook.createworkbook(new file(file_name)); writablesheet sheet1 = book.createsheet("sheet1", 0); for (int i = 0; i < data_list.size(); i++) { list<object> obj_list = data_list.get(i); for (int j = 0; j < obj_list.size(); j++) { label label = new label(j, i, obj_list.get(j).tostring()); sheet1.addcell(label); } } book.write(); book.close(); } catch (exception e) { e.printstacktrace(); return -1; } return 0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。