您的位置:首页 > 其它

Flex导入EXCEL并在页面显示

2011-12-13 14:45 281 查看
个人觉得做这个功能最重要的就是在哪里解析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端传递过来的字节数组");

//初始整个Excel
HSSFWorkbook workbook;
try {
workbook = new HSSFWorkbook(by);

//获取第一个Sheet表
HSSFSheet sheet = workbook.getSheetAt(0);//或者 HSSFSheet sheet = workbook.getSheet("Sheet1");
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) {
// TODO Auto-generated catch block
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,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的工作簿时得不到该对象,挺郁闷的,也不知道到底是什么原因。先丢其一边。
本文出自 “技术积累” 博客,请务必保留此出处http://jiarong.blog.51cto.com/3398433/740819
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: