如何使用Qt来操作Excel

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Qt来操作Excel相关的知识,希望对你有一定的参考价值。

Qt操作Excel,无论后缀是xls还是xlsx都可以。

 

1.如下,是下载的一个Excel VBA参考手册,内容不算太全!

 

2.Excel读取

为了便于测试,假设已存在一个excel文件,操作内容已经被红色标记出来。如下所示:

主要读取内容:

标题

工作表数目

工作表名称

起始行

起始列

行数

列数

单元格内容

代码如下:

 

QAxObject excel("Excel.Application");  

excel.setProperty("Visible", true);  

QAxObject *work_books = excel.querySubObject("WorkBooks");  

work_books->dynamicCall("Open (const QString&)",  QString("E:/test.xlsx"));

QVariant title_value = excel.property("Caption");  //获取标题

 

qDebug()<<QString("excel title : ")<<title_value;  

 

QAxObject *work_book = excel.querySubObject("ActiveWorkBook");  

 

QAxObject *work_sheets = work_book->querySubObject("Sheets");   //Sheets也可换用WorkSheets

 

int sheet_count = work_sheets->property("Count").toInt();   //获取工作表数目

 

qDebug()<<QString("sheet count : ")<<sheet_count;  

 

for(int i=1; i<=sheet_count; i++)  

 

 

 

QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i);   //Sheets(int)也可换用Worksheets(int)

 

QString work_sheet_name = work_sheet->property("Name").toString();   //获取工作表名称

 

QString message = QString("sheet ")+QString::number(i, 10)+ QString("  name");

 

qDebug()<<message<<work_sheet_name;  

 

 

if(sheet_count > 0)

 

 

QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);   

 

QAxObject *used_range = work_sheet->querySubObject("UsedRange");   

 

QAxObject *rows = used_range->querySubObject("Rows");  

 

QAxObject *columns = used_range->querySubObject("Columns");  

 

int row_start = used_range->property("Row").toInt();  //获取起始行    

 

int column_start = used_range->property("Column").toInt();   //获取起始列

 

int row_count = rows->property("Count").toInt();  //获取行数

 

int column_count = columns->property("Count").toInt();   //获取列数

 

for(int i=row_start; i

 

 

 

for(int j=column_start; j

 

 

 

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

 

QVariant cell_value = cell->property("Value");  //获取单元格内容

 

QString message = QString("row-")+QString::number(i,  10)+QString("-column-")+QString::number(j, 10)+QString(":");

 

qDebug()<<message<<cell_value;  

 

 

 

 

 

 

 

 

3.效果如下:

 

 

 

4.Excel增、删、改

主要操作:

设置标题

插入工作表(至最后一行)

设置工作表名称

删除工作表

设置单元格内容

设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)

设置单元格对齐方式

设置单元格高度、宽度

设置单元格背景色、边框色

合并/拆分单元格

清空单元格

代码如下:

 

 

 

 

QAxObject excel("Excel.Application");  

 

excel.setProperty("Visible", true);  

 

QAxObject *work_books = excel.querySubObject("WorkBooks");  

 

work_books->dynamicCall("Open(const QString&)",  "E:\\\\test.xlsx");

 

excel.setProperty("Caption", "Qt Excel");

 

QAxObject *work_book = excel.querySubObject("ActiveWorkBook");  

 

QAxObject *work_sheets = work_book->querySubObject("Sheets");   //Sheets也可换用WorkSheets

//删除工作表(删除第一个)

 

QAxObject *first_sheet = work_sheets->querySubObject("Item(int)",  1);

 

first_sheet->dynamicCall("delete");

 

//插入工作表(插入至最后一行)

 

int sheet_count = work_sheets->property("Count").toInt();   //获取工作表数目

 

QAxObject *last_sheet = work_sheets->querySubObject("Item(int)",  sheet_count);

 

QAxObject *work_sheet = work_sheets->querySubObject("Add(QVariant)",  last_sheet->asVariant());

 

last_sheet->dynamicCall("Move(QVariant)",  work_sheet->asVariant());

 

work_sheet->setProperty("Name", "Qt Sheet");  //设置工作表名称

 

//操作单元格(第2行第2列)

 

QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", 2,  2);

 

cell->setProperty("Value", "Java C++ C# php Perl Python Delphi Ruby");   //设置单元格值

 

cell->setProperty("RowHeight", 50);  //设置单元格行高

 

cell->setProperty("ColumnWidth", 30);  //设置单元格列宽

 

cell->setProperty("HorizontalAlignment", -4108); //左对齐(xlLeft):-4131   居中(xlCenter):-4108  右对齐(xlRight):-4152

 

cell->setProperty("VerticalAlignment", -4108);  //上对齐(xlTop)-4160  居中(xlCenter):-4108  下对齐(xlBottom):-4107

 

cell->setProperty("WrapText", true);  //内容过多,自动换行

 

//cell->dynamicCall("ClearContents()");  //清空单元格内容

 

QAxObject* interior = cell->querySubObject("Interior");

 

interior->setProperty("Color", QColor(0, 255, 0));    //设置单元格背景色(绿色)

 

QAxObject* border = cell->querySubObject("Borders"); 

 

border->setProperty("Color", QColor(0, 0, 255));    //设置单元格边框色(蓝色)

 

QAxObject *font = cell->querySubObject("Font");  //获取单元格字体

 

font->setProperty("Name", QStringLiteral("华文彩云"));  //设置单元格字体

 

font->setProperty("Bold", true);  //设置单元格字体加粗

 

font->setProperty("Size", 20);  //设置单元格字体大小

 

font->setProperty("Italic", true);  //设置单元格字体斜体

 

font->setProperty("Underline", 2);  //设置单元格下划线

 

font->setProperty("Color", QColor(255, 0, 0));   //设置单元格字体颜色(红色)

 

//设置单元格内容,并合并单元格(第5行第3列-第8行第5列)

 

QAxObject *cell_5_6 = work_sheet->querySubObject("Cells(int,int)", 5,  3);

 

cell_5_6->setProperty("Value", "Java");  //设置单元格值

 

QAxObject *cell_8_5 = work_sheet->querySubObject("Cells(int,int)", 8,  5);

 

cell_8_5->setProperty("Value", "C++");

 

QString merge_cell;

 

merge_cell.append(QChar(3 - 1 + 'A'));  //初始列

 

merge_cell.append(QString::number(5));  //初始行

 

merge_cell.append(":");

 

merge_cell.append(QChar(5 - 1 + 'A'));  //终止列

 

merge_cell.append(QString::number(8));  //终止行

 

QAxObject *merge_range = work_sheet->querySubObject("Range(const  QString&)", merge_cell);

 

merge_range->setProperty("HorizontalAlignment", -4108);

 

merge_range->setProperty("VerticalAlignment", -4108);

 

merge_range->setProperty("WrapText", true);

 

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

 

//merge_range->setProperty("MergeCells", false);  //拆分单元格

 

 

 

//work_book->dynamicCall("Save()");   //保存文件(为了对比test与下面的test2文件,这里不做保存操作)  work_book->dynamicCall("SaveAs(const QString&)", "E:\\\\test2.xlsx");   //另存为另一个文件 

 

work_book->dynamicCall("Close(Boolean)", false);  //关闭文件

 

excel.dynamicCall("Quit(void)");  //退出

 

5.效果如下:

 

操作前:

 

操作后:

 

 

 

 

 

 

参考技术A 1、显示当前窗口:
excel.setProperty("Visible", true);
2、更改 Excel 标题栏:
excel.setProperty("Caption", "Invoke Microsoft Excel");
3、添加新工作簿:
QAxObject * workbooks = excel.querySubObject("WorkBooks");
workbooks->dynamicCall("Add");
4、打开已存在的工作簿:
workbooks->dynamicCall("Open (const QString&)", QString("c:/test.xls"));
5、获取活动工作簿:
QAxObject * workbook = excel.querySubObject("ActiveWorkBook");
6、获取所有的工作表:
QAxObject * worksheets = workbook->querySubObject("WorkSheets");
7、获取工作表数量:
int intCount = worksheets->property("Count").toInt();
8、获取第一个工作表:
QAxObject * worksheet = workbook->querySubObject("Worksheets(int)", 1);
9、获取cell的值:
QAxObject * range = worksheet->querySubObject("Cells(int,int)", 1, 1 );本回答被提问者和网友采纳

Qt excel 操作使用说明

学习背景:

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

一.简单介绍

    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文件操作

   获取当前工作簿的集合

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

  新建一个工作簿

1 workbooks->synamicCall("Add"); //新建一个工作簿
2 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工作表操作

  获取所有工作表

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();

 

以上是关于如何使用Qt来操作Excel的主要内容,如果未能解决你的问题,请参考以下文章

QT 使用第三方库QtXlsx操作Excel表

QT 使用第三方库QtXlsx操作Excel表

如何使用 Linux 和 python 在我的 Qt 窗口中显示 word/excel 文档?

Qt 如何保存excel 中的图片到指定目录

Qt excel 操作使用说明

qt操作sqlite 如何使用vacuum命令?