uniGUI的文件下載由於TUniSession的存在而變得非常簡單,最典型的一個例子就是將列表中的所有數據導出到Excel中。服務器上采用TMS FlexCel控件,先將數據集中的記錄導入到Excel文件中,然后再將Excel文件內容輸出到內存流中,最后通過TUniSession發送到客戶端。代碼如下:
procedure TfmeWebDBListBase.ExportData; var i, rowindex, colindex: Integer; ms : TMemoryStream; begin { 檢查數據集 } if Assigned(cdsMain) and cdsMain.Active then try { 創建Excel文件 } FlexCelImport1.NewFile(1); cdsMain.First; { 第一行為標題 } rowindex := 1; colindex := 1; for i := 0 to cdsMain.FieldCount -1 do { 只導出數據集中可視的字段 } if cdsMain.Fields[i].Visible then begin FlexCelImport1.CellValue[rowindex, colindex] := cdsMain.Fields[i].DisplayLabel; inc(colindex); end; { 依次導出數據 } while not cdsMain.Eof do begin { 增加一行 } inc(rowindex); colindex := 1; for i := 0 to cdsMain.FieldCount -1 do { 只導出數據集中可視的字段 } if cdsMain.Fields[i].Visible then begin { 時間和日期字段需要單獨出來一下,否則出來的都是浮點數 } if cdsMain.Fields[i].DataType in [ftDate, ftDateTime, ftTime, ftTimeStamp] then FlexCelImport1.CellValue[rowindex, colindex] := cdsMain.Fields[i].AsString else FlexCelImport1.CellValue[rowindex, colindex] := cdsMain.Fields[i].Value; inc(colindex); end; { 下一條 } cdsMain.Next; end; { 創建內存流 } ms := TMemoryStream.Create; try { 將Excel保存到內存流 } FlexCelImport1.SaveToStream(ms); ms.Position := 0; { 將數據流發送到客戶端,同時指定下載文件名,非常簡單 } MainForm.uniApplication.UniSession.SendStream( ms, ModelName + '.xls' ); finally ms.Free; { 清理內存 } FlexCelImport1.CloseFile; end; except on E : Exception do FlexCelImport1.CloseFile; end; end;