如何使用Qt来 *** 作Excel

如何使用Qt来 *** 作Excel,第1张

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=1i<=sheet_counti++)

{

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_starti

{

for(int j=column_startj

{

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.效果如下:

*** 作前:

*** 作后:

方法/步骤

首先,我们要创建一个项目并进行初步的项目设置,过程参见本系列文章的第一篇。这里就不再多说了,我们将项目文件从qtcreator中打开。

为了显示读取到的数据,我们先在界面文件中添加一个Label,如果读取了数据可以在这里显示一下进行验证。

然后,打开mainwindow.cpp文件,在其中引入适当的头文件,具体如图中所示。

接着,我们在头文件中打开置顶的excel文件,并对其中的对象类进行配置,因为前文已经介绍过,就不详细说了,具体代码如下:

QAxObject excel("Excel.Application")

excel.setProperty("Visible",false)

QAxObject *workbooks = excel.querySubObject("WorkBooks")

workbooks->dynamicCall("Open (const QString&)",QString("c:/a.xls"))

QAxObject *workbook = excel.querySubObject("ActiveWorkBook")//获取活动工作簿

QAxObject *worksheets = workbook->querySubObject("WorkSheets")//获取所有的工作表,如图

然后,我们开始获取第一工作表。

通过range查询对应的cell,然后获取cell中value值。代码如下:

QAxObject *range = worksheet->querySubObject("Cells(int,int)",1,1)//获取cell的值

QString strVal = range->dynamicCall("Value2()").toString()

接着,我们将得到的strVal显示label上用于验证是否成功读取。

我们再在c盘下新建一个a.xls文件,并且在第一个单元格输入一个字符串,如图所示.

之后,我们用程序运行下,查看程序是否达到预期的效果.可以看到程序运行成功了.


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8074448.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存