QXlsx对合并单元格的处理

本文介绍如何使用QXlsx库在Qt项目中读取Excel文件,并处理合并单元格的内容。通过遍历所有合并单元格,确保正确读取并处理每一个单元格的数据,特别是当单元格位于合并区域时,能准确地获取其内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下代码是在项目中使用QXlsx对合并单元格的处理,处理的部分都加了注释


    void c_excel::ImportIPCNameInfo(modipcmrg *qWidget,QStandardItemModel *qModelList,QString qstrFilePath)
    {
    	QXlsx::Document xlsx(qstrFilePath);
    	QXlsx::CellRange range = xlsx.dimension();
    	int nrow = range.lastRow();
    	int ncol = range.lastColumn();
    	int nRowCout = qModelList->rowCount();
    	
    	/******合并单元格的内容处理******/
    	QXlsx::Workbook *xWorkBook = xlsx.workbook();
    	//默认使用第一张表格
    	QXlsx::Worksheet *xWorkSheet = static_cast<QXlsx::Worksheet *>(xWorkBook->sheet(0));
    	//获取到所有的合并单元格
    	QList<QXlsx::CellRange> qMergedCellsList = xWorkSheet->mergedCells();
    	
    	QMap<QString,QVariant> qmap;
    	for(int i = 0; i < nRowCout; i++)
    	{
    		TAG_DEVICE_CHANNEL_IPC_24_INFO& ipcInfo = qModelList->item(i)->data().value<TAG_DEVICE_CHANNEL_IPC_24_INFO>();
    		QString ipcName = ipcInfo.qstrDeviceName;
    		QString ipcIp = ipcInfo.qstrIP;
    		unsigned int ipcProtocol = ipcInfo.nProtocolType;
    		auto &iter = qmap.find(ipcIp);
    		if(iter == qmap.end())
    		{
    			qmap.insert(ipcIp,QVariant::fromValue(ipcInfo));
    		}
    	}
    		
    	for(int j = 1;j <= nrow;j++)
    	{
    		QString qstrIp = "";
    		QString qstrName = "";
    		
    		for(int k=1; k<=ncol; k++)
    		{
    			if(k == 1)
    			{
    				qstrIp = xlsx.read(j,k).value<QString>();
    			}
    			else
    			{
    				if(qMergedCellsList.size() > 0)
    				{
    					bool bflag = false;
    					//合并单元格的内容处理
    					foreach(QXlsx::CellRange cellR, qMergedCellsList)
    					{
    						//合并单元格可通过第一行,最后一行,第一列,最后一列四个参数来确定合并的区域
    						int nFirstRow = cellR.firstRow();
    						int nLastRow = cellR.lastRow();
    						int nFirstCol = cellR.firstColumn();
    						int nLastCol = cellR.lastColumn();
    						//判断该单元格是否处于合并单元格中
    						if(nFirstRow <= j && j<= nLastRow && nFirstCol <= k && k<= nLastCol)
    						{
    							qstrName += xlsx.read(nFirstRow,nFirstCol).value<QString>();
    							bflag = true;
    						}
    					}
    					if(bflag)
    					{
    						continue;
    					}
    				}
    				
    				qstrName += xlsx.read(j,k).value<QString>();
    			}
    		}
    
    		auto &iter = qmap.find(qstrIp);
    		if(iter == qmap.end())
    		{
    			continue;
    		}
    
    		QVariant qvar = iter.value();
    		TAG_DEVICE_CHANNEL_IPC_24_INFO ipcInfo = qvar.value<TAG_DEVICE_CHANNEL_IPC_24_INFO>();
    		if(ipcInfo.qstrIP == qstrIp && !qstrName.isEmpty() && !qstrName.isNull() && qstrName != ipcInfo.qstrDeviceName)
    		{
    			if(ipcInfo.nProtocolType == UNS_DEVICE_NVRODLPRO)
    			{
    				ipcInfo.qstrDeviceName = QString::number(ipcInfo.nChannel) + QString("_")+qstrName;
    			}
    			else
    			{
    				ipcInfo.qstrDeviceName = qstrName;
    			}
    			QVariant tag = QVariant::fromValue<TAG_DEVICE_CHANNEL_IPC_24_INFO>(ipcInfo);
    
    			emit qWidget->mod_channel_info_import_export_signal(qWidget->GetProtocolType(),qWidget->GetDeviceID(),QVariant::fromValue(tag));
    		}
    	}
    	Sleep(500);
    	emit import_IPC_name_success_signal();

下面是我的表格格式,第一列之后可以随便合并
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值