[英]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();
}
}
我會注意到幾種方法來做到這一點:
這些都有缺點,它們可能不快; Interop 需要 excel 來運行它,並且在重新運行它或嘗試運行它的 Web 服務器時可能會導致很多問題。
因此,一些更快、可能更好的解決方案就是這樣。
NPOI 可用作 C# 的 NuGet,並且可以很好地讀取 excel 文件。 是的,這是產品推薦,但您沒有要求。 這是一個維護良好的項目,將與 2030 年代的讀者相關。
https://github.com/nissl-lab/npoi
如果 ODBC 速度太慢,並且您的用戶上傳不同的 XLSX 文件作為用例的一部分,您將需要使用 NPOI。 除非您只聯系 2 或 3 個內部高級用戶,否則您可以要求他們將其上傳為 CSV。
你沒有提到是否是這種情況,這會產生巨大的差異。 如果您保存為 csv並在程序啟動時使用它,您肯定會領先數英里。 或者,如果您需要在數據表中使用它,請在開發時將其導入數據表並使用數據集對象上的方法將其保存到 XML 文件中(您必須將 tbl 放入一個集合中以保存為 XML 我相信.. . 很多例子比比皆是)。
如果您需要進行超級靈活的查找,數據表(或對象集合和 linq-to-objects)是不錯的選擇。
但是,如果您必須以極快的速度查找項目,而不是通過范圍,而只是通過精確匹配,請在啟動時將其從 CSV 或類似文件加載到字典或字典中。
我為一個使用互操作 + excel 搜索大約 2-30 萬條記錄的電子表格的高級用戶這樣做了……操作從 90 分鍾縮短到 30 秒。 字面上地。 字典是在 .Net 中查找內容的最快方法,如果您可以將這些內容放入內存中,也就是說,不必一直重新加載不同的數據(因此請保留您的 RDBMS)。
剛剛看到這個問題已經7歲了。 @#$^#@!!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.