Qt+excel

前言:

对于excel来说,每个区域都是QAxObject 对象,包括单元格、边框、字体、颜色等等

1、初始化插件

pro中:QT += axcontainer

初始化:CoInitialize(NULL);//#include <windows.h>

//注意:如果是在线程里操作excel,需要在对应的线程里加这句话初始化

2、初始化对象,记住在后面按从小到大delete

CoInitialize(NULL);
QAxObject * excel = new QAxObject("Excel.Application");                                 //选择excel软件
excel->dynamicCall("Setvisible (bool Visible)","false");                                //不显示主窗体,后面打开excel的时候不显示
excel->setProperty("DisplayAlerts",false);                                              //不显示excel的警告信息,如果打开失败,不弹出框
QAxObject *work_books = excel->querySubObject("WorkBooks");                             //选择work_books
work_books->dynamicCall("Open(const QString&)", Config::getInstance().getExcelPath());  //设置excel存在路径
QAxObject *work_book = excel->querySubObject("ActiveWorkBook");                         //选择work_book
QAxObject *work_sheets = work_book->querySubObject("Sheets");                           //Sheets也可换用WorkSheets
int sheet_count = work_sheets->property("Count").toInt();                               //获取工作表数目
QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", sheetNum+1);    //Sheets也可换用WorkSheets,打开第一个sheet
QAxObject *range_data = work_sheet->querySubObject("UsedRange");    //返回用户使用了的区域
QString work_sheet_name = work_sheet->property("Name").toString();    //获取当前表名称

3、选择某个区域对象

QAxObject *range_title = work_sheet->querySubObject("Range(const QString&)","A1:L1");  //返回A1到L1的区域对象
QAxObject *range_data = work_sheet->querySubObject("UsedRange");               //返回用户使用了的区域对象
QAxObject *cell_title = work_sheet->querySubObject("Cells(int,int)",1,1);          //返回1行1列的单元格对象
QAxObject *range_font = range_title->querySubObject("Font");                  //获取内容格式对象,用于设置颜色、字号、粗体等等
QAxObject *range_A2L2Border = range_A2L2->querySubObject("Borders");             //获取边框对象

4、细节操作

4.1、获取单元格内容

cell_title->property("Value")).toString();//property是返回QVariant结构体

4.2、合并单元格

range_title->setProperty("MergeCells",true);//合并单元格

4.3、设置字符

range_title->dynamicCall("SetValue(const QString&)","测试部财产统计表");

4.4、设置字号、加粗

range_font ->setProperty("Size",20);//字号
range_font ->setProperty("Bold",true);//加粗

4.5、添加下拉筛选

range_A2L2->dynamicCall("AutoFilter");//下拉筛选

4.6、边框加粗

range_A2L2Border->setProperty("Weight",-4138);//边框加粗,不加粗填2

4.7、文字水平居中

range_data->setProperty("HorizontalAlignment",-4108);//文字水平居中


4.8、文字垂直居中

range_data->setProperty("VerticallAlignment",-4108);//垂直居中


4.9、自动换行

range_data->setProperty("WrapText", true);//自动换行

4.10、获取sheet数

QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可换用WorkSheets 
int sheet_count = work_sheets->property("Count").toInt();  //获取工作表数目
4.11、获取sheet名字
QString work_sheet_name = work_sheet->property("Name").toString();

 4.12、设置sheet名字

QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", sheet); //Sheets也可换用WorkSheets,打开第一个sheet
work_sheet->setProperty("Name", "Test");

5、大数据操作

5.1、读取整个表

QVariant var;
QAxObject *range_data = work_sheet->querySubObject("UsedRange");
var = range_data->dynamicCall("Value");//将所有数据存在QVariant结构体里面
QList<QList <QVariant>> list;//结果
castVariant2ListListVariant(var,list);//自定义函数
for(int i=2;i<list.size();i++)
  {
    QList<QVariant> tempRow;
    tempRow = list.at(i);
    QStringList tempStrList;
    for(int j=1;j<12;j++)//12是excel列数
    {
      tempStrList.append(tempRow.at(j).toString());
    }
    //tempStrList是一行数据,在这里取出,tempStrList.at(n)...
  }
void castVariant2ListListVariant(const QVariant &var, QList<QList<QVariant> > &res)//上面的自定义函数
{
  QVariantList varRows = var.toList();
  if(varRows.isEmpty())
  {
    qDebug()<<"varRows isEmpty";
    return;
  }
  const int rowCount = varRows.size();
  QVariantList rowData;
  for(int i=0;i<rowCount;++i)
  {
    rowData = varRows[i].toList();
    res.push_back(rowData);
  }
}

ps:使用Excel录制宏来获取指令

1、打开excel,选择文件-》选项-》自定义功能区-》把开发工具勾选上

2、点击功能区开发工具,点击录制宏

3、操作Excel,如合并单元格

4、停止录制

5、打开vb代码,获取合并单元格的公式,把公式使用QAxObject 来调用

5.2、写入整个表

QList< QList<QVariant> > m_datas;
while(n--)//声明定义一个双重QList变量
{
QList<QVariant> rows;
for(int i=0;i<column+1;i++)
  rows.append(query.value(i).toString());
    m_datas.append(rows);
}
QVariant var;
castListListVariant2Variant(var,m_datas);//自定义函数,双重QList转QVariant
range_data->dynamicCall("SetValue(const QVariant&)",var);//写入数据
void castListListVariant2Variant(QVariant &var, const QList<QList<QVariant> > &res)
{
QVariant temp = QVariant(QVariantList());
QVariantList record;
int listSize = res.size();
for (int i = 0; i < listSize;++i)
{
  temp = res.at(i);
  record << temp;
}
temp = record;
var = temp;
}

  

PS:保存及内存回收

work_book->dynamicCall("Save()");
work_book->dynamicCall("Close(Boolean)",false);
excel->dynamicCall("Quit(void)");
delete range_data;
delete work_sheet;
delete work_book;
delete work_books;
delete excel;

可参考:https://www.jianshu.com/p/392c563e2430

Qt中使用C++读写Excel文件,可以通过多种方法实现,其中一种常用的方法是使用第三方库,如LibreOffice的UNO(Universal Network Objects)或Microsoft的COM接口。不过,这些方法相对复杂。另一种更简单的方法是使用QtQTableWidget或QTableView结合QFile来手动解析和生成Excel文件(通常是CSV格式)。 以下是使用QFile和QTextStream来读取和写入CSV文件的示例代码,这种方法适用于简单的Excel文件: ### 读取Excel文件(CSV格式) ```cpp #include <QFile> #include <QTextStream> #include <QStringList> #include <QDebug> void readExcel(const QString& filePath) { QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Cannot open file for reading: " << filePath; return; } QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine(); QStringList fields = line.split(','); for (const QString& field : fields) { qDebug() << field; } } file.close(); } ``` ### 写入Excel文件(CSV格式) ```cpp #include <QFile> #include <QTextStream> #include <QStringList> #include <QDebug> void writeExcel(const QString& filePath, const QList<QStringList>& data) { QFile file(filePath); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "Cannot open file for writing: " << filePath; return; } QTextStream out(&file); for (const QStringList& row : data) { for (const QString& field : row) { out << field << ","; } out << "\n"; } file.close(); } ``` ### 使用示例 ```cpp int main() { QString filePath = "example.csv"; // 写入数据 QList<QStringList> data; data.append(QStringList() << "Name" << "Age" << "City"); data.append(QStringList() << "Alice" << "30" << "New York"); data.append(QStringList() << "Bob" << "25" << "Los Angeles"); writeExcel(filePath, data); // 读取数据 readExcel(filePath); return 0; } ``` 这种方法适用于简单的Excel文件,尤其是CSV格式的文件。如果需要处理更复杂的Excel文件(如包含公式、图表等),建议使用专门的库,如LibreOffice的UNO或Microsoft的COM接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jumore

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

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

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

打赏作者

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

抵扣说明:

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

余额充值