qt导出word模板(模块化程序,直接调用保存数据到指定路径)

前言:

qt导出word模块化程序,根据需求不同只需更改一个函数内容,设置表格格式,之后直接调用保存即可,简单好用,快捷方便

环境:

qt5.7(MinGW)

windows

正文:

word.h

#ifndef QWORD_H
#define QWORD_H
#include <QMainWindow>
#include <QString>
#include <QVariant>
#include <QAxObject>
#include <QAxWidget>
#include <QTextCodec>
struct testDataType
{
    QString user;   //使用者
    QString code; //设备编号
    QString fenshu;//得分

xxx

};


class QWord : public QObject
{
    Q_OBJECT

public:
    QWord(QObject *parent = 0);
    ~QWord();

public:
    QAxObject* getDocuments(){return m_documents;}
    QAxObject* getDocument(){return m_document;}
    QAxObject* getWordApp(){return m_word;}
public:
    /**************************************************************************/
    /* 文件   操作                                                            */
    /**************************************************************************/
    void save();				//保存操作内容
    void close();				//关闭 退出 析构时候也会自动调用一次
    void saveAs();				//新建excel另存为
    bool createNewWord();		//创建一个新的excel
    void openWord();			//打开一个现有的excel
    bool createNewWord(const QString& filePath );		//创建一个新的excel

    void setTableAutoFitBehavior(int flag);				//表格自动拉伸列 0固定  1根据内容调整  2 根据窗口调整
    void setPageOrientation(int flag);					//设置页面0为纵向wdOrientPortrait  1为横向wdOrientLandscape
    void setWordPageView(int flag);						//设置页面视图,是web视图wdWebView 6还是页面视图wdPrintView 3 或者阅读视图wdReadingView 7
    void setFontSize(int fontsize);						//设置字体大小
    void setFontName(QString& fontName);				//设置字体	比如 “宋体”
    void setFontBold(bool flag);						//字体加粗
    void setParagraphAlignment(int flag);				//设置选中位置文字居中 0 ,居左 1,居右 2
    void setColumnWidth(int column, int width);			//设置列宽
    void setCellString(int row, int column, const QString& text);
    void setCellFontBold(int row, int column, bool isBold);			//设置内容粗体  isBold控制是否粗体
    void setCellFontSize(int row, int column, int size);			//设置文字大小
    void setOptionCheckSpell(bool flags);							//设置审阅的拼写检查  true开启检查  false 取消检查

    QString GetText();												//获取内容
    void getUsedRange(int *topLeftRow, int *topLeftColumn, int *bottomRightRow, int *bottomRightColumn);
    void setSelectionRange(int start,int end);						//"SetRange(1, 9)"第1个字符后开始,到第9个字符结束范围
    QVariant getCellValue(int row, int column);						//获取单元格内容
    int getTableCount();											//获取word中表格总数


    QString getStrErrorInfo(){return m_strError;}					//获取代码中出现的错误信息可以用QMessageBox::information打印 在cpp不用QMessageBox 是怕你们在线程中调导出报表
    void deleteSelectColumn(int column);							//删除指定的列
    void moveForEnd();												//移动选定对象到文档末尾
    void insertCellPic(int row,int column,const QString& picPath);	//单元格插入图片
    void intsertTable(int row,int column);							//插入一个几行几列表格
    void insertMoveDown();											//插入回车
    void insertText(const QString& text);							//插入文字

    void inserttestdata(testDataType &str);

private:
    QAxObject* m_word;
    QAxObject* m_documents;
    QAxObject* m_document;
    QString  m_fileName;
    QString  m_saveName;
    QString  m_strError;

};

#endif // QWORD_H

word.cpp

#include "qword.h"
#include <QDateTime>
#include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QDebug>
QWord::QWord(QObject *parent)
{
    m_word = new QAxObject(parent);
    m_documents = NULL;
    m_document = NULL;
}

QWord::~QWord()
{
    close();
}

bool QWord::createNewWord()		//创建一个新的word
{
    //这种方式有些bug,选择路径取消会导致程序崩溃,直接传入路径,自己操作路径则不会出现问题
    /*QString defaultFileName = tr("测试记录%1").arg(QDateTime::currentDateTime().toString("yyyy年MM月dd日hh时mm分"));
    m_saveName=QFileDialog::getSaveFileName(0,"日志信息",defaultFileName,tr("*.doc"));
    QFile file(m_saveName);
    if(file.exists())
    {
        m_strError += "错误:目标文件已存在!";
        return false;
    }
    if(!m_saveName.isEmpty())
    {
        if(!m_word->setControl("Word.Application"))
        {
            m_strError += "错误:获取word组件失败,请确定是否安装了word!";
            return false;
        }
        m_word->setProperty("Visible",false);
        m_word->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
        m_documents = m_word->querySubObject("Documents");
        m_documents->dynamicCall("Add (void)");
        m_document = m_word->querySubObject("ActiveDocument");//获取当前激活的文档
        return true;
    }else
    {
        m_strError += "错误:文件名为空";
        return false;
    }*/
}
bool QWord::createNewWord(const QString& filePath )
{
    m_saveName = filePath;
    QFile file(m_saveName);
    if(file.exists())
    {
        m_strError += "错误:目标文件已存在!";
        return false;
    }
    if(!m_saveName.isEmpty())
    {
        if(!m_word->setControl("Word.Application"))
        {
            m_strError += "错误:获取word组件失败,请确定是否安装了word!\n";
            return false;
        }
        m_word->setProperty("Visible",false);
        m_word->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
        m_documents = m_word->querySubObject("Documents");
        if(!m_documents)
        {
            m_strError += "获取文档失败!\n";
            return false;
        }
        m_documents->dynamicCall("Add (void)");
        m_document = m_word->querySubObject("ActiveDocument");//获取当前激活的文档
        return true;
    }else
    {
        m_strError += "错误:文件名为空";
        return false;
    }
}
//保存
void QWord::save()
{
    if(m_document)
        m_document->dynamicCall("Save()");
    else
        return;
}
//关闭word
void QWord::close()				//关闭 退出 析构时候也会自动调用一次
{
    if(!m_saveName.isEmpty())		//如果不为空  则为新建
    {
        saveAs();
        m_saveName = "";
    }
    if(m_document)
        m_document->dynamicCall("Close (boolean)",false);
    if(m_word)
        m_word->dynamicCall("Quit (void)");
    if(m_documents)
        delete m_documents;
    if(m_word)
        delete m_word;
    m_document = NULL;
    m_documents = NULL;
    m_word = NULL;
}
//另存为
void QWord::saveAs()
{
    if(m_document)
        m_document->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(m_saveName));
    else
        return;
}
//设置页面1 横向还是 0竖向
void QWord::setPageOrientation(int flag)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    QString page;
    switch (flag)
    {
    case 0:
        page = "wdOrientPortrait";
        break;
    case 1:
        page = "wdOrientLandscape";
        break;
    }
    selection->querySubObject("PageSetUp")->setProperty("Orientation",page);
}
//设置页面视图
void QWord::setWordPageView(int flag)
{
    QAxObject* viewPage = m_word->querySubObject("ActiveWindow");
    QString view;
    switch (flag)
    {
    case 1:
        view = "wdNormalView";
        break;
    case 2:
        view = "wdOutlineView";
        break;
    case 3:
        view = "wdPrintView";
        break;
    case 4:
        view = "wdPrintPreview";
        break;
    case 5:
        view = "wdMasterView";
        break;
    case 6:
        view = "wdWebView";
        break;
    case 7:
        view = "wdReadingView";
        break;
    case 8:
        view = "wdConflictView";
        break;
    }
    viewPage->querySubObject("View")->setProperty("Type",view);
}
//插入回车
void QWord::insertMoveDown()
{
    QAxObject* selection  = m_word->querySubObject("Selection");
    selection->dynamicCall("TypeParagraph(void)");
}
//插入文字
void QWord::insertText(const QString& text)
{
    QAxObject* selection  = m_word->querySubObject("Selection");
    selection->dynamicCall("TypeText(const QString&)",text);
}
//获取文本
QString QWord::GetText()
{
    QAxObject* selection = m_word->querySubObject("Selection");
    QString str = selection->dynamicCall("GetText(void)").toString();
    return str;
}
//设置文字对齐方向
void QWord::setParagraphAlignment(int flag)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    if(flag == 0)
    {
        selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphCenter");
    }else if(flag == 1)
    {
        selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphJustify");
    }else if(flag == 2)
    {
        selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphRight");
    }
}
//设置字体大小
void QWord::setFontSize(int fontsize)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    selection->querySubObject("Font")->setProperty("Size",fontsize);
}
//设置字体加粗
void QWord::setFontBold(bool flag)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    selection->querySubObject("Font")->setProperty("Bold",flag);
}
//设置字体名称
void QWord::setFontName(QString& fontName)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    selection->querySubObject("Font")->setProperty("Name",fontName);
}
//未知
void QWord::setSelectionRange(int start,int end)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    selection->dynamicCall("SetRange(int, int)", start,end);	//第1个字符后开始,到第9个字符结束范围
}
//未知
void QWord::getUsedRange(int *topLeftRow, int *topLeftColumn, int *bottomRightRow, int *bottomRightColumn)
{
    QAxObject* range = m_document->querySubObject("Range");
    *topLeftRow = range->property("Row").toInt();
    *topLeftColumn = range->property("Column").toInt();

    QAxObject *rows = range->querySubObject("Rows");
    *bottomRightRow = *topLeftRow + rows->property("Count").toInt() - 1;

    QAxObject *columns = range->querySubObject("Columns");
    *bottomRightColumn = *topLeftColumn + columns->property("Count").toInt() - 1;
}
//插入表格
void QWord::intsertTable(int row,int column)
{
    QAxObject* tables = m_document->querySubObject("Tables");
    QAxObject* selection = m_word->querySubObject("Selection");
    QAxObject* range = selection->querySubObject("Range");
    QVariantList params;
    params.append(range->asVariant());
    params.append(row);
    params.append(column);
    tables->querySubObject("Add(QAxObject*, int, int, QVariant&, QVariant&)", params);
    QAxObject* table = selection->querySubObject("Tables(1)");
    table->setProperty("Style","网格型");
}
//设置表格列宽
void QWord::setColumnWidth(int column, int width)		//设置列宽
{
    QAxObject* selection = m_word->querySubObject("Selection");
    QAxObject* table = selection->querySubObject("Tables(1)");
    table->querySubObject("Columns(int)",column)->setProperty("Width",width);
}
//设置表格某行某列的字符串
void QWord::setCellString(int row, int column, const QString& text)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    QAxObject* table = selection->querySubObject("Tables(1)");
    table->querySubObject("Cell(int, int)",row,column)->querySubObject("Range")->dynamicCall("SetText(QString)", text);
}
//设置表格内容粗体  isBold控制是否粗体
void QWord::setCellFontBold(int row, int column, bool isBold)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    QAxObject* table = selection->querySubObject("Tables(1)");
    table->querySubObject("Cell(int, int)",row,column)->querySubObject("Range")->dynamicCall("SetBold(int)", isBold);
}
//设置表格文字大小
void QWord::setCellFontSize(int row, int column, int size)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    QAxObject* table = selection->querySubObject("Tables(1)");
    table->querySubObject("Cell(int, int)",row,column)->querySubObject("Range")->querySubObject("Font")->setProperty("Size", size);
}
//获取单元格内容 此处对于Excel来说列和行从1开始最少
QVariant QWord::getCellValue(int row, int column)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    QAxObject* table = selection->querySubObject("Tables(1)");
    return table->querySubObject("Cell(int, int)",row,column)->querySubObject("Range")->property("Text");
}
//获取表格数量
int QWord::getTableCount()
{
    QAxObject* tables = m_document->querySubObject("Tables");
    int val = tables->property("Count").toInt();
    return val;
}
//移动选定对象到文档末尾
void QWord::moveForEnd()
{
    QAxObject* selection = m_word->querySubObject("Selection");
    QVariantList params;
    params.append(6);
    params.append(0);
    selection->dynamicCall("EndOf(QVariant&, QVariant&)", params).toInt();
}
//表格插入图片
void QWord::insertCellPic(int row,int column,const QString& picPath)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    QAxObject* table = selection->querySubObject("Tables(1)");
    QAxObject* range = table->querySubObject("Cell(int, int)",row,column)->querySubObject("Range");
    range->querySubObject("InlineShapes")->dynamicCall("AddPicture(const QString&)",picPath);
}
//未知
void QWord::setTableAutoFitBehavior(int flag)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    QAxObject* table = selection->querySubObject("Tables(1)");
    if(0 <= flag & flag <= 2 )
        table->dynamicCall("AutoFitBehavior(WdAutoFitBehavior)", flag);
}
//删除选中列
void QWord::deleteSelectColumn(int column)
{
    QAxObject* selection = m_word->querySubObject("Selection");
    QAxObject* table = selection->querySubObject("Tables(1)");
    QAxObject* columns = table->querySubObject("Columns(int)",column);
    columns->dynamicCall("Delete()");
}

void QWord::setOptionCheckSpell(bool flags)
{
    QAxObject* opetions = m_word->querySubObject("Options");
    if(!opetions)
        return;
    opetions->setProperty("CheckGrammarAsYouType",flags);
    opetions->setProperty("CheckGrammarWithSpelling",flags);
    opetions->setProperty("ContextualSpeller",flags);
    opetions->setProperty("CheckSpellingAsYouType",flags);
}
void QWord::inserttestdata(testDataType &str)
{
    //先创建固定表头等内容
    setPageOrientation(0);			//页面纵向
    setWordPageView(3);			//页面视图
    insertMoveDown();				//插入回车
    setFontSize(25);				//字体大小
    setParagraphAlignment(0);		//下面文字置中
    setFontBold(true);				//字体加粗
    insertText(QString("xxx检测报告"));//插入文字
    setFontBold(false);			//字体加粗
    insertMoveDown();              //插入回车
    setParagraphAlignment(1);		//下面文字置左
    setFontSize(16);               //字体大小
    insertText(QString("检测人员:%1").arg(str.user));//插入文字
    insertMoveDown();              //插入回车
    insertText(QString("xxx编号:%1").arg(str.code));//插入文字
    insertMoveDown();              //插入回车
    insertText(QString("xxx完好度:%1%").arg(str.fenshu));//插入文字
    insertMoveDown();                         //插入回车
    insertText(tr("检测日期:%1").arg(QDateTime::currentDateTime().toString("yyyy年MM月dd日 hh时mm分")));//插入文字
    setFontSize(12);               //字体大小
    insertMoveDown();              //插入回车
//    insertText(QString("——————————————————————————————————"));//插入文字
//    insertMoveDown();              //插入回车
    setParagraphAlignment(0);		//下面文字置中


    intsertTable(55,3);//插入表格 55行 3列
    setColumnWidth(1,50);//设置表格列宽 第1列
    setColumnWidth(2,300);//设置表格列宽 第1列
    setColumnWidth(3,100);//设置表格列宽 第1列
    setCellString(1,1,"序号");//设置表格某行某列的字符串 1行1列 设置内容
    setCellString(1,2,"信号名称");//设置表格某行某列的字符串 1行2列 设置内容
    setCellString(1,3,"信号状态");//设置表格某行某列的字符串 1行3列 设置内容
    setCellFontBold(1,1,true);//设置表格内容粗体  isBold控制是否粗体  1行1列 粗体
    setCellFontBold(1,2,true);//设置表格内容粗体  isBold控制是否粗体  1行2列 粗体
    setCellFontBold(1,3,true);//设置表格内容粗体  isBold控制是否粗体  1行3列 粗体
    setCellFontSize(1,1,12);//设置表格文字大小 1行1列 16号
    setCellFontSize(1,2,12);//设置表格文字大小 1行2列 16号
    setCellFontSize(1,3,12);//设置表格文字大小 1行3列 16号

    for(int i=0;i<54;i++)
        setCellString(i+2,1,QString::number(i+1));//设置表格某行某列的字符串 1行1列 设置内容

    setCellString(2,2,"电源电压");//设置表格某行某列的字符串
    setCellString(2,3,result[str.res_power1]);//设置表格某行某列的字符串
    for(int i=0;i<16;i++){
        setCellString(3+i,2,QString("%1传感器电源").arg(cgq_name[i]));//设置表格某行某列的字符串
        setCellString(3+i,3,result[str.res_power[i]]);//设置表格某行某列的字符串
    }
    for(int i=0;i<16;i++){
        setCellString(3+16+i,2,QString("%1传感器信号").arg(cgq_name[i]));//设置表格某行某列的字符串
        setCellString(3+16+i,3,result[str.res_value[i]]);//设置表格某行某列的字符串
    }
    for(int i=0;i<3;i++){
        setCellString(3+16+16+i,2,QString("%1报警信号").arg(warnname[i]));//设置表格某行某列的字符串
        setCellString(3+16+16+i,3,result[str.res_warn[i]]);//设置表格某行某列的字符串
    }
    for(int i=0;i<2;i++){
        setCellString(3+16+16+3+i,2,QString("%1信号").arg(tempname[i]));//设置表格某行某列的字符串
        setCellString(3+16+16+3+i,3,result[str.res_temp[i]]);//设置表格某行某列的字符串
    }
 
xxx内容根据自己需求自行添加


    moveForEnd();//移动选定对象到文档末尾
    insertMoveDown();              //插入回车
    setParagraphAlignment(2);		//下面文字置右
    setFontSize(14);
    insertText("测试人员签字:_______________");
    insertMoveDown();
    insertText("年    月    日");
}

 其中inserttestdata函数为外部调用入口函数,根据需要导出的信息内容自行更改改函数,编辑word格式,入口参数模版程序中我使用的是结构体,将所有数据赋值到结构体中在调用保存输出word

inserttestdata入口函数方式二:

void QWord::insertselfdata(selfDataType &str)
{
    //先创建固定表头等内容
    setPageOrientation(0);			//页面纵向
    setWordPageView(3);			//页面视图
    insertMoveDown();				//插入回车
    setFontSize(25);				//字体大小
    setParagraphAlignment(0);		//下面文字置中
    setFontBold(true);				//字体加粗
    insertText(QString("xxxxxx输出报表"));//插入文字
    setFontBold(false);			//字体加粗
    insertMoveDown();              //插入回车
    setParagraphAlignment(1);		//下面文字置左
    setFontSize(16);               //字体大小
    insertText(QString("xx人员:%1").arg(str.user));//插入文字
    setFontSize(12);				//字体大小
    insertMoveDown();              //插入回车
    insertText(QString("——————————————————————————————————"));//插入文字
    insertMoveDown();              //插入回车
    setFontSize(16);               //字体大小
    insertText(QString("被测设备编号:%1").arg(str.number));//插入文字
    insertMoveDown();                         //插入回车
    insertText(tr("xx日期:%1").arg(QDateTime::currentDateTime().toString("yyyy年MM月dd日 hh时:mm分")));//插入文字
    setFontSize(12);               //字体大小
    insertMoveDown();              //插入回车
    insertText(QString("——————————————————————————————————"));//插入文字
    insertMoveDown();              //插入回车

    //添加自检数据内容
    QString tabname[24]={xxxx};
    insertText(tr("xxxx检测结果"));
    insertMoveDown();                       //插入回车
    for(int i=0;i<24;i++){
        insertText(tr("%1:%2").arg(tabname[i]).arg(str.value[i]));         //插入文字
        insertMoveDown();              //插入回车
    }
    insertText(QString("——————————————————————————————————"));//插入文字
    insertMoveDown();              //插入回车
}

调用程序.cpp

      
    QString dir = QFileDialog::getExistingDirectory(this, tr("选择信息导出文件目录"),"/home",QFileDialog::ShowDirsOnly|QFileDialog::DontResolveSymlinks);
    QString filePath = QString(dir+"/"+"测试数据%1.docx").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz"));
    QFile file(filePath);
    if(dir.isEmpty())
        massage_dialog(1,"提示","数据保存失败!未选择保存路径!",0,0);
    else if(file.exists())
        massage_dialog(1,"提示","数据保存失败!保存路径下存在相同文件!",0,0);


  QWord word;
        word.createNewWord(filePath);   //创建一个新的word
        word.inserttestdata(testdata);      //写入数据
        word.close();                   //关闭word
        massage_dialog(1,"提示","数据测试文件生成成功!",0,0);

 调用程序方式二:

    QString dir = historypath;//已经确认好的历史数据地址
    QDir dir1(dir);
    QString filePath = QString(dir+"/"+"xxx检测报告%1.docx").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh-mm-ss"));
    QFile file(filePath);
    if(dir.isEmpty())
        massage_dialog(1,"提示","生成报告失败!保存路径为空!请前往系统设置界面设定报告保存路径!检查数据库文件是否存在!",1);
    else if(!dir1.exists())
        massage_dialog(1,"提示","生成报告失败!保存路径丢失!请前往系统设置界面设定报告保存路径!",1);
    else if(file.exists())
        massage_dialog(1,"提示","生成报告失败!保存路径下存在相同文件!",1);
    else//这里输出word和保存数据库
    {
        ///赋值当前数据到缓存区
        testDataType testdata;
        testdata.user=Data_user.now_username;
        testdata.code=machinecode;
        testdata.fenshu=QString::number(fenshu);

        testdata其余结构体数据赋值

        ///保存word
        QWord word;
        if(word.createNewWord(filePath)){//创建一个新的word
            word.inserttestdata(testdata);      //写入数据
        }
        else
            massage_dialog(1,"提示","错误:获取word组件失败,请确定是否安装了word!",1);
        word.close();//关闭word
        massage_dialog(1,"提示",QString("导出报告成功!文件导出位置:%1").arg(filePath),1);
        ui->btn_report->setEnabled(false);
    }

导出word效果:

  • 14
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桶矿泉水

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值