如何通过Qt 创建一个excel文件

如何通过Qt 创建一个excel文件,第1张

方法/步骤

首先,我们打开前文所设置的工程项目。

然后,我们在界面设计窗口,加入一个label用于显示,要保存的目录。注意设置下相应的界面布局。

然后,我们在mainwindow.h类中创建一个newExcel的函数,用于实现新建excel的功能。

在对应的cpp文件中,我们要实现newExcel函数功能,首先,按前文的步骤,将application,workbook,worksheet进行赋值并设置。

其中,pApplication->setControl("Excel.Application")用于连接excel控件。pWorkBooks = pApplication->querySubObject("Workbooks")获取workbooks指针。

之后,我们需要用QFile先判断下是否已经存在同名文件,如果没有,我们通过 *** 作excel组件进行创建。file.exist()是判断文件是否存在。如果不存在,我们新建一个excel,然后获取活动的workbook。然后通过dynamicCall调用SaveAs函数进行保存。

然后在构造函数中调用newExcel,我们可以创建一个名字为fileName的excel文件了。

程序运行以后,会d出保存文件的对话框,在其中选择要保存的excel文件名,点击保存之后,会在你选择的路径中创建一个excel文件。

但是,当我们准备删除此文件的时候,会无法完成,这是因为,我们程序中使用pApplication *** 作excel的函数并没有关闭。

9

我们可以在源文件中添加以下代码关闭调用。这样就可以删除了。

我的QT版本是5.3

//下面是代码

void MainWindow:lot2Excel(QString title, QString tablename){

QAxObject *excel = new QAxObject

QVector<QString>SubTitle

SubTitle.fill("", 2)

SubTitle[0] = tr("时间")

SubTitle[1] = tr("温度")

if (excel->setControl("Excel.Application")) //连接Excel控件

{

excel->dynamicCall("SetVisible (bool Visible)","false")//不显示窗体

excel->setProperty("DisplayAlerts", false)//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示

QAxObject *workbooks = excel->querySubObject("WorkBooks")//获取工作簿集合

workbooks->dynamicCall("Add")//新建一个工作簿

QAxObject *workbook = excel->querySubObject("ActiveWorkBook")//获取当前工作簿

QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1)

int Column_Cnt = FBGcfg.History.self_FBGHistory2D.size() * SubTitle.size()

//标题行

QAxObject *title1=worksheet->querySubObject("Cells(int,int)", 1, 1)

title1->dynamicCall("SetValue(const QString&)", title)

title1->querySubObject("Font")->setProperty("Size", 18)

//合并标题行

QString cellTitle

cellTitle.append("A1:")

cellTitle.append(QChar(Column_Cnt - 1 + 'A'))

cellTitle.append(QString::number(1))

QAxObject *range1 = worksheet->querySubObject("Range(const QString&)", cellTitle)

range1->setProperty("WrapText", true)                   /* 文本自动换行 */

range1->setProperty("MergeCells", true)                 /* 合并单元格 */

range1->setProperty("HorizontalAlignment", -4108)       //xlCenter

range1->setProperty("VerticalAlignment", -4108)         //xlCenter

/* 第二行标题 */

for(int i=0i<FBGcfg.History.self_FBGHistory2D.size()i++){

int subID = 0

for(subID = 0subID <FBGcfg.self_FBGCntsubID ++){

if(FBGcfg.self_FBGID[subID] == FBGcfg.History.self_FBGHistory2D[i])

break

}

if(subID == FBGcfg.self_FBGCnt)             /* 查询历史表格出错 */

return

QAxObject *title2 = worksheet->querySubObject("Cells(int,int)", 2, i*2 + 1)

title2->dynamicCall("SetValue(const QString&)", FBGcfg.self_FBGNAME[subID] + QString::number(FBGcfg.History.self_FBGHistory2D[i]))

title2->querySubObject("Font")->setProperty("Size", 14)

title2->querySubObject("Interior")->setProperty("Color",QColor(141, 182, 205))

}

/* 第二行标题合并单元格 */

for(int i = 0i <Column_Cnti+=2){

QString cellTitle2

cellTitle2.append(QChar(i + 'A')).append("2:").append(QChar(i + 1 + 'A')).append("2")

QAxObject *range2 = worksheet->querySubObject("Range(const QString&)", cellTitle2)

range2->setProperty("WrapText", true)                   /* 文本自动换行 */

range2->setProperty("MergeCells", true)                 /* 合并单元格 */

}

/* 第三行标题 */

for(int i = 0i <Column_Cnti++){

QAxObject *colwidth

QAxObject *title3 = worksheet->querySubObject("Cells(int,int)", 3, i+1)

QString lie

lie = lie.append(QChar(i + 'A')).append(":").append(QChar(i + 'A'))

colwidth = worksheet->querySubObject("Columns(const QString&)", lie)

if(i%2){

colwidth->setProperty("ColumnWidth", 11)

title3->dynamicCall("SetValue(const QString&)", SubTitle[1])

}else{

colwidth->setProperty("ColumnWidth", 22)

title3->dynamicCall("SetValue(const QString&)", SubTitle[0])

}

title3->querySubObject("Font")->setProperty("Size", 12)

title3->querySubObject("Interior")->setProperty("Color",QColor(191, 191, 191))

}

//调整行高 第一行30 第二行25 第三行20

worksheet->querySubObject("Range(const QString&)", "1:1")->setProperty("RowHeight", 30)

worksheet->querySubObject("Range(const QString&)", "2:2")->setProperty("RowHeight", 25)

worksheet->querySubObject("Range(const QString&)", "3:3")->setProperty("RowHeight", 20)

/* 数据区 */

int MaxSize = 0

QAxObject *CellDataTime = NULL

QAxObject *CellDataTmp = NULL

for(int i = 0i <History_BackUp.size()i++){

if(History_BackUp[i][0].size() >MaxSize)

MaxSize = History_BackUp[i][0].size()

for(int j = 0j <History_BackUp[i][0].size()j ++){

QString timeStr = QDateTime::fromMSecsSinceEpoch(History_BackUp[i][0][j] * 1000.0).toString("yyyy-MM-dd hh:mm:ss")

CellDataTime = worksheet->querySubObject("Cells(int,int)", j + 4, i*2 + 1)

if(CellDataTime)

CellDataTime->dynamicCall("SetValue(const QVariant&)",timeStr)

CellDataTmp = worksheet->querySubObject("Cells(int,int)", j + 4, i*2 + 2)

if(CellDataTmp)

CellDataTmp->dynamicCall("SetValue(const QVariant&)",QString::number(History_BackUp[i][1][j], 'f', 2))

}

}

//画框线

QString lrange

lrange.append("A2:")

lrange.append(Column_Cnt - 1 + 'A').append(QString::number(MaxSize + 3))

QAxObject *rangeline = worksheet->querySubObject("Range(const QString&)", lrange)

rangeline->querySubObject("Borders")->setProperty("LineStyle", QString::number(1))

rangeline->querySubObject("Borders")->setProperty("Color", QColor(0, 0, 0))

rangeline->setProperty("HorizontalAlignment", -4108)       //xlCenter

rangeline->setProperty("VerticalAlignment", -4108)         //xlCenter

//保存当前目录为我的文档目录,所以要用全路径

workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(tablename))

workbook->dynamicCall("Close()")//关闭工作簿

excel->dynamicCall("Quit()")//关闭excel

delete excel

excel=NULL

}

}

//上面是代码,希望对你有帮助

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

*** 作前:

*** 作后:


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

原文地址:https://54852.com/bake/11640526.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存