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> 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> 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;  }     

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多相关文章

  1. Android生成签名文件并用其对apk文件进行签名(Failure [INSTALL_P
  2. Android布局文件中控件的高度与宽度属性设置
  3. Android读取assets目录下文件数据内容
  4. Android工程中R.java文件的重新生成——注意资源文件的错误
  5. Android内核开发:系统分区与镜像文件的烧写
  6. 关于Android 动态加载 jar 文件
  7. Android系统编译―Android.mk文件的简单介绍
  8. android 工程中重新生成gen文件夹或R.java 文件
  9. [转载]Android布局文件中命名空间的解析

随机推荐

  1. Android广播机制Broadcast详解
  2. 【Android】对话框之日期和时间对话框
  3. Android(安卓)中startActivity 与startAc
  4. android 国际化
  5. Some Android licenses not accepted. To
  6. Ubuntu搭建android编译环境总结
  7. Android 使用腾讯TBS遇到的坑
  8. android练习一之走马灯效果
  9. android——写xml
  10. Android 实现两屏幕互相滑动