簡體   English   中英

如何將數據從Excel工作表導入c#中的數據表?

[英]How to import data from Excel sheet to data Table in c#?

我在 C# 中使用 Asp.net。 我需要將數據從 Excel 工作表導入到 DataTable。 該工作表有 100,000 條記錄,有四列:名字、姓氏、電子郵件、電話號碼。

我怎樣才能做到這一點?

使用以下代碼:

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

您還可以參考以下問題:如果您希望更快地導入,請快速將 Excel 導入到數據表中

我不確定這是否可以在 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();
        }
    }

速度問題?

我會注意到幾種方法來做到這一點:

  • ODBC(在這里回答)
  • 互操作(在這里回答)

這些都有缺點,它們可能不快; Interop 需要 excel 來運行它,並且在重新運行它或嘗試運行它的 Web 服務器時可能會導致很多問題。

請先嘗試@milan_m 解決方案。 如果有問題,請回到這里。

因此,一些更快、可能更好的解決方案就是這樣。

  • 非營利組織
  • 另存為 CSV

NPOI 可用作 C# 的 NuGet,並且可以很好地讀取 excel 文件。 是的,這是產品推薦,但您沒有要求。 這是一個維護良好的項目,將與 2030 年代的讀者相關。

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

如果 ODBC 速度太慢,並且您的用戶上傳不同的 XLSX 文件作為用例的一部分,您將需要使用 NPOI。 除非您只聯系 2 或 3 個內部高級用戶,否則您可以要求他們將其上傳為 CSV。

如果用例是:您只使用一個對所有用戶都相同的 .XLSX 文件,然后將它與應用程序一起部署呢?

你沒有提到是否是這種情況,這會產生巨大的差異。 如果您保存為 csv並在程序啟動時使用它,您肯定會領先數英里。 或者,如果您需要在數據表中使用它,請在開發時將其導入數據表並使用數據集對象上的方法將其保存到 XML 文件中(您必須將 tbl 放入一個集合中以保存為 XML 我相信.. . 很多例子比比皆是)。

如果您需要進行超級靈活的查找,數據表(或對象集合和 linq-to-objects)是不錯的選擇。

但是,如果您必須以極快的速度查找項目,而不是通過范圍,而只是通過精確匹配,請在啟動時將其從 CSV 或類似文件加載到字典或字典中。

我為一個使用互操作 + excel 搜索大約 2-30 萬條記錄的電子表格的高級用戶這樣做了……操作從 90 分鍾縮短到 30 秒。 字面上地。 字典是在 .Net 中查找內容的最快方法,如果您可以將這些內容放入內存中,也就是說,不必一直重新加載不同的數據(因此請保留您的 RDBMS)。

哎呀。

剛剛看到這個問題已經7歲了。 @#$​​^#@!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM