Qt excel 操做使用说明

学习背景:

    适合熟悉些qt开发,可是不是深刻了解的开发者学习。具体实现(qt 5.1版本),office2007 Excel作验证,Win 7(64位),若有讲解有误,欢迎斧正!app

一.简单介绍

    QAxObject是Qt提供的包装COM组件的类,经过COM经过COM操做使用QAxObject类,使用此类,须要在pro文件中添加学习

QT  +=  axcontainer

二.与excel com链接的方法

1 #include <ActiveQt/QAxObject>  
2 QAxObject *excel = new QAxObject("Excel.Application"); //!创建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文件

三.Excel基本操做

  只介绍简单的读写操做,须要修改单元格格式等操做,请"Excel VBA参考手册.chm"大数据

  3.1  excel文件操做ui

   获取当前工做簿的集合this

QAxObject *workbooks =  excel->querySubObject("Workbooks"); //! 获取工做簿(excel文件)集合

  新建一个工做簿spa

1 workbooks->synamicCall("Add"); //新建一个工做簿
2 QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); //! 获取当前工做簿

  打开一个已有的工做簿excel

1 QString filename = "e:/123.xlsx"; 2 QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filename);

  保存工做簿code

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工做表操做blog

  获取全部工做表

QAxObject *worksheets = workbook->querySubObject("Sheets"):

  根据序号获取某个工做表,序号顺序就是excel 打开后下方的排序

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 内容操做

  数据内容操做--获取单元格--基于坐标

QAxObject *cell = worksheet->querySubObject("Cells(int, int)", i,  j);

  数据内容操做--获取单元格--基于行列名称

QAxObject *cell = worksheet->querySubObject("Range(QVariant, QVariant)", "A1");

  数据内容操做--读单元格内容

QVariant cell_value = cell->property("Value");

  数据内容操做-- 写单元格内容

cell->setProperty("Value",  "内容");

4.其余(没有实践操做)

  4.1  大数据量读取

    读取全部单元格内容-数据量大,只须要进行一次操做便可读取全部内容,避免重复对每一个单元格进行QAxObect操做

1  QVariant var; 2  QAxObject * usedRange = sheet->querySubObject("UseRange"); //! 获取用户区域范围
3  if(NULL == usedRange || usedRange->isNull()) 4 { 5     return  var; 6 } 7 var = usedRange->dynamicCall("Value"); // 读取区域内全部值
8 delete usedRange;

  此时结果以QVariant保存,须要自行转化为QList<QList<QVariant>>

1 QList<QList<QVariant>> excel_list; 2 auto rows = var.toList(); 3 
4 for(auto row:rows) 5 { 6  excel_list.append(row.toList()); 7 }

  4.2 大数据写入

  以QList<QList<QVariant>>存储,须要限定范围

QAxObject *user_rang = this->sheet->querySubObject("Rang(const QString&)", "A1:D100");

   写入数据

rang->setProperty("Value", var); 

  4.3 简单的范例

 1 // HRESULT r = OleInitialize(0);  2    // if(r != S_OK && r != S_FALSE)  3    // {  4         //qWaring("Qt:初始化Ole 失败(error %x)", (unsigned int)r);  5     //}
 6     QString filename = "e:/123.xlsx"; //具体路径
 7  QFile file(filename);  8     bool isExit = file.exists();  9     if(!isExit) 10         return false; 11     qDebug()<<"isExit"<<isExit; 12     qDebug()<<filename; 13     QAxObject *excel = new QAxObject("Excel.Application"); 14     excel->dynamicCall("SetVisible(bool Visble)", "false"); 15     excel->setProperty("DisplayAlerts", false); 16     QAxObject *workbooks = excel->querySubObject("WorkBooks"); 17     QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filename); 18     QAxObject *worksheets = workbook->querySubObject("Sheets"); 19     QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1); 20 
21     //写入到指定位置
22     QAxObject *workrang = worksheet->querySubObject("Cells(int, int)", 5, 1); 23     //不能这么存
24     workrang->dynamicCall("SetValue(const QString&)", QString("1ssssssfffssssssssssssssssssssssssssssss10987654321")); 25 
26 
27     //读取出来并打印
28     QAxObject *workrang1 = worksheet->querySubObject("Cells(int,int)", 3, 5); 29 
30     QVariant var = workrang1->dynamicCall("Value"); 31     qDebug()<<var; 32     qDebug()<<var.toDouble(); 33 
34     //另存保存 35     //workbook->dynamicCall("SaveAs(const QString&)", 36              // QDir::toNativeSeparators(filename));
37 
38     workbook->dynamicCall("Save()", true); 39     //关闭文件
40     workbook->dynamicCall("Close(Boolean)", true); 41     excel->dynamicCall("Quit()"); 42     delete excel; 43     excel = NULL; 44    // OleUninitialize();
相关文章
相关标签/搜索