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下.

 

运行测试代码 如下图:

 


 

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

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值