建立excel操作对象,并连接Excel控件 3. excel->dynamicCall("SetVisible (bool Visible)", "false"); //! 设置为不显示窗体 4.excel->setProperty("DisplayAlerts", false); //! 不显示任何警告信息, 如关闭时的是否保存提示 5.excel->dynamicCall("Quit(void)"); //! 关闭excel程序,操作完后记着关闭,由于是隐藏在后台进程中,不关闭进程会有很多excel.exe 6.workbook->dynamicCall("Close(Boolean)", false); //! 关闭exce程序先关闭.xls文件【相关文章推荐:】Qt开发进阶技术栈学习路线和资料三.Excel基本操作 只介绍简单的读写操作,需要修改单元格格式等操作,请"Excel VBA参考手册.chm" 3.1 excel文件操作 获取当前工作簿的集合 1> QAxObject workbooks = excel->querySubObject("Workbooks"); //! 获取工作簿(excel文件)集合 新建一个工作簿 1> workbooks->synamicCall("Add"); //新建一个工作簿 QAxObject workbook = excel->querySubObject("ActiveWorkBook"); //! 获取当前工作簿 打开一个已有的工作簿 1>QString filename = "e:/123.xlsx"; 2>QAxObject workbook = workbooks->querySubObject("Open(const QString&)", filename); 保存工作簿 1>workbook->dynamicCall("Save()"); //!保存文件 2>workbook->dynamicCall("Close(Boolean)", false); //! 关闭文件 3>excel->dynamicCall("Quit()"); //! 关闭excel 另存为工作簿 1>QDir::toNativeSeparators,将路径中的"/"转换为"\",否则无法保存,"/"只是qt中可以识别 2>workbook->dynamiCall("SaveAs(const QString&)", QDit::toNativeSeparators(filename)); 3>workbook->synamicCall("Close(Boolean)", false); //
关闭文件 4>excel->dynamicCall("Quit()"); //! 关闭excel 3.2 Sheet工作表操作 获取所有工作表 1> QAxObject worksheets = workbook->querySubObject("Sheets"): 根据序号获取某个工作表,序号顺序就是excel 打开后下方的排序 1>QAxObject worksheet = worksheets->querySubObejct("Item(int)", 1); 获取表中的行数列数 1>QAxObject usedrange = worksheet->querySubObject("UsedRange"); //! sheet 范围 2>int intRowStart = usedrange->property("Row").toInt(); //! 起始行数 3>int intColStart = usedrange->property("Column").toInt(); //! 起始列数 4>QAxObject rows, columns; 5>rows = usedrange->querySubObject("Rows"): //! 行 6>columns = usedrange->querySubObject("Columns"); //! 列 7>int intRow = rows->property("Count").toInt(); //! 行数 8>int intCol = columns->property("Count").toInt(); //! 列数 3.3 内容操作 数据内容操作--获取单元格--基于坐标 1> QAxObject cell = worksheet->querySubObject("Cells(int, int)", i, j); 数据内容操作--获取单元格--基于行列名称 1>QAxObject cell = worksheet->querySubObject("Range(QVariant, QVariant)", "A1"); 数据内容操作--读单元格内容 1> QVariant cell_value = cell->property("Value"); 数据内容操作-- 写单元格内容1> cell->setProperty("Value", "内容");4.其他 4.1 大数据量读取 读取所有单元格内容-数据量大,只需要进行一次操作即可读取所有内容,避免重复对每个单元格进行QAxObect操作 1. QVariant var; 2. QAxObject usedRange = sheet->querySubObject("UseRange"); //! 获取用户区域范围 3. if(NULL == usedRange || usedRange->isNull()){ return var; } 4. var = usedRange->dynamicCall("Value"); // 读取区域内所有值 5.delete usedRange; 此时结果以QVariant保存,需要自行转化为QList<QList<QVariant>> QList<QList<QVariant>> excel_list; auto rows = var.toList(); for(auto row:rows) { excel_list.append(row.toList());} 4.2 大数据写入 以QList<QList<QVariant>>存储,需要限定范围 1>QAxObject user_rang = this->sheet->querySubObject("Rang(const QString&)", "A1:D100"); 写入数据 1> rang->setProperty("Value", var); 4.3 简单的范例
// HRESULT r = OleInitialize(0); // if(r != S_OK && r != S_FALSE) // { //qWaring("Qt:初始化Ole 失败(error %x)", (unsigned int)r); //} QString filename = "e:/123.xlsx"; //具体路径 QFile file(filename); bool isExit = file.exists(); if(!isExit) return false; qDebug()<<"isExit"<<isExit; qDebug()<<filename; QAxObject excel = new QAxObject("Excel.Application"); excel->dynamicCall("SetVisible(bool Visble)", "false"); excel->setProperty("DisplayAlerts", false); QAxObject workbooks = excel->querySubObject("WorkBooks"); QAxObject workbook = workbooks->querySubObject("Open(const QString&)", filename); QAxObject worksheets = workbook->querySubObject("Sheets"); QAxObject worksheet = worksheets->querySubObject("Item(int)", 1); //写入到指定位置 QAxObject workrang = worksheet->querySubObject("Cells(int, int)", 5, 1); //不能这么存 workrang->dynamicCall("SetValue(const QString&)", QString("1ssssssfffssssssssssssssssssssssssssssss10987654321")); //读取出来并打印 QAxObject workrang1 = worksheet->querySubObject("Cells(int,int)", 3, 5); QVariant var = workrang1->dynamicCall("Value"); qDebug()<<var; qDebug()<<var.toDouble(); //另存保存 //workbook->dynamicCall("SaveAs(const QString&)", // QDir::toNativeSeparators(filename)); workbook->dynamicCall("Save()", true); //关闭文件 workbook->dynamicCall("Close(Boolean)", true); excel->dynamicCall("Quit()"); delete excel; excel = NULL; // OleUninitialize();
4.4 关于权限配置 1):在服务器上安装office的Excel软件. 2):在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" ,win7 64 可以通过在运行里面输入 comexp.msc -32 来打开32位的组件服务,在里就能看到excel组件了 3):依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置" 4):在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框 5):点击"标识"标签,选择"交互式用户 6):点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加一个"NETWORK SERVICE"用户 (注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限. 7):依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"权限. 8).如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题进一步的解决方式还有待探讨 9).采用第8点的设置后,打开Excel可能会出现“无法使用对象引用或链接”,并且不能进行单元格粘贴原因不明,取消设置后即可消失 4.5 关于在分线程中调用QAXObject 请首先初始化COM 代码:HRESULT r = OleInitialize(0);if(r != S_OK && r != S_FALSE){ qWaring("Qt:初始化Ole 失败(error %x)", (unsigned int)r); } OleUninitialize();
(图片来源网络,侵删)
0 评论