首頁 >後端開發 >C++ >如何在 C# 或 VB.NET 中有效地將 Excel 工作表讀取到 DataTable 中?

如何在 C# 或 VB.NET 中有效地將 Excel 工作表讀取到 DataTable 中?

Patricia Arquette
Patricia Arquette原創
2024-12-31 21:50:17704瀏覽

How can I efficiently read Excel sheets into a DataTable in C# or VB.NET?

將Excel 工作表讀取到資料表中:最佳化效能與效率

您偶然發現了一個常見的挑戰- 快速且有效率地將Excel 資料匯入到數據表中。您目前使用 Microsoft Excel 驅動程式的 VB 解決方案是一種可行的方法,但讓我們探索一些可能提供增強功能的替代方法。

C# 實作

如果您更喜歡C#,這裡有一個改編自Ciarán 的程式碼片段沃爾什的答案:

string sSheetName = null;
string sConnection = null;
DataTable dtTablesList = default(DataTable);
OleDbCommand oleExcelCommand = default(OleDbCommand);
OleDbDataReader oleExcelReader = default(OleDbDataReader);
OleDbConnection oleExcelConnection = default(OleDbConnection);

sConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test.xls;Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\"";

oleExcelConnection = new OleDbConnection(sConnection);
oleExcelConnection.Open();

dtTablesList = oleExcelConnection.GetSchema("Tables");

if (dtTablesList.Rows.Count > 0)
{
    sSheetName = dtTablesList.Rows[0]["TABLE_NAME"].ToString();
}

dtTablesList.Clear();
dtTablesList.Dispose();


if (!string.IsNullOrEmpty(sSheetName))
{
    oleExcelCommand = oleExcelConnection.CreateCommand();
    oleExcelCommand.CommandText = "Select * From [" + sSheetName + "]";
    oleExcelCommand.CommandType = CommandType.Text;
    oleExcelReader = oleExcelCommand.ExecuteReader();
    nOutputRow = 0;

    while (oleExcelReader.Read())
    {
    }
    oleExcelReader.Close();
}
oleExcelConnection.Close();

替代方案效率

考慮使用NPOI 函式庫,它提供了適用於.NET 的託管Excel 程式庫並支援最新的Excel 檔案格式。與使用 ODBC 驅動程式相比,NPOI 可以提供更高的速度。

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

public static DataTable ReadExcelSheet(string filePath, string sheetName)
{
    var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    var workbook = new HSSFWorkbook(stream);
    var sheet = workbook.GetSheet(sheetName);
    var table = new DataTable();

    var firstRow = sheet.GetRow(0);
    for (int i = 0; i < firstRow.Cells.Count; i++)
    {
        table.Columns.Add(firstRow.Cells[i].ToString());
    }

    for (int i = 1; i <= sheet.LastRowNum; i++)
    {
        var row = sheet.GetRow(i);
        var dataRow = table.NewRow();
        for (int j = 0; j < row.Cells.Count; j++)
        {
            dataRow[j] = row.Cells[j].ToString();
        }
        table.Rows.Add(dataRow);
    }

    return table;
}

物件處置

關於您有關物件處置的問題,您不需要明確呼叫Dispose() 或設定變數在VB 程式碼中將其設為Nothing,因為退出using區塊時將自動釋放物件。但是,明確處置物件以確保正確的資源管理通常是一種很好的做法。

CSV 轉換以加快讀取速度

如果速度是關鍵因素,請考慮將 Excel 檔案轉換為 CSV 檔案(.csv),然後將其匯入資料表。 CSV檔案是純文字文件,結構簡單,可以顯著提高讀取速度。您可以使用 TextFieldParser 類別來高效讀取 CSV 檔案:

public static DataTable GetDataTableFromCSVFile(string csv_file_path)
{
    var csvData = new DataTable();
    using (var csvReader = new TextFieldParser(csv_file_path))
    {
        csvReader.SetDelimiters(new string[] { "," });
        csvReader.HasFieldsEnclosedInQuotes = true;

        var colFields = csvReader.ReadFields();
        foreach (var column in colFields)
        {
            var dataColumn = new DataColumn(column);
            dataColumn.AllowDBNull = true;
            csvData.Columns.Add(dataColumn);
        }

        while (!csvReader.EndOfData)
        {
            var fieldData = csvReader.ReadFields();
            //Making empty value as null
            for (int i = 0; i < fieldData.Length; i++)
            {
                if (fieldData[i] == string.Empty)
                {
                    fieldData[i] = null;
                }
            }
            csvData.Rows.Add(fieldData);
        }
    }
    return csvData;
}

以上是如何在 C# 或 VB.NET 中有效地將 Excel 工作表讀取到 DataTable 中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn