
首先,我们打开前文所设置的工程项目。
然后,我们在界面设计窗口,加入一个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.效果如下:
*** 作前:
*** 作后:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)