Qt中读写Excel

文章目录

      • Excel 主要读取内容:
      • Excel增、删、改

头文件中记得添加这个:

#include 

profile:
QT += axcontainer

首先自己算是踩了很多坑,不知道为啥根据Excel VBA参考手册来写都有问题,研究废了我不少时间,最后说一下,手册和官方的有些方法有问题。
下面这些具体的操作是引用自以下博客:(其中一些不全的代码我已经补全了)
http://blog.sina.com.cn/s/blog_a6fb6cc90101gv2p.html

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);  
    
    --------------------更改begin--------------------------
    QAxObject *work_sheet = work_book->querySubObject("Worksheets");
    QAxObject *work_item = work_sheet ->querySubObject("Item(int)",1);
    
    下面所有的 work_sheet 替换为 work_item 即可。
    --------------------更改end----------------------------
    
    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 < row_count;i++)
    {  
        for(int j=column_start; j < column_count; 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;  
        }  
    }  
}

结论:这种读法相当缓慢,看着我快累死,相当卡顿,究其原因请参考我另一篇博客。这里只是写出excel的基本操作,其实看了手册一般也就会了,无非就是open->read/write->close。下面继续。

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)");  //退出

效果如下:
操作前:

Qt中读写Excel_第1张图片
操作后
Qt中读写Excel_第2张图片

到这里很多人也许都在纳闷,单元格的宏怎么获取的?比如对齐方式(居中对齐),为什么值是-4108,而不是其他值呢?当然那不是我随便写的,自己可以录制宏,然后跟踪。
看下图:

Qt中读写Excel_第3张图片

如上所讲,已经基本可以满足常用的操作,如有更多专业需求,请参考Excel VBA…

结论:由于本人只有读的需求,所以对于写没有去验证方法是否运行会报错以及时间的长度,有需求的可以自行验证

这里贴上我自己从网上筛选了很久,被我整理集合了所有officeAPI的参考手册,需要的人可以下载:
https://download.csdn.net/download/clinuxf/10859480

你可能感兴趣的:(QT)