最新下载
热门教程
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 
Android操作Excel文件的功能实现
时间:2022-06-25 23:26:23 编辑:袖梨 来源:一聚教程网
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格式的读:
| 代码如下 | 复制代码 | 
| 
 importjava.io.File; 
 importjava.io.IOException; 
 importjava.io.InputStream; 
 importjava.util.ArrayList; 
 importjava.util.List; 
 importjava.util.zip.ZipEntry; 
 importjava.util.zip.ZipException; 
 importjava.util.zip.ZipFile; 
 importorg.xmlpull.v1.XmlPullParser; 
 importorg.xmlpull.v1.XmlPullParserException; 
 importandroid.util.Log; 
 importandroid.util.Xml; 
 importjxl.Sheet; 
 importjxl.Workbook; 
 importjxl.write.Label; 
 importjxl.write.WritableSheet; 
 importjxl.write.WritableWorkbook; 
 publicclassExcelUtil { 
 privatefinalstaticString TAG ="ExcelUtil";  publicstaticList 
 String extension = file_name.lastIndexOf(".") == -1?"": file_name 
 .substring(file_name.lastIndexOf(".") +1); 
 if("xls".equals(extension)) {// 2003 
 Log.d(TAG,"read2003XLS, extension:"+ extension); 
 returnread2003XLS(file_name); 
 }elseif("xlsx".equals(extension)) { 
 Log.d(TAG,"read2007XLSX, extension:"+ extension); 
 returnread2007XLSX(file_name); 
 }else{ 
 Log.d(TAG,"不支持的文件类型, extension:"+ extension); 
 returnnull; 
 } }  publicstaticList 
   List 
 try{ 
 Workbook book = Workbook.getWorkbook(newFile(path)); 
 // book.getNumberOfSheets(); //获取sheet页的数目 
 // 获得第一个工作表对象 
 Sheet sheet = book.getSheet(0); 
 intRows = sheet.getRows(); 
 intCols = sheet.getColumns(); 
 Log.d(TAG,"当前工作表的名字:"+ sheet.getName()); 
 Log.d(TAG,"总行数:"+ Rows +", 总列数:"+ Cols); List 
 String val =null; 
 for(inti =0; i 
 booleannull_row =true; 
 for(intj =0; 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 =newArrayList 
 } 
 book.close(); 
 }catch(Exception e) { 
 Log.d(TAG, e.getMessage()); 
 } returndataList; 
 }  publicstaticList 
   List 
 String str_c =""; 
 String v =null; 
 booleanflat =false; 
   List 
 try{ 
 ZipFile xlsxFile =newZipFile(newFile(path)); 
 ZipEntry sharedStringXML = xlsxFile.getEntry("xl/sharedStrings.xml"); 
 if(sharedStringXML ==null) { 
 Log.d(TAG,"空文件:"+ path); 
 returndataList; 
 } 
 InputStream inputStream = xlsxFile.getInputStream(sharedStringXML); 
 XmlPullParser xmlParser = Xml.newPullParser(); 
 xmlParser.setInput(inputStream,"utf-8"); intevtType = xmlParser.getEventType(); 
 while(evtType != XmlPullParser.END_DOCUMENT) { 
 switch(evtType) { 
 caseXmlPullParser.START_TAG: 
 String tag = xmlParser.getName(); 
 if(tag.equalsIgnoreCase("t")) { 
 ls.add(xmlParser.nextText()); 
 } 
 break; 
 caseXmlPullParser.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"); intevtTypesheet = xmlParsersheet.getEventType(); 
    List 
 String val =null; booleannull_row =true; while(evtTypesheet != XmlPullParser.END_DOCUMENT) { 
 switch(evtTypesheet) { 
 caseXmlPullParser.START_TAG: 
 String tag = xmlParsersheet.getName(); 
 if(tag.equalsIgnoreCase("row")) { 
 }elseif(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; 
 } 
 }elseif(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; 
 caseXmlPullParser.END_TAG: 
 if(xmlParsersheet.getName().equalsIgnoreCase("row") && v !=null) { 
 str_c +="n"; 
 if(null_row !=true) { 
 dataList.add(objList); 
 null_row =true; 
 }       objList =newArrayList 
 } 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); 
 } returndataList; 
 }  publicstaticintwriteExcel(String file_name, List 
 try{ 
 WritableWorkbook book = Workbook.createWorkbook(newFile(file_name)); 
 WritableSheet sheet1 = book.createSheet("sheet1",0); 
 for(inti =0; i 
     List 
 for(intj =0; j 
 Label label =newLabel(j, i, obj_list.get(j).toString()); 
 sheet1.addCell(label); } } book.write(); book.close(); 
 }catch(Exception e) { 
 e.printStackTrace(); return-1; } return0; }  | |
相关文章
- 三国天下归心刘备怎么玩 刘备玩法教学 11-04
 - 三国天下归心武将怎么养成 武将养成攻略 11-04
 - 三国天下归心经济怎么提升 经济提升方法 11-04
 - 妇女节必点赞的朋友圈说说(精选90句) 11-04
 - 镭明闪击ssr角色怎么选 ssr角色选择推荐 11-04
 - 植物大战僵尸融合版雪兽骑士怎么样 雪兽骑士属性介绍 11-04