使用过程需要注意几点.本人跟踪源码的时候发现必须注意的地方
当你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文件: