Qt的QXlsx的简单使用

QXlsx生成excel文件简单易用不用过多介绍。
1.生成xlsx文件示例代码
针对本人业务需要说明:filename为xlsx的文件名包含具体路径,cc,shijian命名数据表的关键词,changci,shijian为数据库查询关键词。

void outputXlsx(const QString& filename, const QString&cc, const QString&changci, const QString&shijain){
	int countRow = 0;
	
	int countRec = 0;
	//创建xlsx文件
	QXlsx::Document xlsx(filename);
	//修改工作表
	if (xlsx.selectSheet("Sheet1")) {
		xlsx.deleteSheet("Sheet1");
	} 
	if (!xlsx.selectSheet(shijain + cc + "统计结果")) {
		xlsx.addSheet(shijain + cc + "统计结果");
	}

	//设置表头样式
	QXlsx::Format headFormat;
	//设置列的背景颜色
	headFormat.setPatternBackgroundColor(QColor(100,180,252));
	headFormat.setFontSize(15);
	headFormat.setHorizontalAlignment(QXlsx::Format::AlignHCenter);
	headFormat.setVerticalAlignment(QXlsx::Format::AlignVCenter);
	headFormat.setBorderColor(QColor(0,0,0));
	//具体设置各个列的属性
	xlsx.setColumnWidth(1,9);
	xlsx.write(3,1,"序号",headFormat);
	xlsx.setColumnWidth(2, 35);
	xlsx.write(3,2,"身份证号",headFormat);
	xlsx.setColumnWidth(3,20);
	xlsx.write(3,3,"姓名",headFormat);
	xlsx.setColumnWidth(4,12);
	xlsx.write(3, 4, "性别", headFormat);
	xlsx.setColumnWidth(5,25);
	xlsx.write(3, 5, "准考证号", headFormat);
	xlsx.setColumnWidth(6, 20);
	xlsx.write(3, 6, "考场", headFormat);
	xlsx.setColumnWidth(7, 10);
	xlsx.write(3, 7, "座号", headFormat);
	xlsx.setColumnWidth(8, 15);
	xlsx.write(3, 8, "核查结果", headFormat);
	xlsx.setColumnWidth(9, 15);
	xlsx.write(3,9, "识别次数", headFormat);
	countRow += 3;
	//设置具体数据的格式
	QXlsx::Format contentFormat;
	contentFormat.setFontColor(QColor(Qt::black));
	contentFormat.setFontSize(13);
	contentFormat.setHorizontalAlignment(QXlsx::Format::AlignLeft);
	contentFormat.setVerticalAlignment(QXlsx::Format::AlignVCenter);
    //构建具体数据,并且设置数据格式
	//未通过的
	countRow += 1;
	//数据库查询具体内容
	QVector<AllAuthTjPojo> notPass = faceLogSrv->getAllAuthTjNotPassLog(changci,shijain);
	if (notPass.size() > 0) {
	    //具体构建过程
		for (int i = countRow,j=0; i < countRow + notPass.size(),j<notPass.size(); i++,j++) {
			AllAuthTjPojo allTj = notPass[j];
			xlsx.write(i,1,j+1,contentFormat);
			xlsx.write(i,2,allTj.getSfz(),contentFormat);
			xlsx.write(i,3,allTj.getXingming(),contentFormat);
			xlsx.write(i,4,allTj.getXingbie(),contentFormat);
			xlsx.write(i,5,allTj.getZkzNum(),contentFormat);
			xlsx.write(i,6,allTj.getKc(),contentFormat);
			xlsx.write(i,7,allTj.getZuoh(),contentFormat);
			xlsx.write(i,8,allTj.getShibieleixing(),contentFormat);
			xlsx.write(i,9,allTj.getRenzcount(),contentFormat);
		}
		//记录行数
		countRow += notPass.size();
		//记录总条数
		countRec += notPass.size();
		//单元格合并
		xlsx.mergeCells(QXlsx::CellRange("F" + QString::number(countRow) + ":I" + QString::number(countRow) + ""), contentFormat);
		//合并后写入具体内容
		xlsx.write("F" + QString::number(countRow), "小计:"+QString::number(notPass.size())+"条未通过验证");
		
	}else{
		countRow += 2;
		xlsx.mergeCells(QXlsx::CellRange("F"+QString::number(countRow)+":I"+QString::number(countRow)+""),contentFormat);
		xlsx.write("F" + QString::number(countRow),"小计:0条未通过验证");		
	}
	//姓名不正确的
	countRow += 1;
	QVector<AllAuthTjPojo> nameError = faceLogSrv->getAllAuthTjNameErrorLog(changci,shijain);
	if (nameError.size() > 0) {
		for (int i = countRow, j = 0; i < countRow + nameError.size(), j<nameError.size(); i++, j++) {
			AllAuthTjPojo allTj = nameError[j];
			xlsx.write(i, 1, j + 1, contentFormat);
			xlsx.write(i, 2, allTj.getSfz(), contentFormat);
			xlsx.write(i, 3, allTj.getXingming(), contentFormat);
			xlsx.write(i, 4, allTj.getXingbie(), contentFormat);
			xlsx.write(i, 5, allTj.getZkzNum(), contentFormat);
			xlsx.write(i, 6, allTj.getKc(), contentFormat);
			xlsx.write(i, 7, allTj.getZuoh(), contentFormat);
			xlsx.write(i, 8, allTj.getShibieleixing(), contentFormat);
			xlsx.write(i, 9, allTj.getRenzcount(), contentFormat);
		}
		countRow += nameError.size();
		countRec += nameError.size();
		xlsx.mergeCells(QXlsx::CellRange("F" + QString::number(countRow) + ":I" + QString::number(countRow) + ""), contentFormat);
		
		xlsx.write("F" + QString::number(countRow), "小计:" + QString::number(nameError.size()) + "条姓名不一致");

	}
	else {
		countRow += 2;
		xlsx.mergeCells(QXlsx::CellRange("F" + QString::number(countRow) + ":I" + QString::number(countRow) + ""), contentFormat);
		xlsx.write("F" + QString::number(countRow), "小计:0条姓名不一致");
	}
	
	//未通过机器
	countRow += 1;
	QVector<AllAuthTjPojo> noTj = faceLogSrv->getAllAuthTjNoRzLog(changci, shijain);
	if (noTj.size() > 0) {
		for (int i = countRow, j = 0; i < countRow + noTj.size(), j<noTj.size(); i++, j++) {
			AllAuthTjPojo allTj = noTj[j];
			xlsx.write(i, 1, j + 1, contentFormat);
			xlsx.write(i, 2, allTj.getSfz(), contentFormat);
			xlsx.write(i, 3, allTj.getXingming(), contentFormat);
			xlsx.write(i, 4, allTj.getXingbie(), contentFormat);
			xlsx.write(i, 5, allTj.getZkzNum(), contentFormat);
			xlsx.write(i, 6, allTj.getKc(), contentFormat);
			xlsx.write(i, 7, allTj.getZuoh(), contentFormat);
			xlsx.write(i, 8, allTj.getShibieleixing(), contentFormat);
			xlsx.write(i, 9, allTj.getRenzcount(), contentFormat);
		}
		countRow += noTj.size();
		countRec += noTj.size();
		xlsx.mergeCells(QXlsx::CellRange("F" + QString::number(countRow) + ":I" + QString::number(countRow) + ""), contentFormat);
		xlsx.write("F" + QString::number(countRow), "小计:" + QString::number(noTj.size()) + "条未通过机器");

	}
	else {
		countRow += 2;
		xlsx.mergeCells(QXlsx::CellRange("F" + QString::number(countRow) + ":I" + QString::number(countRow) + ""), contentFormat);
		xlsx.write("F" + QString::number(countRow), "小计:0条未通过机器");
	}


	//通过验证
	countRow += 1;
	QVector<AllAuthTjPojo> passRc = faceLogSrv->getAllAuthTjPassLog(changci, shijain);
	if (passRc.size() > 0) {
		for (int i = countRow, j = 0; i < countRow + passRc.size(), j< passRc.size(); i++, j++) {
			AllAuthTjPojo allTj = passRc[j];
			xlsx.write(i, 1, j + 1, contentFormat);
			xlsx.write(i, 2, allTj.getSfz(), contentFormat);
			xlsx.write(i, 3, allTj.getXingming(), contentFormat);
			xlsx.write(i, 4, allTj.getXingbie(), contentFormat);
			xlsx.write(i, 5, allTj.getZkzNum(), contentFormat);
			xlsx.write(i, 6, allTj.getKc(), contentFormat);
			xlsx.write(i, 7, allTj.getZuoh(), contentFormat);
			xlsx.write(i, 8, allTj.getShibieleixing(), contentFormat);
			xlsx.write(i, 9, allTj.getRenzcount(), contentFormat);
		}
		countRow += passRc.size();
		countRec += passRc.size();
		xlsx.mergeCells(QXlsx::CellRange("F" + QString::number(countRow) + ":I" + QString::number(countRow) + ""), contentFormat);
		xlsx.write("F" + QString::number(countRow), "小计:" + QString::number(passRc.size()) + "条验证通过");
	}
	else {
		countRow += 2;
		xlsx.mergeCells(QXlsx::CellRange("F" + QString::number(countRow) + ":I" + QString::number(countRow) + ""), contentFormat);
		xlsx.write("F" + QString::number(countRow), "小计:0条验证通过");
	}
	countRow += 1;
	xlsx.mergeCells(QXlsx::CellRange("F" + QString::number(countRow) + ":I" + QString::number(countRow) + ""), contentFormat);
	//写入总条数
	xlsx.write("F" + QString::number(countRow), "总计:"+QString::number(countRec)+"条记录");
	//保存excel
	xlsx.saveAs(filename);
}

2.解析xlsx文件代码示例
fname为带有路径的xlsx文件名。

void DataIoPanel::inputXlsxFile(const QString&fname) {
	//载入excel文件
	QXlsx::Document xlsx(fname);
	//获取工作表数目,并且选择第一个
	QStringList sheetList = xlsx.sheetNames();
	if (sheetList.size() > 0) {
		//数据库插入初始化
		QString sql1 = "INSERT INTO zkzdata(xingming,upersonnum) VALUES(?,?)";
		//初始化查询
		QSqlQuery zkzQuery(db);
		//开启事务
		db.transaction();
		zkzQuery.prepare(sql1);
		//获取数据表名字
		xlsx.selectSheet(sheetList[0]);
		//获取表格行数和列数
		QXlsx::CellRange range=xlsx.dimension();
		
		QString xm = "";
		QString sfz = "";
		for (int i = 2; i < range.rowCount()+1; ++i) {
		    //读取工作表有用数据插入数据库
			if (xlsx.cellAt(i, 2) != 0) {
				 xm = xlsx.cellAt(i, 2)->value().toString().trimmed();
			}
			if (xlsx.cellAt(i, 3) != 0) {
				sfz= xlsx.cellAt(i, 3)->value().toString().trimmed();
			}
			if (!xm.isEmpty() && !sfz.isEmpty()) {
				//qDebug() << xm << "---" << sfz;
				zkzQuery.bindValue(0, xm);
				zkzQuery.bindValue(1, sfz);
				zkzQuery.exec();
				xm = "";
				sfz = "";
			}
	  }
	    //提交事务
		db.commit();
		//发射解析完毕信号
		emit dataEnd();
	}
	else {
		box.setInformationMsg("工作表为空");
		box.exec();
		this->close();
		return;

	}


}

希望有一些借鉴意义

你可能感兴趣的:(Qt技术)