除查询Word表格的数据外,Qt也可向Word文档输出表格下面这个例子就演示了该过程1.程序界面创建Qt桌面应用程序项目,项目名称为“WordWriteTable”设计程序界面,向Word输出表格及显示程序界面如下图所示。
2.全局变量及方法“mainwindow.h”头文件的代码如下:#include#include#include#include
QT_BEGIN_NAMESPACE namespace Ui { classMainWindow; } QT_END_NAMESPACE typedefstructrecord
{ QString year; //年份 QString total; //高考人数 QString admit; //录取人数 QString rate; //录取率 } Record;
classMainWindow :public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow();
private slots: voidon_btnWrite_clicked(); // “写入”按钮单击事件槽voidview_Word(QString& filename); //在Qt界面预览Word表格
private: Ui::MainWindow *ui; QAxObject *myword; //Word应用程序指针 QAxObject *mydocs; //文档集指针 QAxObject *document;
//文档指针 QAxObject *mytable; //Word中表格指针 QList myrecord; //表格记录列表 QAxWidget *mywidget; //Qt界面上的Word可视化部件
};3. 数据准备在构造函数中读取已有文件的数据,为输出做准备:MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new
Ui::MainWindow) { ui->setupUi(this); myword = new QAxObject("Word.Application"); //创建 Word 应用程序对象
mydocs = myword->querySubObject("Documents"); //获取文档集 mydocs->dynamicCall("Open(const QString&)"
, "D:\\Temp\\1977-2019历年全国高考人数和录取率统计.docx"); //打开源文档 document = myword->querySubObject("ActiveDocument"
); mytable = document->querySubObject("Tables(int)", 1); int rows = mytable->querySubObject("Rows"
)->dynamicCall("Count").toInt(); //获取表格总行数for(int i = rows-4; i < rows + 1; i++) { Record oneRec;
//表格记录结构 QAxObject *infocol = mytable->querySubObject("Cell(int,int)", i, 1); QString year = infocol->querySubObject(
"Range")->property("Text").toString(); oneRec.year = year; //获取年份 infocol = mytable->querySubObject(
"Cell(int,int)", i, 2); QString total = infocol->querySubObject("Range")->property("Text").toString(); oneRec.total = total;
//获取高考人数 infocol = mytable->querySubObject("Cell(int,int)", i, 3); QString admit = infocol->querySubObject(
"Range")->property("Text").toString(); oneRec.admit = admit; //获取录取人数 infocol = mytable->querySubObject(
"Cell(int,int)", i, 4); QString rate = infocol->querySubObject("Range")->property("Text").toString(); oneRec.rate = rate;
//获取录取率 myrecord.append(oneRec); //添加进记录列表 } delete mytable; mytable = nullptr; document->dynamicCall(
"Close()"); myword->dynamicCall("Quit()"); }4. 写入表格将数据写入到Word表格中,并在界面上预览:void MainWindow::on_btnWrite_clicked() { myword =
new QAxObject("Word.Application"); //创建 Word 应用程序对象 mydocs = myword->querySubObject("Documents"); //获取文档集
mydocs->dynamicCall("Add(void)"); //新建一个文档 document = myword->querySubObject("ActiveDocument"); QAxObject *tables = document->querySubObject(
"Tables"); //表格集指针 QAxObject *paragraph = myword->querySubObject("Selection"); //文本段指针 paragraph->dynamicCall(
"TypeText(const QString&)","2015-2019年高考人数和录取率"); //先输出表格标题 QAxObject *range = paragraph->querySubObject(
"Range"); QVariantList paras; paras.append(range->asVariant()); paras.append(6); //创建表格为 6 行 paras.append(
4); //创建表格为 4 列 tables->querySubObject("Add(QAxObject*, int, int, QVariant&, QVariant&)",paras); mytable = paragraph->querySubObject(
"Tables(int)", 1); mytable->setProperty("Style","网格型"); //设置表格为带网格边框 QAxObject *Borders = mytable->querySubObject(
"Borders"); Borders->setProperty("InsideLineStyle", 1); Borders->setProperty("OutsideLineStyle",
1); QAxObject *cell; //单元格对象指针/**循环控制输出表格内容*/for(int i = 0; i < 6; i++){ if (i == 0){ for
(int j=0; jquerySubObject("Cell(int,int)",(i+1),(j+1))->querySubObject(
"Range"); switch (j){ case0: cell->setProperty("Text","年份"); break; case1
: cell->setProperty("Text","高考人数(万)"); break; case2: cell->setProperty("Text","录取人数(万)"); break
; case3: cell->setProperty("Text","录取率"); break; default: break; } } }
else{ for(int j = 0; j querySubObject("Cell(int,int)",(i+1),(j+
1))->querySubObject("Range"); switch (j) { case0: cell->setProperty("Text", myrecord[i
-1].year); break; case1: cell->setProperty("Text", myrecord[i-1].total); break; case
2: cell->setProperty("Text", myrecord[i-1].admit); break; case3: cell->setProperty("Text", myrecord[i
-1].rate); break; default: break; } } } } document->dynamicCall("SaveAs(const QString&)"
, "D:\\Temp\\2015-2019年全国高考录取人数统计.doc"); //保存表格 QMessageBox::information(this, tr("完毕"),tr("表格已输出至 Word 文档。
")); delete mytable; mytable = nullptr; delete paragraph; paragraph = nullptr; document->dynamicCall(
"Close()"); myword->dynamicCall("Quit()"); QString fname = "D:\\Temp\\2015-2019年全国高考录取人数统计.doc"; view_Word(fname);
//在 Qt 界面上预览 } void MainWindow::view_Word(QString& filename) { mywidget = new QAxWidget("Word.Application"
, ui->labView); mywidget->dynamicCall("SetVisible(bool Visible)", "false"); mywidget->setProperty(
"DisplayAlerts", false); mywidget->setGeometry(ui->labView->geometry().x(), ui->labView->geometry().y(), ui->labView->width(), ui->labView->height()); mywidget->setControl(filename); mywidget->show(); }
5.运行效果运行程序,单击“写入”按钮,弹出消息框提示表格己输出至Word文档,单击“OK”按钮,界面上会显示出Word文档中的表格,如下图所示。
程序运行后在“D:\Temp\”路径下生成Word文档“2015-2019年全国高考录取人数统计.doc”,打开后可看到Qt在其中写入的表格,如下图所示。
以上系列文章系统地介绍了Qt对Excel和Word的操作,在工作中可以灵活使用这些方法来操作Office,高效地完成文档的制作————————————————觉得有用的话请关注点赞,谢谢您的支持!对于本系列文章相关示例完整代码有需要的朋友,可关注并在评论区留言!。
亲爱的读者们,感谢您花时间阅读本文。如果您对本文有任何疑问或建议,请随时联系我。我非常乐意与您交流。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。