Qt 写Excl文件

参考资料:https://blog.csdn.net/czyt1988/article/details/52121360

 

                 https://blog.csdn.net/qq_35057840/article/details/54318443

 

                https://www.cnblogs.com/techiel/p/7932329.html

 

需要在.pro文件中添加 QT += axcontainer

然后自己尝试写的代码如下:

#include "exclhelper.h"
#include <QFile>
#include <QDebug>
#include <QDir>

ExclHelper::ExclHelper(QObject *parent) : QObject(parent)
{
    mAxObj = NULL;
    mData.clear();
}

void ExclHelper::ExportExcl(QString fileName)
{
    mSaveName = fileName;
    mAxObj = new QAxObject();
    // 连接Excel控件
    mAxObj->setControl("Excel.Application");
    // 不显示窗体
    mAxObj->dynamicCall("SetVisible (bool Visible)", "false");
    // 不显示任何警告信息。如果为true, 那么关闭时会出现类似"文件已修改,是否保存"的提示
    mAxObj->setProperty("DisplayAlerts", false);

}

void ExclHelper::AddRowData(QList<QVariant> row)
{
    mData.append(row);
}

void ExclHelper::Finish()
{
   if(mAxObj == NULL ||  mData.size() <= 0)
   {
       return;
   }

   // 获取工作簿集合
   QAxObject* workbooks = mAxObj->querySubObject("WorkBooks");
   // 新建一个工作簿
   workbooks->dynamicCall("Add");
   QAxObject* workbook = mAxObj->querySubObject("ActiveWorkBook");
   // step3: 打开sheet
   QAxObject* worksheet = workbook->querySubObject("WorkSheets(int)", 1);

   int row = mData.size();
   int col = mData.at(0).size();
   QString rangStr;
   convertToColName(col,rangStr);
   rangStr += QString::number(row);
   rangStr = "A1:" + rangStr;

   qDebug()<<rangStr;
   QAxObject *range = worksheet->querySubObject("Range(const QString&)",rangStr);
   if(NULL == range || range->isNull())
   {
       return;
   }

   QVariant var;
   castListListVariant2Variant(mData,var);
   range->setProperty("WrapText", true);
   //range->setProperty("Value", var);  //此方法写不进去
   range->dynamicCall("SetValue(conts QVariant&)", var);

   workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(mSaveName)); //保存到filepath
   // 注意一定要用QDir::toNativeSeparators, 将路径中的"/"转换为"\", 不然一定保存不了
   workbook->dynamicCall("Close (Boolean)", false);  //关闭文件
   mAxObj->dynamicCall("Quit (void)");
   delete range;
   delete worksheet;
   delete workbook;
   delete mAxObj;
   mAxObj = NULL;
}

void ExclHelper::convertToColName(int col, QString &str)
{
    Q_ASSERT(col>0 && col<65535);
    int tempData = col / 26;
    if(tempData > 0)
    {
        int mode = col % 26;
        convertToColName(mode,str);
        convertToColName(tempData,str);
    }
    else
    {
        str=(to26AlphabetString(col)+str);
    }

}

QString ExclHelper::to26AlphabetString(int col)
{
    QChar ch = col + 0x40;//A对应0x41
    return QString(ch);

}

void ExclHelper::castListListVariant2Variant(const QList<QList<QVariant> > &res, QVariant &var)
{

    QVariantList mAllData;
    for(int i = 0; i< res.size();i++)
    {
        QVariantList mRowData;
        auto a = res.at(i);
        mRowData.append(a);
        mAllData.append((QVariant)mRowData);
    }
    var = (QVariant)mAllData;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值