[英]Convert Excel cell range into DataTable C#
I want to read a selected cell range of Excel sheet into a DataTable without using OLEDB.我想在不使用 OLEDB 的情况下将 Excel 表的选定单元格范围读入 DataTable。 And I don't want to use 3rd party tools either.而且我也不想使用 3rd 方工具。
Here is what I have done so far:这是我到目前为止所做的:
public void converter()
{
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlWorkbook = xlApp.Workbooks.Open(path);
Microsoft.Office.Interop.Excel.Sheets sheets = xlWorkbook.Worksheets;
xlWorksheet = xlWorkbook.Sheets[3];
for (int i = 1; i <= 10; i++)
{
range = xlWorksheet.get_Range("A2", "I8");
System.Array myvalues = (System.Array)range.Cells.Value;
//string[] strArray = ConvertToStringArray(myvalues);
//List<string> lst = myvalues.OfType<string>().ToList();
}
}
How can I achieve this?我怎样才能做到这一点?
After Googling, I ended up with following but I do not know how to make it work with cell range谷歌搜索后,我最终得到了关注,但我不知道如何使它与单元格范围一起工作
public System.Data.DataTable READExcel(string path)
{
Microsoft.Office.Interop.Excel.Application objXL = null;
Microsoft.Office.Interop.Excel.Workbook objWB = null;
objXL = new Microsoft.Office.Interop.Excel.Application();
objWB = objXL.Workbooks.Open(path);
Microsoft.Office.Interop.Excel.Worksheet objSHT = objWB.Worksheets[5];
int rows = objSHT.UsedRange.Rows.Count;
int cols = objSHT.UsedRange.Columns.Count;
System.Data.DataTable dt = new System.Data.DataTable();
int noofrow = 1;
for (int c = 1; c <= cols; c++)
{
string colname = objSHT.Cells[1, c].Text;
dt.Columns.Add(colname);
noofrow = 2;
}
for (int r = noofrow; r <= rows; r++)
{
DataRow dr = dt.NewRow();
for (int c = 1; c <= cols; c++)
{
dr[c - 1] = objSHT.Cells[r, c].Text;
}
dt.Rows.Add(dr);
}
objWB.Close();
objXL.Quit();
return dt;
}
Kindly help me achieve this.请帮助我实现这一目标。
It's not perfect and you might need to tweek some parameters, I didn't check if it gets the correct area, thats your work.它并不完美,你可能需要调整一些参数,我没有检查它是否得到正确的区域,那是你的工作。 But it gets a DataTable out of an Excel Worksheet, as you asked.但正如你所问的,它从 Excel 工作表中得到了一个数据表。
I'd prefer creating an custom object list with the columns as properties, rather than a DataTable, but thats only me.我更喜欢创建一个以列作为属性的自定义 object 列表,而不是 DataTable,但这只是我。
public System.Data.DataTable READExcel(string path,int row,int col, int rowamount, int colamount, int worksheetindex)
{
Microsoft.Office.Interop.Excel.Application objXL = null;
Microsoft.Office.Interop.Excel.Workbook objWB = null;
objXL = new Microsoft.Office.Interop.Excel.Application();
objWB = objXL.Workbooks.Open(path);
Microsoft.Office.Interop.Excel.Worksheet objSHT = objWB.Worksheets[worksheetindex];
int rows = objSHT.UsedRange.Rows.Count;
int cols = objSHT.UsedRange.Columns.Count;
System.Data.DataTable dt = new System.Data.DataTable();
// Change that for other column names
for (int c = col; c <= col + colamount; c++)
{
dt.Columns.Add(objSHT.Cells[row, c].Text);
}
// read the content
for (int r = row; r <= row+rowamount; r++)
{
DataRow dr = dt.NewRow();
for (int c = col; c <= col+colamount; c++)
{
dr[c - 1] = objSHT.Cells[r, c].Text;
}
dt.Rows.Add(dr);
}
objWB.Close();
objXL.Quit();
return dt;
}
Call it like that:像这样称呼它:
// A2 -> row:2,col:1 till F6 row:2+4, col1+5
READExcel(@"path", 2, 1, 4, 5, 3);
The faster way would be using Value2, example: var range = xlWorksheet.Range["A3", "B4"].Value2;
更快的方法是使用 Value2,例如: var range = xlWorksheet.Range["A3", "B4"].Value2;
(get_Range() doesn't work with my excel) and iterate over it, filling the DataTable. (get_Range() 不适用于我的 excel)并对其进行迭代,填充 DataTable。 range[1,1]
would be the content of A3 in this example. range[1,1]
在本例中将是 A3 的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.