如何快速的将 DataTable 导入到 Excel 中 ?

Posted biyusr216

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何快速的将 DataTable 导入到 Excel 中 ?相关的知识,希望对你有一定的参考价值。


咨询区

  • user1334858

我尝试将 ​​DataTable​​​ 导入到 ​​Excel​​​ 中,但我目前的方法性能太差,可能是因为我逐个 ​​WorkSheet​​​,​​Cell​​ 去处理导致,下面是我的代码:

    List<DataTable> List = new List<DataTable>();

// Counting sheets
for (int count = 1; count < WB.Worksheets.Count; ++count)

// Create a new DataTable for every Worksheet
DATA.DataTable DT = new DataTable();

WS = (EXCEL.Worksheet)WB.Worksheets.get_Item(count);

textBox1.Text = count.ToString();

// Get range of the worksheet
Range = WS.UsedRange;


// Create new Column in DataTable
for (cCnt = 1; cCnt <= Range.Columns.Count; cCnt++)

textBox3.Text = cCnt.ToString();


Column = new DataColumn();
Column.DataType = System.Type.GetType("System.String");
Column.ColumnName = cCnt.ToString();
DT.Columns.Add(Column);

// Create row for Data Table
for (rCnt = 0; rCnt <= Range.Rows.Count; rCnt++)

textBox2.Text = rCnt.ToString();

try

cellVal = (string)(Range.Cells[rCnt, cCnt] as EXCEL.Range).Value2;

catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException)

ConvertVal = (double)(Range.Cells[rCnt, cCnt] as EXCEL.Range).Value2;
cellVal = ConvertVal.ToString();


// Add to the DataTable
if (cCnt == 1)


Row = DT.NewRow();
Row[cCnt.ToString()] = cellVal;
DT.Rows.Add(Row);

else


Row = DT.Rows[rCnt];
Row[cCnt.ToString()] = cellVal;




// Add DT to the list. Then go to the next sheet in the Excel Workbook
List.Add(DT);

请问是否有更快的处理办法?

回答区

  • D Stanley

调用 ​​.Value2​​​ 因为涉及到 ​​COM​​​ 互操作,所以它是一个开销很大的动作,你应该一次性读取一个 ​​范围​​​ 到 数组中, 然后再遍历这个 ​​数组​​,参考如下代码:

object[,] data = Range.Value2;

// Create new Column in DataTable
for (int cCnt = 1; cCnt <= Range.Columns.Count; cCnt++)

textBox3.Text = cCnt.ToString();

var Column = new DataColumn();
Column.DataType = System.Type.GetType("System.String");
Column.ColumnName = cCnt.ToString();
DT.Columns.Add(Column);

// Create row for Data Table
for (int rCnt = 1; rCnt <= Range.Rows.Count; rCnt++)

textBox2.Text = rCnt.ToString();

string CellVal = String.Empty;
try

cellVal = (string)(data[rCnt, cCnt]);

catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException)

ConvertVal = (double)(data[rCnt, cCnt]);
cellVal = ConvertVal.ToString();


DataRow Row;

// Add to the DataTable
if (cCnt == 1)


Row = DT.NewRow();
Row[cCnt.ToString()] = cellVal;
DT.Rows.Add(Row);

else


Row = DT.Rows[rCnt + 1];
Row[cCnt.ToString()] = cellVal;




总的来说,​​MS Office Interop​​​ 本身就很慢,其实微软自己也不推荐用这个方式,也不能用来导入大 Excel 文件,更多细节可参考:​​https://support.microsoft.com/en-us/topic/considerations-for-server-side-automation-of-office-48bcfe93-8a89-47f1-0bce-017433ad79e2​

所以我个人建议,你应该使用 ​​EasyXLS​​​ 或者 ​​EditPlus​​ 这样的第三方库。

点评区

现实开发中,用微软的 ​​MS Office Interop​​​ 去操控 Excel 的确实比较少,貌似还要在本机安装 ​​Office365​​​, 用 ​​EditPlus​​ 就好啦。

以上是关于如何快速的将 DataTable 导入到 Excel 中 ?的主要内容,如果未能解决你的问题,请参考以下文章

求助!请问mysql如何快速导入超大的sql文件?

C#中如何将DataTable保存到数据库?

如何高效地批量导入数据到SqlServer

c#中 如何把datatable导入到mysql中

如何高效地批量导入数据到SqlServer

如何快速的将已知的1000万条数据插入到数据库中