在工作学习中,有时会需要将采集的数据生成word报表的形式,如设备可靠性检测报告,检定报告等。
本文将主要陈述如何利用Qt生成word报表。
除去必要的代码,生成word报表还需要开发人员自己创建一个word模板,关于模板的样式,根据工程需要而定,只需要将文本需要替换的地方插入书签即可,关于word模板的设置后面会进行陈述。
- UI界面展示
说明:
- 前界面的①实验设备②检测温度③鉴定依据均需要后期人员输入
- 右侧表格中的数值,是程序预设好的,模拟实际的数据采集(使用QTableWidget创建)
- 程序说明
TableWidget部分(右侧表格创建过程)
void Widget::table()
{
tablenet = new QTableWidget(this);//指定父对象
tablenet->move(400,20);//设置表格在前UI中的位置
tablenet->setRowCount(5);//行数
tablenet->setColumnCount(7);//列数
tablenet->resize(740,200);//表格的尺寸
QStringList horheader;//设置表头
horheader<<"序号"<<"测量数据1"<<"测量数据2"<<"测量数据3"<<"测量数据4"<<"测量数据5"<<"测量数据6";
tablenet->setHorizontalHeaderLabels(horheader);//设置表头(横)
tablenet->horizontalHeader()->setFixedHeight(30); //设置表头的高度为25
tablenet->verticalHeader()->hide();
for(int row=0;row<5;row++)//序号
{
tablenet->setItem( row,0,new QTableWidgetItem( number[row] ));
}
//随便插入一些数据
for(int i=0;i<5;i++)
{
for(int j=1;j<7;j++)
{
tablenet->setItem(i,j,new QTableWidgetItem(data[i][j-1]));
//qDebug()<<exsheet[i][j];
}
}
//tablenet->setItem(3,3,new QTableWidgetItem(3));
tablenet->show();
}
生成WORD报表
void Widget::on_pushButton_clicked()
{
//QString path =QFileDialog::getOpenFileName(this,"打开","../","word(*doc)");
QString path="C://Users//Administrator//Desktop//QT TEXT//words//new测试.doc";//路径从\改成//,此处为论文模板所在路径
if(path.isEmpty()==false)
{
QFile file(path);
QAxObject *words= new QAxObject(this);//定义一个指针
words->setControl("word.Application");//指向com文件类型setControl
words->setProperty("Visible",false);//设置是否提示或者显示对话框setProperty
QAxObject *workbooks = words->querySubObject("Documents");//获取工作簿(excel文件)集合querySubObject
workbooks->dynamicCall("Add(QString)", path);//链接到具体的文件dynamicCall
//path至关重要,获取excel文件的路径
//打开一个word文件,获取文档
QAxObject *workbook = words->querySubObject("ActiveDocument");//获取word中已经有数值的区域querySubObject
/********修改一个位置的内容*********/
QString sLabel="设备";//此处必须为文档中被标记为书签的内容,下面语句的意思就是确定书签的位置:
QAxObject *pBookmark = workbook->querySubObject("Bookmarks(QString)",sLabel);//找到活跃区域内的书签querySubObject
//就是把书签内容直接给你替换了
QString sText=ui->device->toPlainText();//此处为替换内容
pBookmark->dynamicCall("Select(void)");//选中要选中的区域
pBookmark->querySubObject("Range")->setProperty("Text",sText);//进行替换操作
/********修改一个位置的内容*********/
QString tLabel="温度";//此处必须为文档中被标记为书签的内容,下面语句的意思就是确定书签的位置:
qDebug()<<"";
QAxObject *tBookmarks = workbook->querySubObject("Bookmarks(QString)",tLabel);//找到活跃区域内的书签querySubObject
qDebug()<<"";
//就是把书签内容直接给你替换了
QString tText=ui->temp->toPlainText();//此处为替换内容
tBookmarks->dynamicCall("Select(void)");//选中要选中的区域
tBookmarks->querySubObject("Range")->setProperty("Text",tText);//进行替换操作
\
/********修改一个位置的内容*********/
QString mLabelt="方法";//此处必须为文档中被标记为书签的内容,下面语句的意思就是确定书签的位置:
QAxObject *mBookmarks = workbook->querySubObject("Bookmarks(QString)",mLabelt);//找到活跃区域内的书签querySubObject
//就是把书签内容直接给你替换了
QString mText=ui->method->toPlainText();//此处为替换内容
mBookmarks->dynamicCall("Select(void)");//选中要选中的区域
mBookmarks->querySubObject("Range")->setProperty("Text",mText);//进行替换操作*/
qDebug()<<"方法";
//半自动方式修改word中的表格
QString sheetfrist = "数据";
for(int i=1;i<6;i++)
{
for(int j=1;j<7;j++)
{
QString addrow=QString("%1").arg(i);
QString addcolum=QString("%1").arg(j);
//整包
QString sheetlabel = QString("%1%2%3").arg(sheetfrist).arg(addrow).arg(addcolum);
//qDebug()<<sheetlabel;
QAxObject *sheetdata = workbook->querySubObject("Bookmarks(QString)",sheetlabel);
QString sheettext=tablenet->item(i-1,j)->text();//此处为替换内容,必须要加入.text().这样返回值才会正确
sheetdata->dynamicCall("Select(void)");//选中要选中的区域
sheetdata->querySubObject("Range")->setProperty("Text",sheettext);//进行替换操作
}
}
QString sheethead = "序号";
for(int j=1;j<6;j++)
{
QString addrowhead=QString("%1").arg(j);
QString sheetheadnumber = QString("%1%2").arg(sheethead).arg(addrowhead);
QAxObject *sheethead = workbook->querySubObject("Bookmarks(QString)",sheetheadnumber);
QString sheettexthead=tablenet->item(j-1,0)->text();//此处为替换内容
sheethead->dynamicCall("Select(void)");
//选中要选中的区域
sheethead->querySubObject("Range")->setProperty("Text",sheettexthead);//进行替换操作
}
//表头等内容都是设置好的,直接替换就完事儿了
/*****保存*******/
QString pathsave = QFileDialog::getSaveFileName(this,"Save","../","word(*doc)");
if(pathsave.isEmpty()==true)
{
return;
}
workbook->dynamicCall("SaveAs(const QString&))",QDir::toNativeSeparators(pathsave));
//words->setProperty("DisplayAlerts", true);//含有保存的功能,但是无法获得保存的路径,不容易进行下一步操作
workbook->dynamicCall("Close(bool)", true);
words->dynamicCall("Quit()");
delete workbook;
delete words;
file.close();
/*if(QMessageBox::question(this,"完成","文件已经导出,是否需要打开",QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
{
QDesktopServices::openUrl(QUrl("file:///"+QDir::toNativeSeparators(pathsave)));
//qDebug()<<"123";
}*/
QMessageBox::warning(this,"完成","文件已经保存",QMessageBox::Yes);
}
- WORD部分准备
要完成生成word报表的程序,最重要的一步就是你需要一个提前设置好的word模板。
以下是模板的整体预览
其中有几个部分需要注意:
- 书签的设置
在内容需要的部分,插入书签,拿本模板为样例:
仪器名称://这个是需要人员输入的,其内容是不固定的,需要后期输入,所以在“仪器名称”后面的横线上添加书签
选择任意文本进行输入,本文选择的是【设备】,之后选中文本
插入——书签
即可。
- 效果展示
界面设置如图(示例)
点击生成
选择保存路径
打开文件
替换完成。
- 总结
关于word表格的绘制,是开发人员在word模板中提前绘制好的。
表格的绘制也可以通过Qt的代码实现,此部分仍有待学习。