.net 获取Excel C+的单元格组范围+/cli
我有一个Excel电子表格,我想使用.Net framework从中提取数据。工作表在某种程度上如下所示:.net 获取Excel C+的单元格组范围+/cli,.net,excel,c++-cli,excel-interop,.net,Excel,C++ Cli,Excel Interop,我有一个Excel电子表格,我想使用.Net framework从中提取数据。工作表在某种程度上如下所示: A B C D E F G 1 |hello| by | it |____|____| it | is | 2 | Hi | he | To |____|____|you | are| 我如何获得两个单独的范围来将两个“表”拉入两个不同的数据表中 我知道有 Excel::Range^ RANGE = Worksheet->Ce
A B C D E F G
1 |hello| by | it |____|____| it | is |
2 | Hi | he | To |____|____|you | are|
我如何获得两个单独的范围来将两个“表”拉入两个不同的数据表中
我知道有
Excel::Range^ RANGE = Worksheet->Cells;
但就其一而言,我不知道如何利用射程。第二,在阅读之后,它显然返回了工作表的整个范围,并且没有将两个“表”分开
有人知道我如何得到范围“A1:C2”和F1:G2吗?应该是整个电子表格。你要求它提供一个表示整个工作表中所有单元格的范围^
,这就是你得到的。(引用MSDN:“返回一个表示工作表中所有单元格的范围对象(不仅仅是当前正在使用的单元格)。)
Range
对象仅表示一组单元格;它与工作表中的子表没有天生的联系,就像您的“A1:C2”和“F1:G2”一样
要获取子表,请使用属性。我相信这样做的方法是获取单元格A1并调用CurrentRegion获取A1:C2,在F1上获取F1:G2
(显然,更好的设计是,如果可能的话,将两个子表放在工作簿中各自的工作表中。)
下面是如何获取单个单元格的值
String^ val1 = ws->Range["A1","A1"]->Value2->ToString();
ws->Range[((Excel::Range^)ws->Cells[(System::Object^)rowInteger, (System::Object^)columnInteger]), ((Excel::Range^)ws->Cells[(System::Object^)rowInteger, (System::Object^)columnInteger])]->Value2->ToString();
然后是另一种获得单个单元格值的方法
String^ val1 = ws->Range["A1","A1"]->Value2->ToString();
ws->Range[((Excel::Range^)ws->Cells[(System::Object^)rowInteger, (System::Object^)columnInteger]), ((Excel::Range^)ws->Cells[(System::Object^)rowInteger, (System::Object^)columnInteger])]->Value2->ToString();
Microsoft::Office::Interop::Excel::Application ^xl=gcnew Microsoft::Office::Interop::Excel::ApplicationClass()
Microsoft::Office::Interop::Excel::工作簿^wb=xl->工作簿->打开(路径、类型::缺失、类型::缺失、类型::缺失、类型::缺失、类型::缺失、类型::缺失、类型::缺失、类型::缺失、类型::缺失、类型::缺失、类型::缺失、类型::缺失、类型::缺失、类型::缺失); Microsoft::Office::Interop::Excel::Worksheet ^ws=static\u castMicrosoft::Office::Interop::Excel::Worksheet^(wb->Sheets[“Tabelle1]”)
Microsoft::Office::Interop::Excel::Range^rng1=ws->UsedRange;
// ----------------------------------------------------------------------
对于(int-Rnum=2;Rnum行->计数;Rnum++)
{
数据行^dr=dt->NewRow();
对于(int Cnum=1;Cnum列->计数;Cnum++)
{
如果(((Microsoft::Office::Interop::Excel::Range^)rng1->Cells[Rnum,Cnum])->Value2!=nullptr)
{
dr[Cnum-1]=((Microsoft::Office::Interop::Excel::Range^)rng1->Cells[Rnum,Cnum])->Value2->ToString();
}
}
dt->行->添加(dr);
dt->AcceptChanges();
}
对于每个(数据行^dr在dt->行中)
{
_dataGridView\u main->Rows->Add(dr->ItemArray);
}
//读取后关闭Excel文件
xl->Quit();
我不确定我是否真的理解您想要做什么,但如果您想创建A1到C2的范围,我建议您尝试get_range方法。类似于工作表->get_range(工作表->单元格[1,1],工作表->单元格[2,3]);
Microsoft::Office::Interop::Excel::Range^ rng1 = ws->UsedRange;
// ----------------------------------------------------------------------
for (int Rnum = 2; Rnum <= rng1->Rows->Count; Rnum++)
{
DataRow^ dr = dt->NewRow();
for (int Cnum = 1; Cnum <= rng1->Columns->Count; Cnum++)
{
if (((Microsoft::Office::Interop::Excel::Range^)rng1->Cells[Rnum, Cnum])->Value2 != nullptr)
{
dr[Cnum - 1] = ((Microsoft::Office::Interop::Excel::Range^)rng1->Cells[Rnum, Cnum])->Value2->ToString();
}
}
dt->Rows->Add(dr);
dt->AcceptChanges();
}
for each (DataRow ^ dr in dt->Rows)
{
_dataGridView_main->Rows->Add(dr->ItemArray);
}
// Close Excel file after reading
xl->Quit();