首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

flex 施用as3xls 生成 excel表格 . 解决中文乱码, 支持web application

2012-10-27 
flex 使用as3xls 生成 excel表格 . 解决中文乱码, 支持web application使用过程需要注意几点.本人跟踪源码

flex 使用as3xls 生成 excel表格 . 解决中文乱码, 支持web application

使用过程需要注意几点.本人跟踪源码的时候发现必须注意的地方

?

?

?

当你new ExcelFile对象后.

?

var excelFile:ExcelFile = new ExcelFile();

?不是要给 excelFile.sheets 添加 Sheet(单个单元格对象);

?

注意. 只能操作一个Sheet对象.

?

就是 这样定义

?

private var sheet:Sheet;

?而且 只能调用一次

sheet.resize(10,10);

这个 方法. 里面的数字根据个人需要写. 表示区域的长宽

for example:

sheet.resize(dataGrid.selectedIndices.length+10,dataGrid.columnHeaderList.length+10);  
?

?

可以这样写. 避免多次new

?

if(!sheet){sheet = new Sheet();sheet.resize(10,10);}

?

?

测试例子文件代码:

?

?

<?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"><fx:Script><![CDATA[import com.as3xls.xls.ExcelFile;import com.as3xls.xls.Sheet;import mx.collections.ArrayCollection;import mx.controls.Alert;import mx.controls.CheckBox;import mx.utils.ArrayUtil;[Bindable]private var dp:Array = [{studentID:1,name:"2ssd",gender:"为1",birthday:"4区分千万",className:"5清道夫却无法"},{studentID:2,name:"2士大夫",gender:"1色调",birthday:"4却无法个我是",className:"5为去去"},{studentID:3,name:"2访问",gender:"1色调",birthday:"飞4",className:"访问5"},{studentID:4,name:"访问2",gender:"0色调",birthday:"4却无法却无法",className:"为5"},{studentID:5,name:"2各位",gender:"0色调",birthday:"4飞完全去是",className:"5为"}];private var str:String = "";private var sheet:Sheet;private var mbytes:ByteArray;private var file:FileReference;private function onCreate(dg:DataGrid):void {var excelFile:ExcelFile = new ExcelFile();for(var i:int=1; i<=dp.length;i++){var obj:Object = dp[i-1];var j:int = 0;for(var key:String in obj){excelFile.sheets.addItem(generateSheet(0,j,key));excelFile.sheets.addItem(generateSheet(i,j,obj[key]));j += 1;}}mbytes = excelFile.saveToByteArray();   file = new FileReference();try{file.save(mbytes,"测试文件.xls"); // 定死文件名}catch (error:Error){trace("Failed:", error.message)}function generateSheet(i:int,j:int,o:Object):Sheet{if(!sheet){sheet = new Sheet();sheet.resize(10,10);}sheet.setCell(i, j, String(o));return sheet;}} ]]></fx:Script><fx:Declarations><!-- 将非可视元素(例如服务、值对象)放在此处 --></fx:Declarations><mx:Panel><mx:Button   label="导出" click="onCreate(myDG)"/><mx:DataGrid id="myDG" width="100%" rowCount="20" dataProvider="{dp}"><mx:columns><mx:DataGridColumn headerText="学号" dataField="studentID"/><mx:DataGridColumn headerText="姓名" dataField="name"/><mx:DataGridColumn headerText="性别" dataField="gender" width="50"/><mx:DataGridColumn headerText="生日" dataField="birthday" /><mx:DataGridColumn headerText="班级" dataField="className"/></mx:columns></mx:DataGrid></mx:Panel></s:Application>
?

?

使用的swc 库文件. 已经解决中文字符集.? 有朋友如果需要源代码的话. 参看这个自己下个官方souce进行修改:

?

Index: ExcelFile.as===================================================================--- ExcelFile.as(revision 6)+++ ExcelFile.as(working copy)@@ -184,7 +184,7 @@  * @return A ByteArray containing the saved sheet in BIFF2 form  *   */-public function saveToByteArray():ByteArray {+public function saveToByteArray(charset:String ="cn-gb"):ByteArray { var s:Sheet = _sheets[0] as Sheet;  var br:BIFFWriter = new BIFFWriter();@@ -252,9 +252,10 @@ cell.data.writeByte(0); cell.data.writeByte(0); cell.data.writeByte(0);-var len:uint = String(value).length;-cell.data.writeByte(len);-cell.data.writeUTFBytes(value);+var ba:ByteArray = new ByteArray();+ba.writeMultiByte(String(value),charset);+cell.data.writeByte(ba.length);+cell.data.writeMultiByte(String(value),charset); } else { cell.type = Type.BLANK; cell.data.writeByte(0);
?

?

将这个放到工程lib下.

?

运行测试代码 如下图:

?


flex 施用as3xls 生成 excel表格 . 解决中文乱码, 支持web application

?

点击另存为后生成的excel文件:

?


flex 施用as3xls 生成 excel表格 . 解决中文乱码, 支持web application

?

1 楼 zqq230 2010-11-25   我用您的方法在datagrid中是“001”,导出来的excel后变成“1”?请问怎么办?谢谢。
我用最简单的测试也是不行,已经是String型了。
if(!sheet){
sheet = new Sheet();
sheet.resize(10,10);
}
sheet.setCell(1, 1,"001"); 2 楼 ite_wahaha 2011-07-12   遇到楼上一样的问题。求解? 3 楼 jhaij 2011-07-13   确实存在你说的那种数字的格式化问题,因为老早时候做了一半,就放手了。就没有深的去掰开代码研究,如果有时间就再看看。不过既然把工程源码都发出去。想必大家之中肯定有人比我更高手。如果有哪位高手解决了。不妨分享下 4 楼 dasiguan 2011-08-05   你好,为什么我按照这个方法导出的EXCEL中的字段的顺序是不固定的啊! 5 楼 jhaij 2011-08-06   dasiguan 写道你好,为什么我按照这个方法导出的EXCEL中的字段的顺序是不固定的啊!

for(var key:String in obj){ 
    ///TODO 这里你的这个对象的 属性有顺序么?
} 6 楼 dasiguan 2011-08-16   file.save()方法好像没有啊!! 7 楼 jhaij 2011-08-21   dasiguan 写道file.save()方法好像没有啊!!

更改编译器 设置 flash player 为10.0以上才会有这个方法 8 楼 j855081221 2011-10-17   請問一下 as3xls下什麼指令可以調整匯出Excel後的寬度呢?

我的資料內容有時候比較長

匯出excel時會遮蓋到部分文字(預設欄寬太短了)

可以調整 或讓它判斷哪一行的資料比較多讓Excel自動去變更那個寬度嗎 9 楼 jhaij 2011-10-19   j855081221 写道請問一下 as3xls下什麼指令可以調整匯出Excel後的寬度呢?

我的資料內容有時候比較長

匯出excel時會遮蓋到部分文字(預設欄寬太短了)

可以調整 或讓它判斷哪一行的資料比較多讓Excel自動去變更那個寬度嗎


估计暂时没有这个方法吧.这个插件好长时间不用了.你可以上它的wiki找找.

http://code.google.com/p/as3xls/wiki/Tutorial

http://code.google.com/p/as3xls/wiki/Todo 10 楼 jeaken 2011-11-03   http://jhaij.iteye.com/blog/792786 11 楼 zhouluxing 2011-12-07   xls=new ExcelFile();
xls.loadFromByteArray(event.target.data); 12 楼 zhouluxing 2011-12-07   xls=new ExcelFile();
xls.loadFromByteArray(event.target.data);
第二句报错啊。 13 楼 zhouluxing 2011-12-07   Error #1009: 无法访问空对象引用的属性或方法。 14 楼 jhaij 2011-12-11   zhouluxing 写道Error #1009: 无法访问空对象引用的属性或方法。

debug下. 应该是你哪个属性没有new 没有初始化 15 楼 xiaolidayu 2012-04-01   我的导出之后,excel文件怎么打不开啊 16 楼 jhaij 2012-04-01   xiaolidayu 写道我的导出之后,excel文件怎么打不开啊
还是不稳定. 如果涉及大批量 特殊格式的xls 文件的话.还是建议使用后台程序导出.

热点排行