前置準備
- 下載 as3xls-1.0.1.swc (或較新版),放入專案 `libs/` 目錄或建置路徑中。
- 專案需編譯為 Flash Player 10+ (支援 `FileReference.save()`)。
核心邏輯:DataGrid → Sheet → ExcelFile → ByteArray → 儲存
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="https://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
import com.as3xls.xls.ExcelFile;
import com.as3xls.xls.Sheet;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.controls.DataGrid;
import flash.utils.ByteArray;
import flash.net.FileReference;
import flash.events.Event;
[Bindable]
private var dp:ArrayCollection = new ArrayCollection([
{studentID:1, name:"Alice", gender:"F", birthday:"1990-01-01", className:"A"},
{studentID:2, name:"Bob", gender:"M", birthday:"1991-02-02", className:"B"},
{studentID:3, name:"Cathy", gender:"F", birthday:"1992-03-03", className:"C"}
]);
private var fields:Array = []; // 欄位順序快取
protected function exportExcel(dg:DataGrid):void {
var rowCount:int = dg.dataProvider.length;
var colCount:int = dg.columns.length;
var sheet:Sheet = new Sheet();
sheet.resize(rowCount + 1, colCount); // +1 給標題列
// 寫入標題列並記錄 dataField 順序
fields = [];
for (var c:int = 0; c < colCount; c++) {
var col:DataGridColumn = dg.columns[c];
sheet.setCell(0, c, col.headerText);
fields.push(col.dataField);
}
// 寫入資料列
for (var r:int = 0; r < rowCount; r++) {
var item:Object = dg.dataProvider.getItemAt(r);
writeRow(sheet, r + 1, item);
}
// 產生檔案並下載
var excel:ExcelFile = new ExcelFile();
excel.sheets.addItem(sheet);
var bytes:ByteArray = excel.saveToByteArray();
var fr:FileReference = new FileReference();
fr.addEventListener(Event.COMPLETE, function(e:Event):void {
Alert.show("匯出完成:測試檔案.xls");
});
fr.save(bytes, "測試檔案.xls");
}
private function writeRow(sheet:Sheet, row:int, item:Object):void {
for (var c:int = 0; c < fields.length; c++) {
var val:String = item[fields[c]] ? item[fields[c]].toString() : "";
sheet.setCell(row, c, val);
}
}
]]>
</fx:Script>
<mx:Panel title="學生資料匯出" width="100%" height="100%">
<mx:Button label="匯出 Excel" click="exportExcel(myDG)"/>
<mx:DataGrid id="myDG" dataProvider="{dp}" width="100%" height="100%">
<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>
關鍵類別說明
| 類別 | 用途 |
| ExcelFile | 代表整個 .xls 檔案,含多個 Sheet |
| Sheet | 單一工作表,`resize(rows, cols)` 設定尺寸,`setCell(row, col, value)` 寫入 |
| FileReference.save() | 觸發瀏覽器「另存新檔」對話框,將 ByteArray 寫入使用者磁碟 |
注意事項
- as3xls 僅支援 **BIFF8 (.xls)** 格式,不支援 .xlsx (OOXML)。需 .xlsx 請改用 `as3xlsx` 或伺服端產生。
- 大量資料 (超過 65536 列) 會超出 .xls 限制,建議分多個 Sheet 或改用伺服端串流產生。
- 日期/數字格式需自行轉為字串,as3xls 不支援儲存格樣式 (字型、顏色、數字格式)。
- `FileReference.save()` 必須在使用者互動事件 (click) 中呼叫,否則被安全沙箱阻擋。