CÃlimos 2024-03-12 21:29 采纳率: 64.4%
浏览 22

qt 将excel里的内容显示到tablewidget里 但是没显示出来

将excel里的内容显示到tablewidget里 但是没显示出来、 debug看到item里面已经是excel里的内容了,而且行列数都对,但是最后tablehistory这个tablewidget控件里却没有显示出来内容

 QString filepath = QDir::currentPath() + "/历史记录.xlsx";
            QAxObject *excel = NULL;
              QAxObject *workbooks = NULL;
              QAxObject *workbook = NULL;
              excel = new QAxObject(this);
              if (!excel->setControl("Excel.Application"))
              {
                  excel->setControl("ket.Application");
              }
              if (!excel)
              {
                  QMessageBox::critical(NULL, "错误信息", "EXCEL对象丢失");
                  return;
              }
              excel->dynamicCall("SetVisible(bool)", false);
              workbooks = excel->querySubObject("WorkBooks");
              workbook = workbooks->querySubObject("Open(const QString&)",filepath);
              QAxObject * worksheet = workbook->querySubObject("WorkSheets(int)", 1); // 获取第一个工作sheet
              QAxObject * usedrange = worksheet->querySubObject("UsedRange");//获取该sheet的使用范围对象
              QAxObject * rows = usedrange->querySubObject("Rows");
              QAxObject * columns = usedrange->querySubObject("Columns");

              /*获取行数和列数*/
              int intCols = columns->property("Count").toInt();
              int intRows = rows->property("Count").toInt();
              int intRowStart = usedrange->property("Row").toInt();
              int intColStart = usedrange->property("Column").toInt();

              /*获取excel内容*/
              for (int i = intRowStart; i < intRowStart + intRows; i++)  //行
              {
                  for (int j = intColStart; j < intColStart + intCols; j++)
                  {
                      QAxObject *cell = worksheet->querySubObject("Cells(int,int)", i, j);
                      QTableWidgetItem *item = new QTableWidgetItem(cell->dynamicCall("text()").toString());
                      ui->tablehistory->setItem(i, j, item);
                      delete cell;
                      qDebug()<< item->text();
                  }
              }

              // 关闭excel
              workbook->dynamicCall("Close(Boolean)",true);
              excel->dynamicCall("Quit(void)");
              delete excel;
              excel = NULL;

  • 写回答

3条回答 默认 最新

  • 关注

    CÃlimos 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    出现表格没显示出内容的问题可能有以下几个可能的原因:

    1. 表格大小设置有误:可能是因为TableWidget控件的大小不足以显示所有的行和列,导致内容无法正常显示。解决方案:
    • 确保TableWidget控件的大小足够大,能够容纳所有的行和列。可以在设计界面设置控件的大小,或者在代码中调整控件的大小。
    1. 表格行列索引从1开始而不是0:Excel的行列索引是从1开始的,而TableWidget的行列索引是从0开始的。可能是因为在将Excel内容复制到TableWidget时,行列索引没有正确转换,导致内容无法显示。解决方案:
    • 在将Excel内容复制到TableWidget时,将Excel的行列索引减1,以适应TableWidget的索引。
    1. 未设置TableWidget的行列数:可能是因为在将Excel内容复制到TableWidget之前,未设置TableWidget的行列数,导致内容无法正常显示。解决方案:
    • 在将Excel内容复制到TableWidget之前,先设置TableWidget的行列数。可以使用setRowCount()setColumnCount()函数设置TableWidget的行列数。

    综上所述,修复代码如下:

    // 设置TableWidget的行列数
    ui->tablehistory->setRowCount(intRows);
    ui->tablehistory->setColumnCount(intCols);
    
    // 获取excel内容
    for (int i = 0; i < intRows; i++)  //行
    {
        for (int j = 0; j < intCols; j++)
        {
            QAxObject *cell = worksheet->querySubObject("Cells(int,int)", i + intRowStart, j + intColStart);
            QTableWidgetItem *item = new QTableWidgetItem(cell->dynamicCall("text()").toString());
            ui->tablehistory->setItem(i, j, item);
            delete cell;
            qDebug()<< item->text();
        }
    }
    

    请尝试上述修改后的代码,并确保表格大小足够大,以及正确设置TableWidget的行列数,看是否能够正常显示Excel内容。如果还有问题,请提供更多的代码和具体的错误描述,以便更好地帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月12日

悬赏问题

  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音