微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

错误报告:Libxl C++ 无法处理某些单元格,抛出逻辑错误,basic_string::_M_construct null 无效

如何解决错误报告:Libxl C++ 无法处理某些单元格,抛出逻辑错误,basic_string::_M_construct null 无效

您好,我正在尝试使用 C++ 中的库 libxl 处理 excel 文件。我正在使用 Ubuntu 18.04。我设法重现了错误,因此我附上了代码和 excel 示例文件。您可以运行代码并查看是否抛出异常。我还附上了输出的屏幕截图,您可以在其中看到抛出了异常。

ma​​in.cpp

中的代码
Book* book = xlCreateXMLBook();
    if(book){
        if(book->load("file2.xlsx")){
        Sheet *sheet = book->getSheet(0);
        if(sheet){
    for(int row = sheet->firstRow(); row < sheet->lastRow(); ++row)
{
   for(int col = sheet->firstCol(); col < sheet->lastCol(); ++col)
     {
          CellType cellType = sheet->cellType(row,col);
          if(sheet->isFormula(row,col))
            {
                //do something here
            }
           else
            {
                if(cellType == CELLTYPE_EMPTY)
                   {
                      ;
                   }
                else if(cellType == CELLTYPE_NUMBER)
                   {
                     ;
                   }
                else if(cellType == CELLTYPE_STRING)
                   {
                      std::cout<<"This is the string: "<<(sheet->readStr(row,col))<<" "<<std::endl;
                      
                      /*
                      const std::string s = sheet->readStr(row,col); //this cause the program to terminate by logic error
                      */
                   }
      
            }}
     }
}
}}

您可以直接复制粘贴代码并自己尝试,看看它是否给您同样的异常。

示例 excel 文件

excel 文件可以从以下链接下载:file2.xlsx

上述示例file2.xlsx上的上述代码输出截图如下所示:

Screenshot of output

另请注意,在上面的代码示例中,我注释掉了给出实际逻辑错误的部分 const std::string s =sheet->readStr(row,col);。您可以看到错误出现在第 25 行或第 26 行左右。我尝试过使用不同文件的程序,但每个文件都遇到了同样的问题。唯一的区别是有时错误出现在第 25 行,有时出现在第 30 行。这似乎是一个随机错误。我该如何解决这个问题?我知道 sheet->readStr(row,col) 给出 std::nullptr 但问题是它为什么返回 std::nullptr?该单元格有一个字符串值,可以在 Excel 表中看到,但 readstr() 仍然返回 std::nullptr。下面我附上第二个屏幕截图,您可以看到程序在第 38 行崩溃,这与上次在第 26 行崩溃不同。此错误似乎是随机出现的。

Screenshot 2

以下是 gdb ./output输出

GDB Screenshot

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。