QT导出Excel数据
程序员文章站
2024-03-17 19:47:34
...
QT导出Excel表格格式
使用Qt自带的axcontainer模块中的QAxObject类导出数据到excel,下面直接上代码。
注:以下使用的成员变量自行补全
#include "ActiveQt\QAxObject"
bool ExportExcel::addWorkbook()
{
CoInitializeEx(NULL, COINIT_MULTITHREADED); //支持多线程情况
m_pExcel = new QAxObject();
if (!m_pExcel->setControl("Excel.Application")) //连接Excel控件
{
return false;
}
//m_pExcel->dynamicCall("SetVisible (bool Visible)", true);//窗体显示控制,用于调试
m_pExcel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
auto pWorkbooks = m_pExcel->querySubObject("WorkBooks");//获取工作簿集合
if (!pWorkbooks)
{
return false;
}
pWorkbooks->dynamicCall("Add");//新建一个工作簿
m_pWorkbook = m_pExcel->querySubObject("ActiveWorkBook");//获取当前工作簿
if (!m_pWorkbook) {
return false;
}
return true;
}
QAxObject* GTJRuleContrastExportExcel::setWorkBook(QString strSheetName)
{
if (!m_pWorkbook)
{
return nullptr;
}
QAxObject *worksheets = m_pWorkbook->querySubObject("Sheets");//获取工作表集合
int sheet_count = worksheets->property("Count").toInt(); //获取工作表数目
QAxObject *last_sheet = worksheets->querySubObject("Item(int)", sheet_count);
QAxObject *work_sheet = worksheets->querySubObject("Add(QVariant)", last_sheet->asVariant());
work_sheet->dynamicCall("Move(QVariant)", last_sheet->asVariant());
work_sheet->setProperty("Name", strSheetName); //设置工作表Sheet名
return work_sheet;
}
void ExportExcel::endExport() //在析构函数中调用
{
if (m_pWorkbook)
{
QAxObject *worksheets = m_pWorkbook->querySubObject("Sheets");//获取工作表集合
QAxObject *first_sheet = worksheets->querySubObject("Item(int)", 1);
first_sheet->dynamicCall("Select()");//选中 sheet
m_pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_strSavePath));//保存至filepath,注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"\",不然一定保存不了。
m_pWorkbook->dynamicCall("Close()");//关闭工作簿
}
if (m_pExcel)
{
m_pExcel->dynamicCall("Quit()");//关闭excel
delete m_pExcel;
m_pExcel = nullptr;
}
}
void ExportExcel::startExport()
{
if (addWorkbook())
{
return;
}
QAxObject *work_sheet = setWorkBook(strSheetName);
if (!work_sheet)
{
return;
}
//以下开始乱炖
//以下有些指针没有判空,一定要养成指针判空的好习惯
//处理写入excel数据,使用Range方法统一写入excel表格,数据量过大时,可以提升性能
{
QList<QVariant> oRowdata;
QList<QVariant> aline;
aline.append(QVariant(QStringLiteral("哈哈")));
aline.append(QVariant(QStringLiteral("呵呵")));
aline.append(QVariant(QStringLiteral("嘿嘿")));
QVariant conv(aline);
oRowdata.append(conv);
QVariant oData(oRowdata);
QString strRange = "A"+ QString::number(1) + ":" + "C" + QString::number(1);//A1:C1,需写入数据的表格范围
QAxObject *oRange = work_sheet->querySubObject("Range(QString)", strRange);
if (oRange)
{
oRange->setProperty("Value", oData);
}
}
{
QAxObject *pCell = work_sheet->querySubObject("Range(const QString&)", "A1:C1");
if (pCell)
{
//合并单元格
pCell ->setProperty("WrapText", true);
pCell ->setProperty("MergeCells", true);
//pCell ->setProperty("MergeCells", false); //拆分单元格
//字体居中
pCell ->setProperty("HorizontalAlignment", -4108);
pCell ->setProperty("VerticalAlignment", -4108);
//设置字体
QAxObject *font = pCell->querySubObject("Font"); //获取单元格字体
font->setProperty("Bold", true); //字体加粗
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)); //设置单元格字体颜色(红色)
//设置单元格背景色(灰色)
QColor bkColor(125, 125, 125);
QAxObject* interior = pCell->querySubObject("Interior");
interior->setProperty("Color", bkColor);
//绘制单元格边框(黑色)
QAxObject* border = pCell->querySubObject("Borders");
border->setProperty("Color", QColor(0, 0, 0));
//创建组
QAxObject* rows = pCell->querySubObject("Rows");
rows->querySubObject("Group");
}
//宽度自适应
auto range = work_sheet->querySubObject("UsedRange");
QAxObject * cells = range->querySubObject("Columns");
if (cells)
{
cells->dynamicCall("AutoFit");
}
}
}
使用QAxObject导出Excel还是有一定的缺陷,其中最致命的就是性能问题,如果导出的数据量很大,介意不要使用,不然会让你欲哭无泪。
上一篇: 硬肝系列:23种设计模式之命令模式