? 个人觉得做这个功能最重要的就是在哪里解析EXCEL
?本来想着偷懒就在FLEX端解析算了,可是整了一早上实在整不下去了,至于原因,懒的说了。
?下午就实行了第二套解决方案,
首先:在FLEX端加载EXCEL文件转换为BYTE数组代码如下:
?
- <?xml?version="1.0"?encoding="utf-8"?>?
- <s:Application?xmlns:fx="http://ns.adobe.com/mxml/2009"?
- ???????????????xmlns:s="library://ns.adobe.com/flex/spark"?
- ???????????????xmlns:mx="library://ns.adobe.com/flex/mx"?minWidth="955"?minHeight="600"?
- ???????????????currentState="pre_upload"?
- ???????????????creationComplete="init()">?
- ????<s:layout>?
- ????????<s:BasicLayout/>?
- ????</s:layout>?
- ????<fx:Script>?
- ????????<![CDATA[?
- ????????????//import?mx.events.ImageUploadedEvent;?
- ????????????import?flash.events.Event;?
- ????????????import?flash.net.FileFilter;?
- ????????????import?flash.net.FileReference;?
- ????????????import?mx.controls.Alert;?
- ????????????import?mx.managers.PopUpManager;?
- ????????????import?mx.rpc.events.FaultEvent;?
- ????????????import?mx.rpc.events.ResultEvent;?
- ????????????import?mx.rpc.remoting.mxml.RemoteObject;?
- ?????????????
- ????????????private?var?fileRef:FileReference?=?new?FileReference();?
- ?????????????
- ????????????private?var?upload:RemoteObject?=?new?RemoteObject();?
- ????????????private?function?init():void{?
- ????????????????upload.destination="UploadFile";?
- ????????????}?
- ?????????????
- ????????????private?function?pickFile(evt:MouseEvent):void?
- ????????????{?
- ????????????????var?imageTypes:FileFilter?=?new?FileFilter("图片?(*.jpg,?*.jpeg,?*.gif,*.png)",?"*.jpg;?*.jpeg;?*.gif;?*.png");?
- ????????????????var?allTypes:Array?=?new?Array(imageTypes);?
- ????????????????fileRef.addEventListener(Event.SELECT,?selectHandler);?
- ????????????????fileRef.addEventListener(ProgressEvent.PROGRESS,?progressHandler);?
- ????????????????fileRef.addEventListener(Event.COMPLETE,?completeHandler);?
- ????????????????try{?
- ????????????????????fileRef.browse(allTypes);?
- ????????????????}catch?(error:Error){?
- ????????????????????trace("Unable?to?browse?for?files."+error.toString());?
- ????????????????}?
- ????????????}?
- ?????????????
- ????????????private?function?progressHandler(evt:ProgressEvent):void?
- ????????????{?
- ????????????????lb_progress.text?=?"?已上传?"?+?(evt.bytesLoaded/1024).toFixed(2)+?"?K,共?"?+?(evt.bytesTotal/1024).toFixed(2)?+?"?K";?
- ????????????????var?proc:?uint?=?evt.bytesLoaded?/?evt.bytesTotal?*?100;?
- ????????????????progress.setProgress(proc,?100);?
- ????????????????progress.label=?"当前进度:?"?+?"?"?+?proc?+?"%";?
- ????????????}?
- ?????????????
- ????????????private?function?selectHandler(evt:Event):void?
- ????????????{?
- ????????????????currentState?=?"uploading";?
- ????????????????fileRef.load();?
- ????????????}?
- ?????????????
- ????????????private?function?completeHandler(evt:Event):void{?
- ????????????????currentState?=?"post_upload";?
- ????????????????upload.uploadFile(fileRef.data,fileRef.name);?
- ????????????????image_post_upload.source?=?fileRef.data;?
- ????????????}?
- ?????????????
- ????????]]>?
- ????</fx:Script>?
- ????<s:states>?
- ????????<s:State?name?=?"pre_upload"/>?
- ????????<s:State?name?=?"uploading"/>?
- ????????<s:State?name?=?"post_upload"/>?
- ????</s:states>?
- ????<s:Button?includeIn="pre_upload"?label="从电脑上上传图片"?width="119"?click="pickFile(event)"?horizontalCenter="-1"?y="29"/>?
- ????<mx:ProgressBar?id="progress"?includeIn="uploading"?x="43"?y="43"?width="153"/>?
- ????<s:Label?id="lb_progress"?includeIn="uploading"?x="45"?y="10"?width="149"?height="25"/>?
- ????<s:Label?id="lb_post_upload"?includeIn="post_upload"?x="108"?y="21"?width="124"?height="32"?fontSize="16"?text="upload?success!"?fontFamily="Arial"?color="#3374DE"/>?
- ????<mx:Image?id="image_post_upload"?includeIn="post_upload"?x="10"?y="10"?width="67"?height="67"/>?
- </s:Application>?
这是上传的例子,接着把byte数组传给java端,先转换为输入流再利用POI解析EXCEL后封装数据,最后传递给FLEX端
代码如下:
?
- InputStream?by=new?ByteArrayInputStream("FLEX端传递过来的字节数组");?
- ?
- ?????
- ?????HSSFWorkbook?workbook;?
- try?{?
- ????workbook?=?new?HSSFWorkbook(by);?
- ?????
- ??????
- ??????HSSFSheet?sheet?=?workbook.getSheetAt(0);?
- ??????int???total???=???sheet.getLastRowNum();??????
- ????????????
- ??????for(int?i=0;i<total;i++){?
- ??????????HSSFRow?row?=?sheet.getRow(i);??
- ??????????for(int?j=0;j<3;j++){?
- ?????????????????
- ??????????HSSFCell?cell?=?row.getCell(j);???
- ??????????
- ???????????
- ???????????System.out.print(cell.getRichStringCellValue().getString());?
- ??????????}?
- ??????????System.out.println();?
- ??????}?
- ????????
- }?catch?(Exception?e)?{?
- ?????
- ????e.printStackTrace();?
- }???
POI解析EXCEL的详细列子:
?
- POIFSFileSystem?fs?=?new?POIFSFileSystem(new?FileInputStream("e:test.xls"));?
- ????????????//?创建工作簿?
- ????????????HSSFWorkbook?workBook?=?new?HSSFWorkbook(fs);?
- ????????????/**?
- ?????????????*?获得Excel中工作表个数?
- ?????????????*/?
- ????????????System.out.println("工作表个数?:"?+?workBook.getNumberOfSheets()?+?"<br>");?
- ????????????for?(int?i?=?0;?i?<?workBook.getNumberOfSheets();?i++)?{?
- ????????????????System.out.println("<font?color='red'>?"?+?i?+?"?***************工作表名称:"?+?workBook.getSheetName(i)?+?"??************</font><br>");?
- ?
- ????????????????//?创建工作表?
- ????????????????HSSFSheet?sheet?=?workBook.getSheetAt(i);?
- ????????????????int?rows?=?sheet.getPhysicalNumberOfRows();?//?获得行数?
- ????????????????if?(rows?>?0)?{?
- ????????????????????sheet.getMargin(HSSFSheet.TopMargin);?
- ????????????????????for?(int?j?=?0;?j?<?rows;?j++)?{?//?行循环?
- ????????????????????????HSSFRow?row?=?sheet.getRow(j);?
- ????????????????????????if?(row?!=?null)?{?
- ????????????????????????????int?cells?=?row.getLastCellNum();//?获得列数?
- ????????????????????????????for?(short?k?=?0;?k?<?cells;?k++)?{?//?列循环?
- ????????????????????????????????HSSFCell?cell?=?row.getCell(k);?
- ????????????????????????????????//?/////////////////////?
- ????????????????????????????????if?(cell?!=?null)?{?
- ????????????????????????????????????String?value?=?"";?
- ????????????????????????????????????switch?(cell.getCellType())?{?
- ????????????????????????????????????case?HSSFCell.CELL_TYPE_NUMERIC:?//?数值型?
- ?
- ????????????????????????????????????????if?(HSSFDateUtil.isCellDateFormatted(cell))?{?
- ????????????????????????????????????????????//?如果是date类型则?,获取该cell的date值?
- ????????????????????????????????????????????value?=sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));?
- ????????????????????????????????????????????System.out.println("第"?+?j?+?"行,第"?+?k?+?"列值:"?+?value?+?"<br>");?
- ????????????????????????????????????????}?else?{//?纯数字?
- ?
- ????????????????????????????????????????????value?=?String.valueOf(cell.getNumericCellValue());?
- ????????????????????????????????????????????System.out.println("第"?+?j?+?"行,第"?+?k?+?"列值:"?+?value?+?"<br>");?
- ????????????????????????????????????????}?
- ????????????????????????????????????????break;?
- ????????????????????????????????????/*?此行表示单元格的内容为string类型?*/?
- ????????????????????????????????????case?HSSFCell.CELL_TYPE_STRING:?//?字符串型?
- ????????????????????????????????????????value?=?cell.getRichStringCellValue().toString();?
- ????????????????????????????????????????System.out.println("第"?+?j?+?"行,第"?+?k?+?"列值:"?+?value?+?"<br>");?
- ????????????????????????????????????????break;?
- ????????????????????????????????????case?HSSFCell.CELL_TYPE_FORMULA://?公式型?
- ????????????????????????????????????????//?读公式计算值?
- ????????????????????????????????????????value?=?String.valueOf(cell.getNumericCellValue());?
- ????????????????????????????????????????if?(value.equals("NaN"))?{//?如果获取的数据值为非法值,则转换为获取字符串?
- ?
- ????????????????????????????????????????????value?=?cell.getRichStringCellValue().toString();?
- ????????????????????????????????????????}?
- ????????????????????????????????????????//?cell.getCellFormula();读公式?
- ????????????????????????????????????????System.out.println("第"?+?j?+?"行,第"?+?k?+?"列值:"?+?value?+?"<br>");?
- ????????????????????????????????????????break;?
- ????????????????????????????????????case?HSSFCell.CELL_TYPE_BOOLEAN://?布尔?
- ????????????????????????????????????????value?=?"?"?+?cell.getBooleanCellValue();?
- ????????????????????????????????????????System.out.println("第"?+?j?+?"行,第"?+?k?+?"列值:"?+?value?+?"<br>");?
- ????????????????????????????????????????break;?
- ????????????????????????????????????/*?此行表示该单元格值为空?*/?
- ????????????????????????????????????case?HSSFCell.CELL_TYPE_BLANK:?//?空值?
- ????????????????????????????????????????value?=?"";?
- ????????????????????????????????????????System.out.println("第"?+?j?+?"行,第"?+?k?+?"列值:"?+?value?+?"<br>");?
- ????????????????????????????????????????break;?
- ????????????????????????????????????case?HSSFCell.CELL_TYPE_ERROR:?//?故障?
- ????????????????????????????????????????value?=?"";?
- ????????????????????????????????????????System.out.println("第"?+?j?+?"行,第"?+?k?+?"列值:"?+?value?+?"<br>");?
- ????????????????????????????????????????break;?
- ????????????????????????????????????default:?
- ????????????????????????????????????????value?=?cell.getRichStringCellValue().toString();?
- ????????????????????????????????????????System.out.println("第"?+?j?+?"行,第"?+?k?+?"列值:"?+?value?+?"<br>");?
- ????????????????????????????????????}?
- ?
- ????????????????????????????????}?
- ????????????????????????????}?
- ????????????????????????}?
JXL解析例子:
?
- package?excel;?
- ?
- import?java.io.FileInputStream;?
- import?java.io.InputStream;?
- ?
- import?jxl.Cell;?
- import?jxl.Sheet;?
- import?jxl.Workbook;?
- ?
- public?class?TestForExcel?{?
- ?
- ????/**?
- ?????*?@param?args?
- ?????*/?
- ????public?static?void?main(String[]?args)?{?
- ????????Workbook?rwb?=?null;?
- //??????byte?b[]={1,23,1,123,123};?
- //??????InputStream?by=new?ByteArrayInputStream(b);?
- ?????????
- ??????????try?
- ??????????{?
- ??????????????InputStream?is=new?FileInputStream("E:test.xls");?
- ??????????????//声名一个工作薄?
- ???????????????rwb=?Workbook.getWorkbook(is);?
- ??????????????//获得工作薄的个数?
- ??????????????rwb.getNumberOfSheets();?
- ??????????????//在Excel文档中,第一张工作表的缺省索引是0?
- ??????????????Sheet?st?=?rwb.getSheet("Sheet1");?
- ??????????????//通用的获取cell值的方式,getCell(int?column,?int?row)?行和列?
- ??????????????int?rows=st.getRows();?
- ??????????????int?cols=st.getColumns();?
- ??????????????System.out.println("当前工作表的名字:"+st.getName());?
- ??????????????System.out.println("总行数:"+rows);?
- ??????????????System.out.println("总列数:"+cols);?
- ????????????for(int?i=0;i<rows;i++){?
- ??????????????Cell?c1=st.getCell(0,i);?
- ??????????????Cell?c2=st.getCell(1,i);?
- ??????????????Cell?c3=st.getCell(2,i);?
- ??????????????System.out.println("卡号:"+c1.getContents()+";密码:?"+c2.getContents());?
- ????????????}?
- ??????????}?
- ??????????catch(Exception?e)?
- ??????????{?
- ??????????????e.printStackTrace();?
- ???????????????System.out.println("出错了");?
- ??????????}finally{?
- ????????????rwb.close();?
- ??????????}?
- ????}?
- ?
- }?
其实我当时最开始使用的是JXL解析方式,可是把flex端的字节数组转换为输入流再丢给jxl的工作簿时得不到该对象,挺郁闷的,也不知道到底是什么原因。先丢其一边。