• Qt篇——QTableWidget保存表格数据到Excel文件中,读Excel内容到QTableWidget


    表格和excel例子如下图所示: 

    一、QTableWidget保存表格数据到Excel文件中

    代码如下:

    (pro文件中添加QT += axcontainer)

    1. #include
    2. void MainWindow::saveTableToExcel() {
    3. QDateTime current_date_time =QDateTime::currentDateTime();
    4. QString excelName = "data_" + current_date_time.toString("yyyy-MM-dd_hh-mm-ss");
    5. QString filePath = QFileDialog::getSaveFileName(this, "Save Data", excelName, "Microsoft Excel 2013(*.xlsx)");
    6. int row = ui->originDataTable->rowCount();
    7. int col = ui->originDataTable->columnCount();
    8. QAxObject* excel = new QAxObject(this);
    9. //excel->setControl("ket.Application");//wps
    10. excel->setControl("Excel.Application"); //Excel
    11. excel->dynamicCall("SetVisible(bool Visible)", false);
    12. excel->setProperty("DisplayAlerts", false);
    13. QAxObject* workbooks = excel->querySubObject("WorkBooks");
    14. workbooks->dynamicCall("Add");
    15. QAxObject* workbook = excel->querySubObject("ActiveWorkBook");
    16. QAxObject* worksheets = workbook->querySubObject("Sheets");
    17. QAxObject* worksheet = worksheets->querySubObject("Item(int)", 1);
    18. for (int i = 0; i < row; i++) {
    19. for (int j = 0; j < col; j++) {
    20. QAxObject* Range = worksheet->querySubObject("Cells(int,int)", i + 1, j + 1);
    21. Range->dynamicCall("SetValue(const QString &)", ui->originDataTable->item(i, j)->text());
    22. }
    23. }
    24. workbook->dynamicCall("SaveAs(const QString &)", QDir::toNativeSeparators(filePath));
    25. if (excel != NULL) {
    26. excel->dynamicCall("Quit()");
    27. delete excel;
    28. excel = NULL;
    29. }
    30. QMessageBox::information(this, QStringLiteral("提示"), "保存成功");
    31. }

    二、读Excel文件内容到QTableWidget表格中

    1. #include
    2. void MainWindow::saveTableToExcel() {
    3. QString strFile = QFileDialog::getOpenFileName(this,QStringLiteral("选择Excel文件"),"","Exel file(*.xls *.xlsx)");
    4. if (strFile.isEmpty()){
    5. return;
    6. }
    7. QAxObject excel("Excel.Application");
    8. excel.setProperty("Visible", false);
    9. QAxObject *work_books = excel.querySubObject("WorkBooks");
    10. //打开指定文件
    11. work_books->dynamicCall("Open (const QString&)", strFile);
    12. QAxObject *work_book = excel.querySubObject("ActiveWorkBook");
    13. QString ExcelName;
    14. static int row_count = 0, column_count = 0;
    15. QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);
    16. QAxObject *used_range = work_sheet->querySubObject("UsedRange");
    17. QAxObject *rows = used_range->querySubObject("Rows");
    18. row_count = rows->property("Count").toInt();
    19. QAxObject *column = used_range->querySubObject("Columns");
    20. column_count = column->property("Count").toInt();
    21. //这里先清空QTableWidget表格数据
    22. ui->originDataTable->clearContents();
    23. ui->setRowCount(0);
    24. for (int i = 1; i <= row_count; i++) {
    25. QStringList dataList;
    26. for (int j = 1; j <= column_count;j++) {
    27. QAxObject *range = work_sheet->querySubObject("Cells(int,int)",i,j); //获取cell的值
    28. QString strVal = range->dynamicCall("Value2()").toString();
    29. dataList << strVal;
    30. }
    31. int row = ui->originDataTable->rowCount();
    32. ui->originDataTable->insertRow(row);
    33. for (int col = 0; col < dataList.size(); ++col) {
    34. QTableWidgetItem *pItem = new QTableWidgetItem(dataList[col]);
    35. ui->originDataTable->setItem(row, col, pItem);
    36. }
    37. }
    38. work_book->dynamicCall("Close(Boolean)", false); //关闭文件
    39. excel.dynamicCall("Quit(void)"); //退出
    40. }

    总结:

    QAxObject读取excel较为方便,不必使用第三方库;缺点是读取excel文件时非常慢,一个内容很少的excel文件读取都需要几秒钟。 用第三方库读取效率会高一些,我用的是xlsx的库,需要的可以在评论区留下自己的邮箱,我将在有空时回复并发到邮箱。

  • 相关阅读:
    使用 Vue3 + ts 开发一个ProTable
    艾美捷内毒素水平<0.1 EU/mg的卵清蛋白(OVA)
    Swift中的strong, weak, unowned
    自定义Dynamics 365实施和发布业务解决方案 - 7. 报表
    【CVPR2022 点云3D检测SOTA】SoftGroup for 3D Instance Segmentation on Point Clouds
    有自动交易股票的软件么,怎么实现全自动交易?
    【MySQL】 Java的JDBC编程
    软件工程师真的只是编码吗?不,他有10个隐蔽的工作
    MySQL查询(基础到高级)
    第二章《Java程序世界初探》第7节:关系运算符及条件语句
  • 原文地址:https://blog.csdn.net/u011391361/article/details/136314243