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
说明:
1.设置窗口最大化
m_officeApp->setProperty("WindowState", "xlmaximized");//excel m_officeApp->setProperty("WindowState", "wdWindowStateMaximize");//word
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html