QT读写Excel相关操作

本文介绍了如何在QT中进行Excel的读写操作,包括修改.pro文件以支持相关功能,批量写入指定工作表,以及将整数转换为Excel列号的方法。参考了CSDN上的相关博客资源。
#include<QAxObject>

修改.pro文件:

1、读Excel

void ReadExcel(const QString filePath,QVariantList& dataList,int s)//读取Excel文件
{
    QAxObject *excel = new QAxObject("Excel.Application");
    excel->setControl("Excel.Application");
    excel->setProperty("Visible", false);       // 不显示窗体
    excel->setProperty("DisplayAlerts", false); // 不显示任何警告信息。如果为true, 那么关闭时会出现类似"文件已修改,是否保存"的提示
    QAxObject* workbooks = excel->querySubObject("WorkBooks");  //获取工作簿集合
    workbooks->dynamicCall("Open(const QString)", filePath); //打开打开已存在的工作簿
    QAxObject* workbook = excel->querySubObject("ActiveWorkBook"); //获取当前工作簿
    QAxObject* sheet = workbook->querySubObject("WorkSheets(int)", s);//获取工作sheet s
    QAxObject* range = sheet->querySubObject("UsedRange"); //获取该sheet的使用范围对象
    QVariant var = range->dynamicCall("Value");
    delete range;
    dataList = var.toList();  //得到表格中的所有数据 所有数据用QVariantList存储
    workbooks->dynamicCall("Close()"); //关闭工作簿
    excel->dynamicCall("Quit()"); //退出进程

}

2、写Excel

批量写指定sheet:

void WriteExcel(const QString filePath,QString range,QList<QVariant> dataList,int s)
{
        QAxObject* excel = new QAxObject("Excel.Application");
         excel->setControl("Excel.Application");  // 连接Excel控件
         excel->dynamicCall("SetVisible (bool Visible)", "false"); // 不显示窗体
         excel->setProperty("DisplayAlerts", false);  // 不显示任何警告信息。如果为true, 那么关闭时会出现类似"文件已修改,是否保存"的提示
         QAxObject* workbooks = excel->querySubObject("WorkBooks"); // 获取工作簿集合
         QAxObject* workbook = workbooks->querySubObject("Open(const QString&)",filePath);
         QAxObject* sheet = workbook->querySubObject("WorkSheets(int)", s);//打开sheet(s)
    QAxObject* user_range = sheet->querySubObject("Range(const QString&)", range);//写数据在表格的范围 range形式:A1:D100
    if (nullptr == user_range || user_range->isNull()) {
        return;
    }
    user_range->dynamicCall("SetValue(const QVariant&)", QVariant(dataList));
    workbook->dynamicCall("Save()");  //保存文件
    workbook->dynamicCall("Close (Boolean)", false);  // 关闭文件
    excel->dynamicCall("Quit(void)");   // 关闭excel
}

单独写指定单元格 :

void WriteExcel(const QString filePath,int row,int col,QString write_in,int sheet)//写入Excel文件
{
   QAxObject* excel = new QAxObject("Excel.Application");
    excel->setControl("Excel.Application");  // 连接Excel控件
     excel->dynamicCall("SetVisible (bool Visible)", "false"); // 不显示窗体
     excel->setProperty("DisplayAlerts", false);  // 不显示任何警告信息。如果为true, 那么关闭时会出现类似"文件已修改,是否保存"的提示
     QAxObject* workbooks = excel->querySubObject("WorkBooks"); // 获取工作簿集合
     QAxObject* workbook = workbooks->querySubObject("Open(const QString&)",filePath);
     QAxObject* worksheet = workbook->querySubObject("WorkSheets(int)", sheet);//打开sheet(sheet)
     QAxObject* cell = worksheet->querySubObject("Cells(int, int)", row, col);//选择单元格
     cell->dynamicCall("SetValue(conts QVariant&)", write_in); // 设置单元格的值
     workbook->dynamicCall("Save()");  //保存文件
     workbook->dynamicCall("Close(Boolean)", false);  //关闭文件
}

3、int转为Excel列号

 char intto26char( int dig)
{
    int acs = dig - 1 + 'A';
    return (char)acs;
 }

QString IntColToExcel(int column)//列数转为Excel对应列数
  {
      int col = column + 1;
      int system = 26;
      QString digArr;
      while (col > 0)
      {
          int mod = col % system;
          if (mod == 0) mod = system;
          digArr.append(intto26char(mod));
          col = (col - 1) / 26;
      }
      QString bf;
      for (int i =digArr.length()-1; i >= 0; i--)
      {
          bf.append(digArr[i]);
      }
      return bf;
  }

参考:

https://www.iteye.com/blog/fengpeng-93855

Qt读写Excel文件(QAxObject)_VectorAL的博客-CSDN博客

qt之读写excel_xiaocg2009的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值