Flex通过Java读取Excel(详细流程)----Excel在客户端(DataGrid动态根据Excel生成)
2011-03-06 23:57:00| 分类: flex/flash | 标签:excel flex java 客户端 as3xls |字号大中小 订阅
在网上查了很久的资料,就是想要把客户端的Excel直接在flex的datagrid中显示。网上的资料只有将datagrid的数据通过as3xls保存到本地。以及在AIR运用中通过as3xls读取本地的Excel文件。还有一点是,通过as3xls保存在本地Excel文档无法再被as3xls或POI(即马上要介绍的两种方法)打开。
本人通过不断尝试,终于有了结果:
方法一:
模仿AIR中采用as3xls读取客户端的Excel文件,再将其绑定到DataGrid控件中。相关的AIR中as3xls读取Excel文件的文献很多,这里只说一下思想。采用FileReference代替AIR中的File,并通过FileReference的load事件得到ByteArray,从而初始化as3xls变量。
这种方法的优点在于:所有事件都是在客户端上完成,不耗费服务器的资源。但致命的缺点在于读取的数据存在中文乱码问题。
并且as3xls是2008年出的,一直没有更新。另外,网上所说的解决中文乱码的as3xls,是指解决的写入Excel的中文乱码,而读取的未解决。所以不推荐!!!
方法二:
思想:方法一中可以得到Excel的ByteArray,这里将其通过Blaseds传到java服务器端。并通过ByteArrayInputStream将byte[] (ByteArray在java中的映射)转化为InputStream,再转化为POIFSFileSystem,最后至HSSFWorkbook。然后与Flex通过Java读取Excel(详细流程)----Excel在服务器端一样,将处理完的数据传回flex端(所有的转化只需通过构造函数即可)。
先介绍工具和方法
1.Java通过第三方控件POI操作Excel,请参考POI读取Excel(简单程序),POI3.7下载
2.Blazeds连接flex4和java,请参考flex4+blazeds+java通信(视频)
代码部分:
java:
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import flex.messaging.io.ArrayCollection;
public class ReadExcel {
public ArrayCollection readfromflex(byte[] file) {
ArrayCollection arrc = new ArrayCollection();
try {
InputStream is = new ByteArrayInputStream(file);
POIFSFileSystem fs = new POIFSFileSystem(is);
HSSFWorkbook workBook = new HSSFWorkbook(fs);
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();// 获得列数
HashMap<String, String> hashmap= new HashMap<String, String>();
for (int k = 0; k < cells; k++) { // 列循环
HSSFCell cell = row.getCell(k); // /
if (cell != null) {
String value = "";
value = readcell(cell);
hashmap.put("col"+k, value);
}
}
arrc.add(hashmap);
}
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return arrc;
}
public String readcell(HSSFCell cell) {
String value = "";
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC: // 数值型
if (HSSFDateUtil.isCellDateFormatted(cell)) {
// 如果是date类型则 ,获取该cell的date值
Date date = new Date() ;
date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
SimpleDateFormat SDF=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
value = SDF.format(date) ;
} else {// 纯数字
cell.setCellType (Cell.CELL_TYPE_STRING);
value = cell.getRichStringCellValue().toString();
//value = String.valueOf(cell.getNumericCellValue());//这会出现1.0 2.0的情况
}
break;
//此行表示单元格的内容为string类型
case HSSFCell.CELL_TYPE_STRING: // 字符串型
value = cell.getRichStringCellValue().toString();
break;
case HSSFCell.CELL_TYPE_FORMULA:// 公式型
// 读公式计算值
value = String.valueOf(cell.getNumericCellValue());
if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串
value = cell.getRichStringCellValue().toString();
}
// cell.getCellFormula();读公式
break;
case HSSFCell.CELL_TYPE_BOOLEAN:// 布尔
value = " " + cell.getBooleanCellValue();
break;
//此行表示该单元格值为空
case HSSFCell.CELL_TYPE_BLANK: // 空值
value = "";
break;
case HSSFCell.CELL_TYPE_ERROR: // 故障
value = "";
break;
default:
value = cell.getRichStringCellValue().toString();
}
return value;
}
}
2.flex(mxml)部分
<?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"
width="100%" height="100%" xmlns:services="services.*">
<fx:Declarations>
<s:CallResponder id="readfromflexResult"/>
<services:Read id="read" result="readok()" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"/>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import flash.net.FileReference;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.controls.dataGridClasses.DataGridColumn;
private var fr:FileReference=new FileReference();
[Bindable]
public var datap:ArrayCollection;
protected function button1_clickHandler(event:MouseEvent):void
{
var modeltype:FileFilter = new FileFilter("Excel文件(*.xls)", "*.xls");
var FileTypes:Array = new Array(modeltype);
fr.addEventListener(Event.SELECT, fileRef_event);
fr.addEventListener(ProgressEvent.PROGRESS, fileRef_event);
//fr.addEventListener(Event.COMPLETE, fileRef_event);
fr.browse(FileTypes);
}
public function fileRef_event(evt:Event):void{
switch(evt.type)
{
case Event.SELECT:
fr.load();
fr.addEventListener(Event.COMPLETE,fileLoaded);
break;
case ProgressEvent.PROGRESS:
//label_updatastate.text="上传中...";
//Math.round(100 * (ProgressEvent)evt.bytesLoaded / (ProgressEvent)evt.bytesTotal);
break;
case Event.COMPLETE:
//label_updatastate.text="上传完成!";
break;
case IOErrorEvent.IO_ERROR:
//label_updatastate.text="上传失败!";
break;
}
}
public function fileLoaded(evt:Event):void{
switch(evt.type)
{
case Event.COMPLETE:
readfromflex(evt.target.data);
break;
case IOErrorEvent.IO_ERROR:
break;
}
}
protected function readok():void
{
var xlsdata:ArrayCollection=readfromflexResult.lastResult;
var xlshead:Object=xlsdata.removeItemAt(0);//这之前最好对xlsdata的长度进行验证,防止读到的是空Excel表,我忘了验证。
var arr:Array = new Array();
for(var attribute:String in xlshead)//开始动态创建DataGrid
{
var dgc:DataGridColumn=new DataGridColumn();
dgc.headerText=xlshead[attribute];
dgc.dataField=attribute;
arr.push(dgc);
}
datap=xlsdata;
datagrid.columns=arr.sortOn("dataField",Array.CASEINSENSITIVE);//对数据排序一下,保证和Excel中的位置一致。
}
protected function readfromflex(arg0:ByteArray):void
{
readfromflexResult.token = read.readfromflex(arg0);
}
]]>
</fx:Script>
<s:VGroup>
<mx:DataGrid x="100" y="100" id="datagrid" dataProvider="{datap}">
<!--<mx:columns>
<mx:DataGridColumn headerText="列 1" dataField="col1"/>
</mx:columns>-->
</mx:DataGrid>
<s:Button label="读取" fontSize="13" click="button1_clickHandler(event)"/>
</s:VGroup>
</s:Application>
中间blazeds的xml配置部分已省略,请自己参考视频配置。
Flex通过Java读取Excel(详细流程)----Excel在客户端(DataGrid动态根据Excel生成)相关推荐
- 一文带你了解HBase读取数据详细流程
HBase数据读取流程 1.hbase数据读取流程简单描述 一般来说,在描述hbase读取流程的时候,简单的描述如下: 1).客户端从zookeeper中获取meta表所在的regionser ...
- java读取gpx文件格式,GPX文件格式适用于GPS定位的模拟以及生成文件
中国广东省深圳市南山区南海大道3688号深圳大学 邮政编码: 518060 MyGeoPosition.com http://mygeoposition.com gpx是一种xml格式的文件,是用来给 ...
- JAVA读取Excel表格,建数据库建表,并生成java实体实例
转自:https://blog.csdn.net/wuyongde_0922/article/details/43233413 JAVA读取Excel表格,建数据库建表,并生成java实体实例,这一篇 ...
- java操作office和pdf文件java读取word,excel和pdf文档内容
在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...
- Java读取、写入、处理Excel文件中的数据
在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,本文将介绍Excel读写的常用方法,希望对大家学习Java读写Excel会有 ...
- java 读取excel模板_java如何读取excel表格的信息,java读取excel模板
java如何读取excel表格的信息Java如何读取excel表格的信息,用java读取excel表格信息的方法:1.pass [workbook.getworkbook(新文件(' e ://exc ...
- Java读取excel指定行列的数据(通过jxl的方式)
目录 Java读取Excel指定列的数据详细教程和注意事项(通过jxl的方式) 1.前言 2.注意事项 3.主要的API说明 4.示例代码 Java读取Excel指定列的数据详细教程和注意事项(通过j ...
- java读取excel的maven_JAVA如何读取Excel数据
1.创建Maven项目在pom文件中添加依赖 org.apache.poi poi-ooxml 3.17 2.编写代码 import org.apache.poi.ss.usermodel.*; im ...
- 项目实战 Java读取Excel数据
项目实战 Java读取Excel数据 前言 实现步骤 导入POI依赖 示例Excel表结构 编写读取Excel工具类 实现思路 读取Excel数据工具类实现代码 取出从excel中获取的数据,并插入到 ...
最新文章
- centos 安装 NTFS支持
- 关于mybatis返回前端日期格式化问题
- hadoop com.mysql.jdbc.driver_hadoop – Impala找不到com.mysql.jdbc.Driver
- python接口自动化测试(二)-requests.get()
- android builder布局方式,android – AlertDialog.Builder与自定义布局和EditText;无法访问视图...
- web安全这个行业的前景怎么样?
- python编程-Python3 网络编程
- UVa 1588 - Kickdown(BUG)
- Eclipse 优化
- (附源码)spring boot智能车APP毕业设计250623
- 关于onselect与onchange的介绍
- Jenkins(03):配置Jenkins自动发送邮件
- 实体操盘手开发分销商城小程序商业模式解析
- 【批量识别图片内容改名】如何批量识别图片中的文字并自动改名,如何根据图片上的文字内容重命名图片,批量的识别区域内容如何重命名改名,全部告诉你
- JAVA 正则表达式 (超详细,转)
- 主动降噪耳机什么牌子好?热门降噪耳机排行榜
- python基础程序实例-Python基础的初始
- 这些东西不宜空腹吃[转]
- 你觉得做程序员期间最开心的是什么?
- JSON必知必会 学习笔记
热门文章
- ssas对数据仓库_SSAS多维数据集中的警告
- azure web应用部署_使用Visual Studio Code将Python应用程序部署到Azure Functions
- alwayson高可用组_AlwaysOn可用性组–如何在集群实例和独立实例之间设置AG(第3部分)
- 数据库创建存储过程_创建存储过程来修复孤立的数据库用户
- oracle数据库使用hint来让模糊查询走索引
- Ubuntu安装sysv-rc-conf配置开机启动服务
- 利用切片操作,实现一个trim()函数,去除字符串首尾的空格
- Windows as a Service(4)——使用Intune管理Windows10更新
- (2) pandas 文件读写 (csv)
- java Unicode转UTF-8代码