DataGrid 使用第三方库 CSVLib 导出CSV,遇到如下两个问题:

  • ActionScript 默认的文本编码为 UTF-8,而 CSV 不支持这种编码,导致中文表头在 Excel 中显示为乱码,而用记事本打开正常。解决方法:CSV 导出时用 ByteArray 转码,代码如下:
var byte:ByteArray = new ByteArray();
byte.writeMultiByte(result,"gb2312");
  • 之前的导出实现是基于 DataGrid 的数据源的,与 DataGrid 所展示的内容并不是完全相同,尤其是当 DataGrid 中的某一列指定了 labelFunction 时,必须在保存之前执行 labelFunction 把该列的数据转为可视的表格 ,这种情况下,很难写出一个通用的功能。直到最近想起 DataGrid 的 GridColumn 有个方法为itemToLabel,才算彻底解决这个问题,代码如下:
var csv:CSV = new CSV();    
csv.embededHeader = false;
 
var header:Array = [];
for(var i:int = 0;i < _dataProvider.length;i++)
{
   var item:Object = _dataProvider.getItemAt(i);
   var rowData:Array = [];
   for(var j:int = 0;j < grid.columns.length;j++)
   {
       var column:GridColumn = grid.columns.getItemAt(j) as GridColumn;
       header.push(column.headerText);
       rowData.push(column.itemToLabel(item));
   }
   csv.addRecordSet(rowData);
}
csv.header = header;
 
var file:FileReference = new FileReference();
csv.encode();
file.save(csv.data,"data.csv");