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;
}
}
希望有一些借鉴意义