Qt 写入Excel

        网络上的大部分的都是按照Cell的方式进行操作,这种方法虽然比较清晰明白,但是大量的打开和关闭的操作会大量消耗写入的时间,写入的时间会极大的增大。使用Range可以明显的提速。

//获取保存路径
    QString filepath=QFileDialog::getSaveFileName(this,tr("Save"),".",tr(" (*.xlsx)"));
    if(!filepath.isEmpty()){
        QAxObject *excel = new QAxObject(this);
        //连接Excel控件
        excel->setControl("Excel.Application");
        //不显示窗体
        excel->dynamicCall("SetVisible (bool Visible)","false");
        //不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
        excel->setProperty("DisplayAlerts", false);
        //获取工作簿集合
        QAxObject *workbooks = excel->querySubObject("WorkBooks");
        //新建一个工作簿
        workbooks->dynamicCall("Add");
        //获取当前工作簿
        QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
        //获取工作表集合
        QAxObject *worksheets = workbook->querySubObject("Sheets");
        //获取工作表集合的工作表1,即sheet1
        QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);
        QVector<QString> title = {"时间(s)","X(m)","Y(m)","Z(m)"};
        for(int i=0;i<4;i++)
        {
            //设置设置某行某列
            QAxObject *Range = worksheet->querySubObject("Cells(int,int)", 1, i);
            Range->setProperty("ColumnWidth",15);//设置列宽,避免出现有些列对应的距离太短,导致无法看清
            Range->dynamicCall("SetValue(const QString &)",title.at(i));
        }

        这种方式一般用来设置表头比较好,因为表头和后面的数据格式不同,分开设置更加的灵活,而且个数较少,基本上不怎么占用时间。

       设置完表头之后就是设置对应的数据,此处用的是QVector<double>的数据,具体的根据自己的设置来进行生成。

//设置表格数据
        QVariantList vars;//行数据
        QString str =QString("%1%2:%3%4").arg('A').arg(2).arg('D').arg(x1.length()+1);//范围
        const int m_rows = x1.size();//行数
        for(int i=0;i< m_rows;++i)
        {
            QList<QVariant> m_column_num;//每列数据
            m_column_num.append(QString::number(x1[i],'g',7));
            m_column_num.append(QString::number(y1[i],'g',7));
            m_column_num.append(QString::number(y2[i],'g',7));
            m_column_num.append(QString::number(y3[i],'g',7));
            vars.append(QVariant(m_column_num));
        }
        QAxObject *rangeAx = worksheet->querySubObject("Range(const QString&)", str);//这个相比于前面的那个的速度会更快一些,这个只需要进行一次操作即可
        rangeAx->dynamicCall("Value", QVariant(vars));

首先通过str确定对应的范围,如果设置的不知道具体的范围‘A’~‘D’,是根据实际的生成对应的行数,可以获得对应的列数,然后将数字转换为A~Z,可以参考网上的知识。后面就是写入数据到QVariant中,将其写入到Excel中。

最后就是关闭操作

workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));//保存至filepath
        workbook->dynamicCall("Close()");//关闭工作簿
        excel->dynamicCall("Quit()");//关闭excel
        delete excel;
        excel=NULL;

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值