创建Qt桌面应用程序项目,项目名称为“WordWriteTable”。设计程序界面,向Word输出表格及显示程序界面如下图所示。
“mainwindow.h”头文件的代码如下:
#include <QMainWindow>
#include <QMessageBox>
#include <QAxObject>
#include <QAxWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
typedef struct record
{
QString year; //年份
QString total; //高考人数
QString admit; //录取人数
QString rate; //录取率
} Record;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_btnWrite_clicked(); // “写入”按钮单击事件槽
void view_Word(QString& filename); //在Qt界面预览Word表格
private:
Ui::MainWindow *ui;
QAxObject *myword; //Word应用程序指针
QAxObject *mydocs; //文档集指针
QAxObject *document; //文档指针
QAxObject *mytable; //Word中表格指针
QList<Record> myrecord; //表格记录列表
QAxWidget *mywidget; //Qt界面上的Word可视化部件
};
在构造函数中读取已有文件的数据,为输出做准备:
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()");
}
将数据写入到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; j<4; j++)
{
cell= mytable->querySubObject("Cell(int,int)",(i+1),(j+1))->querySubObject("Range");
switch (j){
case 0: cell->setProperty("Text","年份"); break;
case 1: cell->setProperty("Text","高考人数(万)"); break;
case 2: cell->setProperty("Text","录取人数(万)"); break;
case 3: cell->setProperty("Text","录取率"); break;
default: break;
}
}
}else{
for(int j = 0; j < 4; j++){
cell = mytable->querySubObject("Cell(int,int)",(i+1),(j+1))->querySubObject("Range");
switch (j) {
case 0: cell->setProperty("Text", myrecord[i-1].year); break;
case 1: cell->setProperty("Text", myrecord[i-1].total); break;
case 2: cell->setProperty("Text", myrecord[i-1].admit); break;
case 3: 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();
}
运行程序,单击“输入”按钮,弹出消息框提示自己输出至Word文档的表格,单击“确定”按钮,界面上会显示出Word文档中的表格,如下图所示。
程序运行后在“D:\Temp\”路径下生成Word文档“2015-2019年全国高考录取人数统计.doc”,打开后可以看到Qt在其中写入的表格,如下图所示。
以上系列文章系统地介绍了Qt对Excel和Word的操作,在工作中高效地可以灵活运用这些方法来操作Office,实地完成文档的制作。
—————————————————
联系客服