Android中操作Excel文件的场合较少见,主要是一些专业领域导入导出报表时使用,所以处理Excel读写的开源代码也很稀缺。目前读写Excel主要采用开源库jxl,这个是韩国人写的excel操作工具,虽然最早用在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> read(String file_name) {String extension = file_name.lastIndexOf(".") == -1 ? "" : file_name.substring(file_name.lastIndexOf(".") + 1);if ("xls".equals(extension)) {// 2003Log.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> read2003XLS(String path) {List> dataList = new ArrayList>();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 objList = new ArrayList();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();}book.close();} catch (Exception e) {Log.d(TAG, e.getMessage());}return dataList;}public static List> read2007XLSX(String path) {List> dataList = new ArrayList>();String str_c = "";String v = null;boolean flat = false;List ls = new ArrayList();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 objList = new ArrayList();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();}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> 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 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;}}   


点击下载本文用到的Excel文件读写的工程代码



点此查看Android开发笔记的完整目录

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. 读取android手机流量信息
  4. android 使用html5作布局文件: webview跟javascript交互
  5. 《Android开发从零开始》——25.数据存储(4)
  6. Android(安卓)多媒体扫描过程(Android(安卓)Media Scanner Proces
  7. android“设置”里的版本号
  8. Android开发环境搭建
  9. Android(安卓)Resource介绍和使用

随机推荐

  1. 关于android邮件的收发
  2. Android中使EditText失去焦点,禁止弹出键
  3. 相对布局(RelativeLayout)常用属性
  4. WebView使用中js调用java代码时targetSdk
  5. Android实现仿网易新闻主界面设计
  6. android常见问题
  7. 一个二维码实现IOS和android两个平台的下
  8. Activity中那些需要重写的方法
  9. Android适配器及其控件
  10. 若干小问题