Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 获取Excel C+的单元格组范围+/cli_.net_Excel_C++ Cli_Excel Interop - Fatal编程技术网

.net 获取Excel C+的单元格组范围+/cli

.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

我有一个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->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();