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

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

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

Android开发笔记(三十四)Excel文件的读写相关推荐

  1. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965 作者:毛星云(浅墨 ...

  2. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965 作者:毛星云(浅墨 ...

  3. Android开发笔记(十四)圆弧进度动画CircleAnimation

    一个好看的APP,都有不少精致的动画效果.熟练运用各种动画技术,可让我们的APP灼灼生辉.Android在技术上把动画分为了三类,分别是帧动画FrameAnimation.补间动画TweenAnima ...

  4. 【Visual C 】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术 Direct3D渲染五步曲

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  5. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术 Direct3D渲染五步曲

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965 作者:毛星云(浅墨 ...

  6. Xamarin.Android开发实践(十四)

    原文:Xamarin.Android开发实践(十四) Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xama ...

  7. Python编程基础:第三十四节 文件移动Move a File

    第三十四节 文件移动Move a File 前言 实践 前言 当我们需要将一个文件/文件夹移动到另一个指定路径时,就需要用到shutil.move()函数,该函数需要指定两个参数shutil.move ...

  8. Android开发问题集锦十四--绚丽的烟花

    Android开发问题集锦十四--绚丽的烟花 程序之美 前言 源码下载 程序之美 前言 随着一声突如其来的响声,打破了久违的不能喘息般的的寂静.一团彩色的光芒快速上升着,留下一线灰色的烟雾.啪!一朵& ...

  9. Android开发笔记(九十四)图片的基本加工

    位图管理Bitmap Android上的图形使用Drawable类,而位图管理则使用Bitmap类,java上与之对应的是awt包中的BufferedImage.Android开发中有需要对jpg.p ...

  10. Android开发笔记(二十三)文件对话框FileDialog

    日期和时间对话框 对话框是人机交互的有力工具,Android自带了几个常用的对话框,包括AlertDialog提示对话框.ProgressDialog进度对话框.DatePickerDialog日期选 ...

最新文章

  1. 引起路由器重启的“元凶”
  2. K-means聚类算法和模糊C-means聚类算法
  3. TSNE Understanding
  4. 笔记本x31搭建家用win服务器系统,Thinkpad X31怎么硬盘安装win7系统
  5. Spring Boot 拦截器
  6. python中multiple函数_关于多处理:在Python中将多个参数传递给pool.map()函数
  7. Gartner认为安全性将取代成本和敏捷性成为政府部门采用云服务的首要原因
  8. ASP.NET Core中HTTP管道和中间件的二三事
  9. springcloud流程图
  10. 牛客小白月赛13-H(单调栈+树状数组)
  11. java左移负数位_java的左移运算符和右移运算符
  12. 笔记:live2d4.0 sdk 博客园网页动画
  13. python在windows与linux下读取doc文件
  14. Java SimpleDateFormat.setLenient(boolean lenient)方法使用
  15. RxJS——异步数据流的响应式编程库(适合新手入门)
  16. 理想评价鸿蒙系统,鸿蒙系统来了!前期如何发育?后期的潜力有多大?苹果真豁口了!...
  17. xampp 下载地址
  18. [2022CISCN]ez_usb
  19. 新浪微博小工具--PC遥控器1.0发布
  20. mysql pri_关于mysql:SQL键,MUL,PRI和UNI

热门文章

  1. Leetcode每日一题:4.寻找两个有序数组的中位数
  2. Python3爬虫入门之Request库的使用
  3. 业务建模重的几个概念
  4. 性能测试:基础(3)
  5. Java自动化测试框架-08 - TestNG之并行性和超时篇 (详细教程)
  6. java mysql大小写_MySQL大小写敏感的解决方案
  7. php打印倒立金字塔,编写程序打印*字符形成的等腰三角形倒立金字塔图形 ******* ***** *** *...
  8. 如何处理Long类型精度丢失问题?
  9. list工具类 ListUtils.java
  10. java 日志技术汇总(log4j , Commons-logging,.....)