欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實現(xiàn)快速將數(shù)據(jù)寫入Excel單元格

 更新時間:2024年03月27日 15:00:49   作者:初九之潛龍勿用  
這篇文章主要為大家詳細介紹了如何使用C#實現(xiàn)快速將數(shù)據(jù)寫入Excel單元格,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

性能問題

將生成或查詢到的數(shù)據(jù),導出到 Excel 是應(yīng)用中常用的一項功能。其中一些標準的寫入單元格的方法如下:

Worksheet worksheet = (Worksheet) excel.Worksheets[1];
 
//引用坐標對Cells集合進行寫入
 
worksheet.Cells[1, 1] = "test";
 
//還可以引用地址進行寫入
 
worksheet.Cells["A1",Type.Missing]="test";

請注意,office 元素大多的起始序號均從 1 開始,而不是 0,如 worksheet,cells等。

現(xiàn)在我們假設(shè)有二維數(shù)組  object[,] dataobj ,遍歷式的寫法如下:

int arraywidth=dataobj.GetLength(1);
int arrayheight=dataobj.GetLength(0);
Worksheet worksheet = (Worksheet) excel.Worksheets[1];
 
for(int j=0;j<arrayheight;j++)
{
    for(int k=0;k<arraywidth;k++)
    {
        worksheet.Cells[j+1,k+1]=dataobj[j,k]; 
    }//end columns
}// end rows 

此種寫法在數(shù)據(jù)較少的時候在寫入速度方面沒有明顯差異,但當大數(shù)據(jù)量的情況,多次的讀寫CELL單元格 IO 是一項非常耗時的操作,甚至會無法完成應(yīng)用的預期目標。

Excel元素結(jié)構(gòu)及寫入原理

元素結(jié)構(gòu)如下圖:

其中Range對象,代表了Excel單元格集合的指定區(qū)域。

如圖選中的Range范圍起始的單元格是第5行第3列,結(jié)束于第17行第8列。它相當于object[13,6] 的一個二維數(shù)組,Excel的Range提供了get_Resize方法并通過Value2可以一次性的設(shè)置它們。

范例運行環(huán)境

操作系統(tǒng): Windows Server 2019 DataCenter

操作系統(tǒng)上安裝 Office Excel 2016

.net版本: .netFramework4.7.1 或以上

開發(fā)工具:VS2019  C#

配置Office DCOM

配置方法可參照我的文章《C#實現(xiàn)讀取Word表格到DataSet》進行處理和配置。

實現(xiàn)代碼

組件庫引入

核心代碼

WriteArrayToExcel

public void WriteArrayToExcel(object[,] dataobj,ExcelApplication excel,int ActiveSheetId,int StartRowId,int StartColId),該方法參數(shù)說明見下表:

序號參數(shù)說明
1object[,] dataobj傳遞要寫入的二維對象數(shù)組
2ExcelApplication excel表示Excel應(yīng)用程序?qū)ο?/td>
3int ActiveSheetId指定要寫入哪個工作ID,ID從1開始
4int StartRowId指定要寫入的開始行ID,ID從1開始
5int StartColId指定要寫入的開始列ID,ID從1開始

示例代碼如下:

public void WriteArrayToExcel(object[,] dataobj,ExcelApplication excel,int ActiveSheetId,int StartRowId,int StartColId)
{
            Excel.Range _range;
            int arraywidth=dataobj.GetLength(1);
            int arrayheight=dataobj.GetLength(0);
            Worksheet worksheet = (Worksheet) excel.Worksheets[ActiveSheetId];
 
 
            worksheet.Activate();
            _range=excel.Range[excel.Cells[StartRowId,StartColId],excel.Cells[StartRowId+arrayheight-1,StartColId+arraywidth-1]];
            _range.get_Resize(arrayheight,arraywidth);
            _range.Value2=dataobj;
 
} //end writearraytoexcel

神奇的 911 事件

在 Excel 的早期版本(如Excel 2003)寫入的時,我們發(fā)現(xiàn)了一個現(xiàn)象,每寫入第 911個單元格的時候,且第911個單元數(shù)據(jù)為字符串類型的時候,會出現(xiàn)無響應(yīng)的情況。當時的解決方案是將原始數(shù)組的每911元素值進行備份,并設(shè)置為空字符串,然后再對Cells單元格進行重寫,修改后的代碼如下:

public void WriteArrayToExcel(object[,] dataobj,ExcelApplication excel,int ActiveSheetId,int StartRowId,int StartColId)
        {
            Excel.Range _range;
            int arraywidth=dataobj.GetLength(1);
            int arrayheight=dataobj.GetLength(0);
            Worksheet worksheet = (Worksheet) excel.Worksheets[ActiveSheetId];
 
 
            worksheet.Activate();
 
            ArrayList ex_x = new ArrayList();
            ArrayList ex_y = new ArrayList();
            ArrayList ex_value = new ArrayList();
 
            object _fvalue="";
            int _maxlen=910;                
            for(int j=0;j<arrayheight;j++)
            {
                for(int k=0;k<arraywidth;k++)
                {
                    _fvalue=dataobj[j,k];// field value
//備份每個第911個單元數(shù)據(jù)
                    if(_fvalue.GetType().ToString()=="System.String")
                    {
                        if(((string)_fvalue).Length>_maxlen)
                        {
                            ex_x.Add(j+StartRowId);
                            ex_y.Add(k+StartColId);
                            ex_value.Add(_fvalue);
                            _fvalue="";
                        }// end maxlen 
                    }
                    dataobj[j,k]=_fvalue;
                }//end columns
            }// end rows 
            _range=excel.Range[excel.Cells[StartRowId,StartColId],excel.Cells[StartRowId+arrayheight-1,StartColId+arraywidth-1]];
            _range.get_Resize(arrayheight,arraywidth);
            _range.Value2=dataobj;
//恢復重寫對應(yīng)的單元格
            for(int j=0;j<ex_value.Count;j++)
            {
                excel.Cells[ex_x[j],ex_y[j]]=ex_value[j].ToString();
            }
} //end writearraytoexcel

小結(jié)

1、911單元格處理的方法是一種兼容性寫法,我們可以根據(jù)安裝的版本來決定是否需要這種寫法。

2、核心方法中輸入的起始行列,可以修改為更加直觀的CELL地址,如“A1”,"B5"等,有助于客戶進行應(yīng)用,提升友好性。

3、我們還可以改造傳遞二維數(shù)組集合,寫入多個worksheet,滿足更多需求,提升應(yīng)用程序的功能。

以上就是C#實現(xiàn)快速將數(shù)據(jù)寫入Excel單元格的詳細內(nèi)容,更多關(guān)于C#數(shù)據(jù)寫入Excel的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論