c# - 将 Excel 工作表读入数据表的最佳/最快方法?

标签 c# .net vb.net

我希望这里有人能给我指出正确的方向——我正在尝试创建一个相当强大的实用程序来尽快将 Excel 工作表(可能是 .xls 或 .xlsx)中的数据读入 DataTable并且尽可能精简。

我在 VB 中想出了这个例程(尽管我对一个好的 C# 答案同样满意):

Public Shared Function ReadExcelIntoDataTable(ByVal FileName As String, ByVal SheetName As String) As DataTable
    Dim RetVal As New DataTable

    Dim strConnString As String
    strConnString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & FileName & ";"

    Dim strSQL As String 
    strSQL = "SELECT * FROM [" & SheetName & "$]"

    Dim y As New Odbc.OdbcDataAdapter(strSQL, strConnString)

    y.Fill(RetVal)

    Return RetVal

End Function

我想知道这是否是最好的方法,或者是否有更好/更有效的方法(或者只是更智能的方法——也许是 Linq/原生 .Net 提供程序)来代替使​​用?

另外,只是一个快速而愚蠢的附加问题 - 我是否需要包含诸如 y.Dispose()y = Nothing 之类的代码,或者是否需要注意这些问题of 因为变量应该在例程结束时消失,对吧??

谢谢!!

最佳答案

如果你想根据 Ciarán Answer 在 C# 中做同样的事情

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();

here is another way read Excel into a DataTable without using OLEDB very quick Keep in mind that the file ext would have to be .CSV for this to work properly

private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
{
    csvData = new DataTable(defaultTableName);
    try
    {
        using (TextFieldParser csvReader = new TextFieldParser(csv_file_path))
        {
            csvReader.SetDelimiters(new string[]
            {
                tableDelim 
            });
            csvReader.HasFieldsEnclosedInQuotes = true;
            string[] colFields = csvReader.ReadFields();
            foreach (string column in colFields)
            {
                DataColumn datecolumn = new DataColumn(column);
                datecolumn.AllowDBNull = true;
                csvData.Columns.Add(datecolumn);
            }

            while (!csvReader.EndOfData)
            {
                string[] fieldData = csvReader.ReadFields();
                //Making empty value as null
                for (int i = 0; i < fieldData.Length; i++)
                {
                    if (fieldData[i] == string.Empty)
                    {
                        fieldData[i] = string.Empty; //fieldData[i] = null
                    }
                    //Skip rows that have any csv header information or blank rows in them
                    if (fieldData[0].Contains("Disclaimer") || string.IsNullOrEmpty(fieldData[0]))
                    {
                        continue;
                    }
                }
                csvData.Rows.Add(fieldData);
            }
        }
    }
    catch (Exception ex)
    {
    }
    return csvData;
}

关于c# - 将 Excel 工作表读入数据表的最佳/最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14261655/

相关文章:

c# - XmlSerializer 不使用由 sgen 创建的 XmlSerializers.dll

mysql - 通过获取 ListView 中特定列中的值与我的数据库中的值的总和来更新数据库

c# - ITextSharp 压模损坏 pdf

c# - 为什么静态构造函数中的异常包装在 TypeInitializationException 中

c# - WinCE 6.0,支持GPRS/WiFi

.net - 如何将 JObject 反序列化为 .NET 对象

c# - 如何使用TLBIMP.EXE?

c# - 从 Delphi 应用程序中使用 SerialPort 类调用 C# 非托管导出 DLL

c# - SqlException的构造函数在哪里?

.net - 无法从 VB.NET 应用程序关闭 Excel 进程