如何使用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的主要内容,如果未能解决你的问题,请参考以下文章