用QT导出Excel表格

用QT导出Excel表格

前景描述:作者的需求是要在qt开发环境下能把数据导出到Excel表格,原本是打算是用Qt-QAxObject(QAxObject
是Qt提供的包装COM组件的类,通过COM操作Excel需要使用QAxObject类,使用此类还需要在pro文件增加“QT += axcontainer”)来做,但发现用这个做的话用户想生成Excel必须电脑装有Office,于是决定用qtxlsx来做。
概述:QtXlsx是功能非常强大和使用非常方便的操作excel类库。包括对excel数据读写、excel数据格式设置及在excel里面根据数据生成各种图表,但原本的QT没有这个库,所以要把这个库安装到QT里。安装的时候需要构建src文件,而构建src文件需要用到perl,下面直接开始具体操作。
安装步骤
1、下载安装perl
这里的话你的QT是多少位就装多少位的perl
2、下载Qtxlsx代码包
QTXLSX代码包
3、解压代码包
4、打开qt命令行工具
在这里插入图片描述
5、进入到你代码包的解压目录
在这里插入图片描述
6、

1.qmake(生成makefile文件)
2.mingw32-make(编译源码)
3.mingw32-make install(编译安装)

7、 在pro文件添加 QT += xlsx ,至此,你的QT工程就可以调用QTXlsx库进行Excel表格操作
8、头文件 #include <QtXlsx>
9、qtxlsx.cpp 文件
#include <QString.h>
#include “qtxlsx.h”
#include
#include
#include
#include
#include “fileutil.h”
using namespace std;
QString xlsx_name[9]={“项目名”,“人名”,“二级目录”,“三级目录”,“四级目录”,“五级目录”,“六级目录”,“七级目录”,“八级目录”};

CreateExcel::CreateExcel()
{
    mRow=2;
    mColumn=0;
    mNodecount=0;
    mMaxrow=0;
    mMaxcolumn=0;
    mPxlsx = NULL;

}

void CreateExcel::initExcel()    //初始化
{
    if(NULL!=mPxlsx)
    {    delete mPxlsx;
         mPxlsx=NULL;
    }
    mPxlsx = new QXlsx::Document;
    QXlsx::Document qtexcel;
    mFormat1.setFontSize(12);           //设置字体大小
    mFormat1.setFontName("宋体");       //设置字体格式
    mFormat1.setVerticalAlignment(mFormat1.AlignVCenter);    //上下对齐
    mFormat1.setBorderStyle(mFormat1.BorderThin);      //设置边框样式
    mFormat2.setFontSize(12);
    mFormat2.setFontName("宋体");
    mFormat2.setVerticalAlignment(mFormat1.AlignVCenter);
    mFormat2.setPatternBackgroundColor(QColor(250,80,60));
    mFormat2.setBorderStyle(mFormat2.BorderThin);
    for(int i=1;i<20;i++)
    {
       mPxlsx->setColumnWidth(i,16);      //设置列宽
    }
    for(int i=4;i<20;i=i+2)
        mPxlsx->setColumnWidth(i,6);

}

void CreateExcel::getLeafNode(TreeNode *ptr)    //获取叶子节点数
{
    TreeNode *ptr1=ptr;
    if(ptr1!=NULL)
    {
        for(int t=0;t<ptr1->children.size();t++)
        {
            getLeafNode(ptr1->children[t]);
        }
        if(ptr1->children.size()==0)
            mNodecount++;
    }
}

void CreateExcel::outputExcel(TreeNode *p)        //输出Excel表格
{
    if(p!=NULL)
    {
        if(mColumn>2)
           mColumn=mColumn+2;
        else
            mColumn++;
        mNodecount=0;
        getLeafNode(p);     //获取叶子节点数
        if(mMaxrow<mRow)
            mMaxrow=mRow;
        if(mMaxcolumn<(mColumn+1))
            mMaxcolumn=mColumn+1;
        mPxlsx->write(mRow,mColumn,QString::fromStdString(p->name), mFormat1);     //写出各级目录名
        mPxlsx->mergeCells(QXlsx::CellRange(mRow,mColumn,mRow+mNodecount-1,mColumn));    //合并单元格
        if(mColumn<4)                                                           //写入第一行名字
            mPxlsx->write(1,mColumn,xlsx_name[mColumn-1], mFormat1);
        else
            mPxlsx->write(1,mColumn,xlsx_name[(mColumn+1)/2], mFormat1);
        if(mColumn>2)                                                        //写出各级目录状态
        {
            if(p->flag!=0)
                mPxlsx->write(mRow, mColumn+1, "√", mFormat1);
            else
                mPxlsx->write(mRow, mColumn+1, "×", mFormat2);
            mPxlsx->mergeCells(QXlsx::CellRange(mRow,mColumn+1,mRow+mNodecount-1,mColumn+1));
        }
        for(int t=0;t<p->children.size();t++)        //前序遍历的关键循环
        {
            outputExcel(p->children[t]);
            mRow++;
        }
        if(mColumn>4)
           mColumn=mColumn-2;
        else
            mColumn--;
        if(p->children.size()!=0)       //如果是自身这一层级目录遍历完,行减一
            mRow--;
    }
}

void CreateExcel::resetExcel()
{
    mPxlsx->setRowFormat(1,mMaxrow,mFormat1);
    mRow=2;
    mColumn=0;
    mMaxrow=0;
}

bool CreateExcel::saveExcel(QString foldername,QString projectname)      //保存到指定文件夹,用项目名作为文件名
{    
    QDir dir;
    FileUtil fileJudge;
    if(!(fileJudge.isPathExist(foldername)))
        dir.mkdir(foldername);
    QString str1=foldername+"/"+projectname+".xlsx";
    return mPxlsx->saveAs(str1);
}

10、qtxlsx.h 文件

#ifndef QXLSX_H
#define QXLSX_H

#include "examiner.h"
#include <QtXlsx>

class CreateExcel
{
public:
    CreateExcel();
    void initExcel();
    void outputExcel(TreeNode *);
    bool saveExcel(QString,QString);
    void getLeafNode(TreeNode *);
    void resetExcel();

private:
    int mRow;
    int mColumn;
    int mNodecount;
    int mMaxrow;
    int mMaxcolumn;
    QXlsx::Document* mPxlsx;
    QXlsx::Format mFormat1;
    QXlsx::Format mFormat2;
};
#endif // QXLSX_H
  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值