将Excel单元格范围转换为DataTable C# [英] Convert Excel cell range into DataTable C#
问题描述
我想在不使用OLEDB的情况下将Excel工作表的选定单元格范围读取到DataTable中.而且我也不想使用第三方工具.
I want to read a selected cell range of Excel sheet into a DataTable without using OLEDB. And I don't want to use 3rd party tools either.
这是我到目前为止所做的:
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();
}
}
我该如何实现?
在谷歌搜索之后,我最终得到了关注,但我不知道如何使它与像元范围一起工作
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.
推荐答案
它并不完美,您可能需要调整一些参数,我没有检查它是否获得正确的区域,这就是您的工作.但是,按照您的要求,它会从Excel工作表中获取数据表.
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.
我宁愿创建一个以列为属性的自定义对象列表,而不是DataTable,但这仅是我.
I'd prefer creating an custom object list with the columns as properties, rather than a DataTable, but thats only me.
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;
}
这样称呼它:
// A2 -> row:2,col:1 till F6 row:2+4, col1+5
READExcel(@"path", 2, 1, 4, 5, 3);
更快的方法是使用Value2,例如: var range = xlWorksheet.Range ["A3","B4"].Value2;
(get_Range()与我的擅长)并对其进行迭代,填充DataTable.在此示例中, range [1,1]
将是A3的内容.
The faster way would be using Value2, example: var range = xlWorksheet.Range["A3", "B4"].Value2;
(get_Range() doesn't work with my excel)
and iterate over it, filling the DataTable. range[1,1]
would be the content of A3 in this example.
这篇关于将Excel单元格范围转换为DataTable C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!