方法一:使用第三方库xlsx

优点:可以对复杂的数据进行导出

教程1:
1、源码下载地址:https://github.com/dbzhang800/QtXlsxWriter
2、下载并安装编译时需要的工具 Perl:https://www.perl.org/get.html,根据不同的系统选择不同的perl,对于我们来讲选择activeperl安装包即可。
3、解压QtXlsxWriter-master.zip到E盘根目录下,用Qt 5.9.8 Creator打开E:/QtXlsxWriter-master/src/src.pro。
4、打开xlsxzipreader.cpp文件,定位到51行,把QList 改成 QVector
QVector allFiles = m_reader->fileInfoList();
  保存并构建项目src,这时在E:/QtXlsxWriter-master/lib目录下生成lib文件,在E:/QtXlsxWriter-master/bin目录下生成dll文件,E:/QtXlsxWriter-master/include目录下是一些头文件。
5、拷贝E:/QtXlsxWriter-master/include/QtXlsx目录到Qt的include目录下: C:/Qt/Qt5.9.8/5.9.8/mingw53_32/include(ubuntu18.04的目录为/opt/Qt5.9.8/5.9.8/gcc_64/include)
6、拷贝E:/QtXlsxWriter-master/lib文件夹下Qt5Xlsxd.lib(Qt5Xlsxd.a) Qt5Xlsx.lib(Qt5Xlsx.a) Qt5Xlsx.prl Qt5Xlsxd.prl4个文件到Qt的lib下:C:/Qt/Qt5.9.8/5.9.8/mingw53_32/lib(ubuntu18.04的目录为/opt/Qt5.9.8/5.9.8/gcc_64/lib)
7、拷贝E:/QtXlsxWriter-master/bin文件夹下的Qt5Xlsx.dll Qt5Xlsxd.dll库文件的Qt库路径下C:/Qt/Qt5.9.8/5.9.8/mingw53_32/bin(ubuntu18.04无)
8、拷贝 E:/QtXlsxWriter-master/mkspecs/modules-inst 文件夹下的qt_lib_xlsx.pri和qt_lib_xlsx_private.pri到Qt模块下 C:/Qt/Qt5.9.8/5.9.8/mingw53_32/mkspecs/modules(ubuntu18.04的目录为/opt/Qt5.9.8/5.9.8/gcc_64/mkspecs/modules)
9、拷贝E:/QtXlsxWriter-master/src文件夹到C:/Qt/Qt5.9.8/5.9.8/mingw53_32目录下(ubuntu18.04的目录为/opt/Qt5.9.8/5.9.8/Src)
10、接下来就可以使用Qt进行excel的操作了,只是需要注意:
  使用的时候需要包含头文件
  #include
  using namespace QXlsx;
  在你的qmake .pro 需要添加
  QT += xlsx
教程2:https://blog.csdn.net/qq_33559992/article/details/85716934
教程3:https://blog.csdn.net/c3060911030/article/details/51560239

示例:
http://qtxlsx.debao.me/qtxlsx-examples.html
Xlsx C ++类:
http://qtxlsx.debao.me/qtxlsx-module.html

方法二:直接导出.csv文件

优点:简单
缺点:不能进行复杂的数据导出

  1. #include <QFile>
  2. #include <QFileDialog>
  3. #define debug qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]" // 调试
  4. void ShowTraceData::shows()
  5. {
  6. // 获取保存文件名
  7. QString fileName = QFileDialog::getSaveFileName(this, tr("Save File")," ",tr("file (*.csv)"));
  8. if (!fileName.isEmpty()) // 判断是否为空
  9. {
  10. QFile file(fileName); // 创建
  11. // 以只写方式打开,若已经有则。
  12. bool ret = file.open( QIODevice::Truncate | QIODevice::WriteOnly);
  13. if(!ret)
  14. return;
  15. // 创建文件流
  16. QTextStream stream(&file);
  17. QString conTents;
  18. QHeaderView * header = ui->tableWidget->horizontalHeader(); // 获取列表头
  19. if (header)
  20. {
  21. conTents = "序号,"; // 开始以序号填充
  22. for ( int i = 0; i < header->count(); i++ )
  23. {
  24. QTableWidgetItem *item = ui->tableWidget->horizontalHeaderItem(i);
  25. if (!item)
  26. {
  27. continue;
  28. }
  29. conTents += item->text() + ",";
  30. }
  31. conTents += "\n";
  32. }
  33. // 行
  34. for ( int i = 0 ; i < ui->tableWidget->rowCount(); i++ )
  35. {
  36. // 行表头
  37. QTableWidgetItem *item = ui->tableWidget->verticalHeaderItem(i); // 获取表头
  38. if(!item)
  39. {
  40. continue;
  41. }
  42. conTents += item->text() + ","; // 添加表头
  43. // 列 内容
  44. for ( int j = 0; j < ui->tableWidget->columnCount(); j++ )
  45. {
  46. QTableWidgetItem* item = ui->tableWidget->item(i, j); // 获取内容
  47. if ( !item )
  48. {
  49. conTents += ",";
  50. continue;
  51. }
  52. QString str = item->text(); // 获取内容
  53. debug << "i" << i << "j" << j << "str" << str;
  54. str.replace(","," ");
  55. conTents += str + ",";
  56. }
  57. conTents += "\n";
  58. }
  59. debug << "conTents:" << conTents;
  60. stream << conTents; // 将内容添加到文件流中
  61. file.close();
  62. }
  63. }
  64. // 导出Excel按钮
  65. void ShowTraceData::on_exportExcel_clicked()
  66. {
  67. shows();
  68. }

方法三:使用Qt自带的库QAxObject

缺点:效率低,且数据多就出错
《Qt5+QAxObject操作Excel》: https://blog.csdn.net/mars_xiaolei/article/details/83410397#comments