[Excel] Assign Array資料給Range時,要注意Array的型態

[Excel] Assign Array資料給Range時,要注意Array的型態

前言

我們有個功能是將資料匯出到Excel,這個功能會設定該Excel各欄位的型態(如日期、字串...),同事反應匯出的效能不好。於是我就進去看一下程式,結果它是一個Cell一個Cell指定資料,所以當資料很多時,這樣就跑很久。

Google一下,有很多將資料Assign到Excel中的方式,有以下幾個方式:

1.一個Cell一個Cell Assign
2.建立檔案,然後用Insert Into的方式(直接從SQL取出資料)
3.設一個Range然後Assign一個Array給它(資料需要加工過,放到Array之中)

...

因為程式中已有Array資料,所以我就選擇使用第3種方式來處理。依欄位數取得Excel的ColumnLabel可參考「傳入數值,傳出Excel的ColumnLabel的函數」。

R1

速度還不錯,但卻發生了該Cell的顯示與我設定的欄位格式不同。需要在該Cell上Dbclick才會以設定的格式來顯示。

image

研究

先錄一下看DbClick做了那些事,原來是Assign資料到該Cell(ActiveCell.FormulaR1C1 = "1111111")。如果照巨集那個做法的話,那又要1個1個Cell重新Assign值,不就又回到了原點,變得很慢。

還試過,把Range Copy起來再貼上值,還是沒有用。

最後想說會不會是資料來源的問題呢? 來源是設成String Arrry! 因為資料有字串、日期也有數值,所以就改成Object Array! 試一下,果然是資料來源的問題! 所以資料的型態還是會影響顯示的哦!

image

實作

以下說明如何設定Excel的欄位資料型態及Assign資料到Range之中。

1.建立測試的資料Array

Dim aryDataSource(2, 1) As Object
aryDataSource(0, 0) = "字串0,0"
aryDataSource(0, 1) = 1111111

aryDataSource(1, 0) = "字串1,0"
aryDataSource(1, 1) = 2222222

aryDataSource(2, 0) = "字串0,0"
aryDataSource(2, 1) = 3333333

2.設定各欄位的資料型態及將資料Array Assign到Range

dim strFileNam as string = "c:\test1.xls"
Dim oBook As Object = oExcel.Workbooks.Add
Try
    Dim oSheet As Object
    oSheet = oBook.Worksheets(1)
    '設定Excel各欄位的型態,目前設定字串及數值 
    '第1欄設成文字
    oSheet.columns(1).NumberFormatLocal = "@"
    '第2欄設成3位一撇
    oSheet.columns(2).NumberFormatLocal = "#,##0"
        '傳入Column數,傳出Excel的ColumnLabel
        '1=>A, 26=>Z, 27=>AA
    Dim strColumnLabel As String = GetExcelColumnLabel(UBound(aryDataSource, 2) + 1)
    '將資料Assign給Range
    oSheet.Range("A1", strColumnLabel & UBound(aryDataSource, 1) + 1) = aryDataSource
    oExcel.DisplayAlerts = False
    '將資料存檔
    oBook.SaveAs(strFileName)
    oBook.Close()
    oExcel.Quit()

    GC.Collect() '強制記憶體回收。
    MsgBox("OK!")
Catch ex As Exception
    oBook.Close()
    oExcel.Quit()
    Throw ex
Finally
    oBook = Nothing
    oExcel = Nothing
End Try

附上測試範例:ExcelRangeAssign.rar

image

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^