在工作的项目中需要让计算机自动生成公司生产产品的电子版的质检报告.
我首先用的是让软件生成Word格式的报告,但是这个格式容易修改因此领导不太满意.现在只能修改成PDF格式.因为公司的质检报告有固定的的模板,使用Qt很方便的实现生成Word版本,所以用的方法是先生成Word格式的质检报告然后格式进行转换.
一个重要的问题就是格式转换需要很长的时间,在转换期间软件会处于冻结转态.因此需要使用到多线程的方法加快转换的速度.
下面是以四个Word文档转换为例讲解.
代码结构如下
QT += axcontainer .pro下面
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <workthread.h>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
WorkThread *workThread[4];
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
workthread.h
#ifndef WORKTHREAD_H
#define WORKTHREAD_H
#include <QThread>
#include <QtDebug>
class WorkThread : public QThread
{
Q_OBJECT
public:
WorkThread(int i);
int odd;
protected:
void run() ;
};
#endif // WORKTHREAD_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QAxObject>
#include <QDebug>
#include <QTime>
#include <workthread.h>
#include <windows.h>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
int j = 0;
for (int i=1;i<=7;i+=2)
{
workThread[j] = new WorkThread(i); //新建多线程 一共创建四个
j++;
}
for(int i =0;i<4;i++) //依次启动
{
workThread[i]->start();
}
// ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void WorkThread::run()
{
QTime t;
t.restart(); //测试多线程下的转换时间
HRESULT r = OleInitialize(0);//初始化框架
QAxObject *pWordApplication = new QAxObject("Word.Application",0);
QAxObject *pWordDocuments = pWordApplication->querySubObject("Documents");
QString fileName = "D:\\KHDCheckReport\\2020-1-11\\"+QString::number(odd)+".docx";
QString toFilePath = "D:\\KHDCheckReport\\2020-1-11\\"+QString::number(odd)+".pdf";
QVariant filename(fileName);
QVariant confirmconversions(false);
QVariant readonly(true);
QVariant addtorecentfiles(false);
QVariant passworddocument("");
QVariant passwordtemplate("");
QVariant revert(false);
QAxObject *doc = pWordDocuments->querySubObject("Open(const QVariant&, const QVariant&,const QVariant&, "
"const QVariant&, const QVariant&, "
"const QVariant&,const QVariant&)",
filename,
confirmconversions,
readonly,
addtorecentfiles,
passworddocument,
passwordtemplate,
revert);
QVariant OutputFileName(toFilePath);
QVariant ExportFormat(17); //转换PDF
QVariant OpenAfterExport(false);
doc->querySubObject("ExportAsFixedFormat(const QVariant&,const QVariant&,const QVariant&)",
OutputFileName,
ExportFormat,
OpenAfterExport);
doc->dynamicCall("Close(boolean)",false);
qDebug()<<"运行时间:"<<t.elapsed();
OleUninitialize();//关闭
}
workthread.cpp
#include "workthread.h"
WorkThread::WorkThread(int i)
{
odd = i;
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
程序很简单不需要过多说明