首页 >后端开发 >C++ >如何在 C# 或 VB.NET 中有效地将 Excel 工作表读取到 DataTable 中?

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

Patricia Arquette
Patricia Arquette原创
2024-12-31 21:50:17702浏览

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