QtCreator
VS2013
QAxObject在线帮助
使用中遇到的问题
QT界面开发-在VS2017环境下Qt读写Excel遇到"无法打开 源 文件 'QAxObject'"的错误解决办法【转载】
QT界面开发-QtCreator error: C1083: 无法打开包括文件:“QDomDocument”“QAxObject”【转载】
QT界面开发-QAxObject 解析 excel 时报错error LNK2019: 无法解析的外部符号
使用步骤,参考资料
由于这部分资料网上百度一大堆,我就不自己去写详细步骤了。
收集了几个写的比较好的博客文章。
转载自https://blog.csdn.net/weixin_37204973/article/details/80059096
初学Qt 时,发现Qt 并没有自带操作excel 的API, 所以很长时间内都是用的CSV 文件来储存数据报表。这段时间,因为需要,所以参考了一下网上资料,捣鼓了一番。
1 //mainwindow.h 2 3 #ifndef MAINWINDOW_H 4 #define MAINWINDOW_H 5 6 #include <QMainWindow> 7 #include <QAxObject> 8 #include <QAxWidget> 9 #include <QDebug> 10 #include <QList> 11 #include <QVariant> 12 #include <QDir> 13 14 namespace Ui { 15 class MainWindow; 16 } 17 18 class MainWindow : public QMainWindow 19 { 20 Q_OBJECT 21 22 public: 23 explicit MainWindow(QWidget *parent = 0); 24 ~MainWindow(); 25 26 private slots: 27 void on_Write_clicked(); 28 29 void on_Quit_clicked(); 30 31 void on_read_clicked(); 32 33 private: 34 Ui::MainWindow *ui; 35 36 QAxObject *excel; 37 QAxObject *workbooks; 38 QAxObject *workbook; 39 QAxObject *worksheets; 40 QAxObject *worksheet; 41 QAxObject *range; 42 QAxObject *cell; 43 QList<QVariant> allRowData; 44 }; 45 46 #endif // MAINWINDOW_H
1 //mainwindow.cpp 2 3 #include "mainwindow.h" 4 #include "ui_mainwindow.h" 5 6 QString path = "E:/test.xlsx"; 7 8 MainWindow::MainWindow(QWidget *parent) : 9 QMainWindow(parent), 10 ui(new Ui::MainWindow) 11 { 12 ui->setupUi(this); 13 14 //连接excel 15 excel = new QAxObject("Excel.Application"); 16 //是否可视化excel 17 excel->dynamicCall("SetVisible(bool Visible)", true); 18 //是否弹出警告窗口 19 excel->setProperty("DisplayAlerts", false); 20 21 //获取工作簿集合 22 workbooks = excel->querySubObject("WorkBooks"); 23 //新建一个工作簿 24 workbooks->dynamicCall("Add"); 25 //获取当前工作簿 26 workbook = excel->querySubObject("ActiveWorkBook"); 27 //获取工作表格集合 28 worksheets = workbook->querySubObject("Sheets"); 29 //获取当前工作表格1,即sheet1 30 worksheet = worksheets->querySubObject("Item(int)", 1); 31 } 32 33 MainWindow::~MainWindow() 34 { 35 delete ui; 36 } 37 38 void MainWindow::on_Write_clicked() 39 { 40 //产生数据 41 for(int row = 1; row <=1000; row++) { 42 QList<QVariant> aRowData; 43 for(int column = 1; column <= 2; column++) { 44 aRowData.append(QVariant(row*column)); 45 } 46 allRowData.append(QVariant(aRowData)); 47 } 48 49 //选取范围 50 range = worksheet->querySubObject("Range(const QString)", "A1:B1000"); 51 //批量写入 52 range->dynamicCall("SetValue(const QVariant&", QVariant(allRowData)); 53 //设置字体大小 54 range->querySubObject("Font")->setProperty("Size", 30); 55 //获取单元格 56 cell = worksheet->querySubObject("Cells(int, int", 1, 1); 57 //储存一个字符串数据至表格 58 cell->dynamicCall("setValue(const QVariant&", QVariant("abc")); 59 //读取单元格数据 60 QString str = cell->dynamicCall("Value2()").toString(); 61 qDebug()<<"The value of cell is "<< str <<endl; 62 //调整行高 63 worksheet->querySubObject("Range(const QString&", "1:1")->setProperty("RowHeight", 60); 64 //保存至文件注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"",不然一定保存不了。 65 workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(path)); 66 workbook->dynamicCall("Close()"); 67 } 68 69 void MainWindow::on_Quit_clicked() 70 { 71 72 excel->dynamicCall("Quit()"); 73 } 74 75 void MainWindow::on_read_clicked() 76 { 77 //获取工作簿集合 78 workbooks = excel->querySubObject("WorkBooks"); 79 //打开一个工作簿 80 workbooks->dynamicCall("Open(const QString&)", QDir::toNativeSeparators(path)); 81 //获取当前工作簿 82 workbook = excel->querySubObject("ActiveWorkBook"); 83 //获取工作表格集合 84 worksheets = workbook->querySubObject("Sheets"); 85 //获取当前工作表格1,即sheet1 86 worksheet = worksheets->querySubObject("Item(int)", 1); 87 88 QVariant var; 89 //读取当前工作表所有数据 90 QAxObject *usedRange = worksheet->querySubObject("UsedRange"); 91 var = usedRange->dynamicCall("Value"); 92 93 QVariantList varRows = var.toList(); 94 const int rowCount = varRows.size(); 95 QVariantList rowData; 96 for(int i = 0; i<rowCount; ++i) { 97 rowData = varRows[i].toList(); 98 qDebug()<< rowData.at(1); 99 } 100 workbook->dynamicCall("Close()"); 101 }
QAxObject* querySubObject(const char *name, QList<QVariant> &vars);
使用上面这个函数时,要注意,虽然获取的子对象是由父对象统一管理,但他们是在父对象被析构时进行销毁的,所以如果操作单元格时,频繁获取单元格对象,需要手动del 一下。
相关资料
参考资料:
1.Qt 下快速读写Excel指南https://blog.csdn.net/czyt1988/article/details/52121360
2.qt之读写excelhttps://blog.csdn.net/qq_35057840/article/details/54318443
3.QT 操作 excel 教程https://www.cnblogs.com/woxinfeixiang2015/p/7677295.html
4.QT在子线程中使用QAxWidget需要初始化COM的问题https://blog.csdn.net/a1069962325/article/details/48975179
感谢网上提供参考资料的大神们!