关于读取可变表格内容的思路总结

问题描述

1、根据设置的要求导入表格
2、表格不要求固定列,列表头顺序不固定
3、表格每一列的数据要求和设置中的要求匹配,即设置为必填则表格中必须有该项必填内容,非必填项则可填可不填

思路

1、在点击按钮时要将设置内容加载并存储
2、写一个表头判断函数,大致列出列表头会涉及到的各个项,根据读到的表格第一行,进行拆分,拆分为每一列,做一个循环去和预先涉及到的项进行对比,如果该项匹配成功,则采用一个map结构记录该列的列号及该列的特性(如为名字、年龄),列表头的匹配中再增加一个必填项的判断,记录设置中的必填项为几项,再设置一个变量记录列匹配到且为必填项的数量。待列表头读取完成后,先判断必填项是否数量一致,一致则继续后续操作,不一致则表示该表格中缺少必填项,不予读入。

核心代码

哪天想起来了再写吧,,,健忘老年人需要时间

时隔多年的老年人终于复健了,其实是因为又做了一次这个需求
废话不多说,上代码

.h
QMap<int, qstring> m_colHeadMap;//列-表头映射

void praseHead();//解析表头,可以设置一个int值,计算必填字段是否都有
bool praseData(QString str);//解析每一格元素数据
void importByQXls();


.cpp
void importByQXls()
{
	QString path = QFileDialog::getOpenFileName(this, GET_TXT(""), "", "*.xls *.xlsx");
	if(path)
	{
		Document doc(importPath);
        QXlsx::CellRange range = doc.dimension();//获取文件行列数
        for (int i = 1; i < range.columnCount() + 1; i++)//遍历表头
        {
            QString tempStr = doc.cellAt(1, i)->value().toString().trimmed();//取每一格元素的值
            m_colHeadMap[i] = tempStr;//将表头与列对应
        }
        //praseHead();//得到表头后可以对表头数据进行字符比较,判断必填字段是否存在
        for(int i = 2; i < range.rowCount() + 1; i++)//从第二栏开始
        {
        	for(int j =1; j < range.columnCount+ 1; j++)
        	{	
        		QString dataStr;
                auto tmpCell = doc.cellAt(i, iter.key());
                if(tmpCell)
                {
                    dataStr = tmpCell->value().toString().trimmed();
                }
                if(!praseData(dataStr))//判断数据是否合规
                {
                   break;
                }
               //根据需求所需要的操作
        	}
        }
	}
}

bool praseData(QString str)
{
	if(str == QRegExp)//设置每一列的正则
	{	
		return true;//数据合规
	}
	else if()...............//每一列对应一个正则,直至匹配或者都不匹配
	return false;//不合规
}

void praseHead()
{
	for(QMap<int, QString>::Iterator iter = m_colHeadMap.begin(); iter != m_colHeadMap.end(); ++iter)
	{
		if(iter->value == "字符串1")//比较
		{
			//数据的处理,必填字段+
		}
		else if(iter->value == "字符串2")
		.................//与上类似
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值