问题描述
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")
.................//与上类似
}
}