首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Flex 匯出 Excel:使用 as3xls 函式庫從 DataGrid 產生 .xls 檔案

     編輯:更多程式設計知識

前置準備

  1. 下載 as3xls-1.0.1.swc (或較新版),放入專案 `libs/` 目錄或建置路徑中。
  2. 專案需編譯為 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) 中呼叫,否則被安全沙箱阻擋。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved