qt中怎样将表格中数据导出为excel文件

qt中怎样将表格中数据导出为excel文件,第1张

如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能。之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件。在使用了QtSql模块后,我很容易的将这个类改写应用在Qt程序中。类的名字叫“ExportExcelObject”。使用起来很简单:

[cpp] view plaincopy

// 1. declare an object

// – fileName Excel 文件路径

// – sheetName Excel 工作表(sheet)名称

// – tableView 需要导出的QTableView指针

ExportExcelObject obj(fileName, sheetName, tableView)

// 2. define fields (columns) to the Excel sheet file

// – 第1个参数是QTableView的列

// – 第2个参数是对应该列的Excel sheet中的列名

// – 第3个参数是该列的类型,可以使用char(x) (x最大255),int,datetime, 等

obj.addField(1, tr("name"), "char(60)")

obj.addField(2, tr("ID"), "int")

obj.addField(3, tr("time"), " datetime ")

// 3. 该类有特定的SIGNAL用于连接一个progress控件,可以显示导出进度

connect(&obj, SIGNAL(exportedRowCount(int)), progressBar, SLOT(setValue(int)))

// 4. do the work

int retVal = obj.export2Excel()

if(retVal >0)

{//done

}

else

{//something wrong

}

那么这个类是怎样实现的呢?

1. 将Excel文件当成是一个数据库

使用MS的ODBC或ADO都可以将Excel文件当做一个数据库,那么我们只需要使用下面这个DSN连接串去创建并连接至该Excel文件:

[cpp] view plaincopy

QString dsn = QString("DRIVER={Microsoft Excel Driver (*.xls)}DSN=''FIRSTROWHASNAMES=1CREATE_DB=/"%1/"DBQ=%2").

arg(excelFilePath).arg(excelFilePath)

2. 将Excel的工作表(sheet)当成是一个数据库表

可以使用SQL语句“CREATE TABLE” 去创建一个工作表。

3. 向表中插入数据

使用SQL的“INSERT”语句插入数据。

4. Unicode支持

是的,列名和数据都支持Unicode。

我的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

}

}

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

方法一:进入到mysql的控制台,输入:

1. SELECT * INTO OUTFILE ‘./test.xls‘ FROM tb1 WHERE 1 ORDER BY id DESC LIMIT 0, 50

这样,应该会在你的mysql的var/目录下产生一个test.xls的文件。。。

但是如果你的shell的登录帐户和mysql的运行账户不同,很可能这个方法就不适用了,因为你可以通过mysql控制台来产生这个文件,但是你却没有办法通过shell来对这个文件进行 *** 作,因为用户不同,没有访问权限。

这个时候,同事告诉偶滴办法就重装登录了!!!

1. echo "SELECT * FROM tb1 WHERE 1 ORDER BY id DESC LIMIT 0, 50"| /usr/local/mysql/bin/mysql -hlocalhost -uroot -pxxxxx >/tmp/test.xls

ok,把你的test.xls文件从tmp下载到本地打开来看看吧。。。

什么?中文乱码?

别着急。。。

因为office默认的是gb2312编码,服务器端生成的很有可能是utf-8编码,这个时候你有两种选择,

1.在服务器端使用iconv来进行编码转换,

1. iconv -futf8 -tgb2312 -otest2.xls test.xls

如果转换顺利,那么从server上下载下来就可以使用了。

转换如果不顺利,则会提示:iconv: illegal input sequence at position 1841 类似于这样的错误,

先把test.xls下载下来,这个时候文件是utf-8编码的,用excel打开,乱码。

把test.xls以文本方式打开,然后另存为,在编码选择ANSI编码,保存。

望采纳。。。纯手敲


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

原文地址: http://outofmemory.cn/tougao/8092261.html

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

发表评论

登录后才能评论

评论列表(0条)

保存