本篇文章主要介绍了 Android 操作 Excel 文件的功能实现,Android 中操作 Excel 文件导出报表时主要采用开源库 jxl,有兴趣的可以了解一下。
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
Android 中操作 Excel 文件导出报表时主要采用开源库 jxl,最早用在 java 上,但也可用于 Android。与之类似的 POI,因为依赖库众多,所以只能用于 java,而不能用于 Android。
使用 jxl 需要在 Android 工程中导入 jxl.jar 包,jxl 可以完成 Excel 的基本读写操作,其支持与不支持的情况如下:
1、jxl 只支持 Excel2003 格式,不支持 Excel2007 格式。即支持 xls 文件,不支持 xlsx 文件。
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;
- }
来源: http://www.phperz.com/article/17/0319/326189.html