0

我需要读取一个包含许多合并单元格的 Excel 文件。假设第一列包含“Category”值,第二列包含“sub_category”值。问题是每个类别单元格可能是第二列中具有多个 sub_categories 的合并单元格。我需要知道这个合并单元格占用的行数。我的图表是这样的:

在此处输入图像描述

已经提出了类似的问题,但使用不同的语言:

QString category = "";
QString sub_category = "";    

auto excel     = new QAxObject("Excel.Application");
auto workbooks = excel->querySubObject("Workbooks");
auto workbook  = workbooks->querySubObject("Open(const QString&)" ,"C:\\Users\\Orkideh\\Documents\\build-MyApp-Desktop_Qt_5_12_9_MSVC2017_64bit-Debug\\Book1.xlsx");
auto sheets    = workbook->querySubObject("Worksheets");
auto sheet     = sheets->querySubObject("Item(int)", 1);
   
// Read the rows 2..150
for (int r = 2; (r <= 150); ++r)
{
    auto cCell = sheet->querySubObject("Cells(int,int)",r,1);
    category = cCell->dynamicCall("Value()").toString().simplified();       
    
    // if each row in the excel file had only 1 category and 1 sub-category,
    // I could use the below code to get sub_category:
    
    // cCell = sheet->querySubObject("Cells(int,int)",r, 2);
    // sub_category = cCell->dynamicCall("Value()").toString().simplified();
    
    // But in fact, the cell with category value might be a merged cell with
    // unknown number of rows.
    // I need to know the number of rows that this merged cell occupies to connect 
    // each sub_category to its own category.
}
4

1 回答 1

0

我终于从这里得到了答案: https ://blog.csdn.net/u18004660201/article/details/80350164

可以获得目标单元格的第一行和下一个单元格的第一行的编号。通过获取单元格的“范围”和“合并区域”是可行的。

    for (int row = 2; row <= 150; ++row)
{
    QAxObject *range = sheet->querySubObject("Cells(int,int)", row, 1);
    range =  range->querySubObject("MergeArea");
    const int nRowStart = range->property("Row").toInt();
    const int nRowEnd = range->property("Column").toInt();
    range =  sheet->querySubObject("Cells(int,int)", nRowStart, nRowEnd);

    cout << "Value: " << range->property("Value").toString() << endl
                    << "The first line of this cell: " << nRowStart << endl << endl;
    // Do some other tasks...
}

此代码读取所有行,但不再将 null 作为第一列中合并单元格的值打印。nRowStart 保存第一行的编号。现在,我可以设置一个计数器并增加它,直到 nRowStart 的值变新,这意味着我已经到达下一个单元格。该计数器的值是我需要的。

于 2021-02-08T16:35:48.940 回答