欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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还是有一定的缺陷,其中最致命的就是性能问题,如果导出的数据量很大,介意不要使用,不然会让你欲哭无泪。

相关标签: qt excel