赞
踩
因工作需要,要实现一个小型的数据管理系统。本着想捡起来QT技能的想法,学习下QTExcel的导入导出功能,基本有两种,一种是使用AXObject,一种是使用开源的XLSX控件。
QAxObject是Qt提供的包装COM组件的类,通过COM操作使用QAxObject类,使用此类,需要在pro文件中添加
QT += axcontainer
因此前数据库中是将数据展示在tableview,故封装好一个IO类供界面按钮槽函数使用。槽函数如下:
void CustomerManager::on_importButton_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this,"打开",QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),"Excel 文件(*.xls *.xlsx)");
m_DataIO.Open(fileName);
m_DataIO.ReadDataToTable(ui->tableView); //导入到widget中
m_DataIO.Close();
}
void CustomerManager::on_exportButton_clicked()
{
m_DataIO.SaveDataFrTable(ui->tableView,"客户信息"); //导出到widget中
}
#include <QAxBase>
#include <QAxObject>
//使用QAxObject导出Excel public: bool Open(QString xlsFile,int nSheet = 1,bool visible = false);//打开xls文件 void Save(); //保存xls报表 void Close(); //关闭xls报表 bool SaveDataFrTable(QTableView *tableview,QString title); //保存数据到xls bool ReadDataToTable(QTableView *tableview); //从xls读取数据到ui QVariant GetCellData(int row,int column); //获取指定单元数据 bool SetCellData(int row,int column,QVariant data); //修改指定单元数据 int getRowCount() const; //获取行数 int getColumnCount() const; //获取列数 bool IsOpen(); //检验 bool IsValid(); private: QAxObject *pExcel; //指向整个excel应用程序 QAxObject *pWorkbooks; //指向工作簿集,excel有很多工作簿 QAxObject *pWorkbook; //指向sXlsFile对应的工作簿 QAxObject *pWorksheet; //指向工作簿中的某个sheet表单 QString m_sXlsFile; //xls文件路径 int nCurrSheet; //当前打开的第几个sheet int nRowCount; //行数 int nColumnCount; //列数 int nStartRow; //开始有数据的行下标值 int nStartColumn; //开始有数据的列下标值 bool bIsOpen; //是否已打开 bool bIsValid; //是否有效 bool bIsANewFile; //是否是一个新建xls文件,用来区分打开的excel是已存在文件还是有本类新建的 bool bIsSaveAlready;//防止重复保存
bool DataIO::Open(QString xlsFile, int nSheet, bool visible) { m_sXlsFile = xlsFile; bIsOpen = false; if (m_sXlsFile!="") { pExcel = new QAxObject; if (pExcel->setControl("Excel.Application")) //连接Excel控件 { pExcel->dynamicCall("SetVisible (bool Visible)",visible);//不显示窗体 pExcel->setProperty("DisplayAlerts", false); //step1:获取工作簿集合 pWorkbooks = pExcel->querySubObject("WorkBooks"); //step2:打开指定工作簿 pWorkbook = pWorkbooks->querySubObject("Open(const QString&)", m_sXlsFile); //step3:获取当前工作表格1,即sheet1 pWorksheet = pWorkbook->querySubObject("WorkSheets(int)", nSheet); //step4: 获取行数,列数 QAxObject* usedrange = pWorksheet->querySubObject("UsedRange"); // sheet范围 nStartRow = usedrange->property("Row").toInt(); // 起始行数 nStartColumn = usedrange->property("Column").toInt(); // 起始列数 QAxObject *rows, *columns; rows = usedrange->querySubObject("Rows"); // 行 columns = usedrange->querySubObject("Columns"); // 列 nRowCount = rows->property("Count").toInt(); // 行数 nColumnCount = columns->property("Count").toInt(); // 列数 bIsOpen = true; } else { QMessageBox::warning(NULL,"错误","未能创建 Excel 对象,请安装 Microsoft Excel。",QMessageBox::Apply); } } return bIsOpen; } void DataIO::Close() { pWorkbook->dynamicCall("Close()");//关闭工作簿 pExcel->dynamicCall("Quit()");//关闭excel delete pExcel; pExcel=NULL; } bool DataIO::SaveDataFrTable(QTableView *tableview, QString title) { QString fileName = QFileDialog::getSaveFileName(tableview, "保存",QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。