【问题标题】:How to import data from Excel sheet to data Table in c#?如何将数据从Excel工作表导入c#中的数据表?
【发布时间】:2021-08-03 04:49:44
【问题描述】:

我正在使用带有 C# 的 Asp.net。我需要将数据从 Excel 工作表导入到 DataTable。该工作表有 100,000 条记录,包含四列:名字、姓氏、电子邮件、电话号码。

我该怎么做?

【问题讨论】:

  • 先更正你的问题
  • 谢谢约翰尼,使用 LinqToExcel 从 excelsheet 中检索 1 个 Lacs 记录是否很快?如果是这样,我该如何改进?

标签: c# asp.net excel


【解决方案1】:

使用以下代码:

public static DataTable exceldata(string filePath)
    {     
        DataTable dtexcel = new DataTable();
           bool hasHeaders = false;
            string HDR = hasHeaders ? "Yes" : "No";
            string strConn;
            if (filePath.Substring(filePath.LastIndexOf('.')).ToLower() == ".xlsx")
                strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=0\"";
            else
                strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=0\"";
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();
            DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
            //Looping Total Sheet of Xl File
            /*foreach (DataRow schemaRow in schemaTable.Rows)
            {
            }*/
            //Looping a first Sheet of Xl File
            DataRow schemaRow = schemaTable.Rows[0];
            string sheet = schemaRow["TABLE_NAME"].ToString();
            if (!sheet.EndsWith("_"))
            {
                string query = "SELECT  * FROM [" + sheet3 + "]";
                OleDbDataAdapter daexcel = new OleDbDataAdapter(query, conn);
                dtexcel.Locale = CultureInfo.CurrentCulture;
                daexcel.Fill(dtexcel);
            }

        conn.Close();
        return dtexcel;

    }

来源:http://www.codeproject.com/Questions/445400/Read-Excel-Sheet-Data-into-DataTable

如果您想更快地导入,也可以参考以下问题:Importing Excel into a DataTable Quickly

【讨论】:

    【解决方案2】:

    我不确定这是否可以在 ASP.NET 中工作,但它可以在 WPF 中工作,所以也许你可以从中获得一些东西?

    无论如何,在全球范围内:

    Microsoft.Office.Interop.Excel.Application xls;
    

    然后选择并阅读电子表格:

         private void readSheet()
        {
            // Initialise and open file picker
            OpenFileDialog openfile = new OpenFileDialog();
            openfile.DefaultExt = ".xlsx";
            openfile.Filter = "Office Files | *xls;.xlsx";
            var browsefile = openfile.ShowDialog();
    
            if (browsefile == true)
            {
                string path = openfile.FileName;
    
                xls = new Microsoft.Office.Interop.Excel.Application();
    
                // Dynamic File Using Uploader... Note the readOnly flag is true
                Workbook excelBook = xls.Workbooks.Open(path, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                Worksheet excelSheet = (Worksheet)excelBook.Worksheets.get_Item(1); ;
                Range excelRange = excelSheet.UsedRange;
    
                // Make default cell contents
                string strCellData = String.Empty;
                double douCellData;
    
                // Initialise row and column
                int rowCnt, colCnt = 0;
    
                // Initialise DataTable
                System.Data.DataTable dt = new System.Data.DataTable();
    
                // Loop through first row of columns to make header
                for (colCnt = 1; colCnt <= excelRange.Columns.Count; colCnt++)
                {
                    string strColumn = "";
                    strColumn = Convert.ToString((excelRange.Cells[1, colCnt] as Range).Value2);
                    var Column = dt.Columns.Add();
                    Column.DataType = Type.GetType("System.String");
    
                    // Check & rename for duplicate entries
                    if (dt.Columns.Contains(strColumn))
                        Column.ColumnName = (strColumn + ", " + colCnt);
                    else
                        Column.ColumnName = strColumn;
                }
                dt.AcceptChanges();
    
                // Fill in the rest of the cells
                for (rowCnt = 2; rowCnt <= excelRange.Rows.Count; rowCnt++)
                {
                    string strData = "";
                    for (colCnt = 1; colCnt <= excelRange.Columns.Count; colCnt++)
                    {
                        try
                        {
                            strCellData = Convert.ToString((excelRange.Cells[rowCnt, colCnt] as Range).Value2);
                            strData += strCellData + "|";
                        }
                        catch (Exception ex)
                        {
                            douCellData = (excelRange.Cells[rowCnt, colCnt] as Range).Value2;
                            strData += douCellData.ToString() + "|";
                            Console.Write(ex.ToString());
                        }
                    }
                    strData = strData.Remove(strData.Length - 1, 1);
                    dt.Rows.Add(strData.Split('|'));
    
                }
    
                dtGrid.ItemsSource = dt.DefaultView;
                try
                {
                    excelBook.Close(true, null, null);
                }
                catch (System.Runtime.InteropServices.COMException comEX)
                {
                    Console.Write("COM Exception: " + comEX.ToString());
                }
                xls.Quit();
            }
        }
    

    【讨论】:

    • 这可以工作,但它需要在 Web 服务器上安装 MS Office,并且会在后台为每个使用它的 http 请求打开一个 excel 实例。
    【解决方案3】:

    速度问题?

    我会指出几种方法来做到这一点:

    • ODBC(在此回答)
    • 互操作(此处已回答)

    这些有缺点,它们可能不会很快; Interop 需要 excel,运行它,并且在重新运行它或尝试运行它的 Web 服务器时可能会导致很多问题。

    请先尝试@milan_m 解决方案。如果有问题回来这里。

    所以一些更快,可能更好的解决方案就是这样。

    • 非营利组织
    • 另存为 CSV

    NPOI 可用作 C# 的 NuGet,并且可以很好地读取 excel 文件。是的,这是产品推荐,但您没有要求。这是一个维护良好的项目,将与 2030 年代的读者相关。

    https://github.com/nissl-lab/npoi

    如果 ODBC 太慢,您将需要使用 NPOI,并且您的用户正在上传不同的 XLSX 文件作为用例的一部分。除非您联系的内部高级用户只有 2 或 3 个,否则您可以要求他们将其上传为 CSV。

    如果用例是:您只需使用一个对所有用户都相同的 .XLSX 文件,然后将其与应用程序一起部署?

    你没有提到是否是这种情况,它会产生巨大的差异。如果您保存为 csv 并在程序启动时使用它,那么您肯定将遥遥领先。或者,如果您在数据表中需要它,请在开发时将其导入数据表并使用数据集对象上的方法将其保存到 XML 文件(您必须将 tbl 放入集合中以保存为 XML 我相信.. . 许多例子比比皆是)。

    如果您需要进行超级灵活查找,数据表(或对象集合和 linq-to-objects)很好。

    但是,如果您必须以极快的速度查找项目,而不是通过范围,而只是通过精确匹配,请在启动时将其从 CSV 或类似文件加载到一个或多个字典中。

    我为一位正在使用 interop+excel 搜索大约 2-30 万/记录的电子表格的高级用户执行此操作...操作从 90 分钟缩短到 30 秒。字面上地。字典是在 .Net 中查找内容的最快方法,如果您可以将这些内容放入内存中,也就是说,并且不必一直重新加载不同的数据(因此请保留您的 RDBMS)。

    哎呀。

    刚刚看到这个问题是7岁。 @#$​​^#@!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 2012-09-14
      相关资源
      最近更新 更多