QXlsx 设置表头和写入每行记录.

代码如下: 


#include <QCoreApplication>
#include "xlsxdocument.h"
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建一个新的 Excel 工作簿
    QXlsx::Document xlsx;

    // 定义表头
    QStringList headers = {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8"};

    // 创建一个格式对象,设置背景颜色为灰色
    QXlsx::Format headerFormat;
    headerFormat.setPatternBackgroundColor(QColor(Qt::lightGray));

    // 写入表头,并应用格式
    for (int col = 1; col <= headers.size(); ++col) {
        xlsx.write(1, col, headers[col - 1], headerFormat);
    }

    // 写入 6 行记录
    for (int row = 2; row <= 7; ++row) {
        for (int col = 1; col <= 8; ++col) {
            xlsx.write(row, col, QString("Data %1-%2").arg(row - 1).arg(col));
        }
    }

    // 保存工作簿
    if (xlsx.saveAs("example.xlsx")) {
        qDebug() << "Excel file saved successfully.";
    } else {
        qDebug() << "Failed to save Excel file.";
    }

    return a.exec();
}

/** * @file ExportTool.h * @brief 导出文件 * @author 作者名 * @date 创建日期 * @copyright 版权信息 */ #ifndef EXPORTTOOL_H #define EXPORTTOOL_H #include <qstring.h> #include <qjsonarray.h> enum FileType{ FT_None = 0, FT_Csv, FT_Xlsx, FT_Docx }; class ImportOptions{ public: ImportOptions() :fileType(FT_Xlsx) ,saveToDb(true) ,batchSize(1000) {} //canshu FileType fileType; bool saveToDb; int batchSize; QString tableName; }; /** * @brief The ExportTool class 导出文件 */ class ExportTool { ExportTool(); public: ~ExportTool(); /** * @brief instance 单例 * @return */ static ExportTool *instance(); /** * @brief exportFile 导出文件 * @param fn 文件名称 * @param records 数据库数据 * @param ft 文件类型 * @return */ //bool exportFile(const QString& fn, const QJsonArray& records, FileType ft = FT_Csv); bool exportFile(const QString& fn, const QJsonArray& records, FileType ft = FT_Xlsx); bool importFile(const QString&fn, QJsonArray& records,const ImportOptions& option); private: // static ExportTool* m_instance; }; #endif // EXPORTTOOL_H #include "ExportTool.h" #include "QXlsx/header/xlsxdocument.h" #include<QDebug> #include<QJsonObject> #include <QFile> #include <QCoreApplication> #include <QDir> #include <QJsonArray> #include "common/DataBaseManager.h" #include "user/UserManager.h" #include <QXlsx/header/xlsxcell.h> #include <QtWidgets/QFileDialog> ExportTool::ExportTool() { } ExportTool *ExportTool::m_instance = 0; ExportTool *ExportTool::instance() { if(m_instance == 0) m_instance = new ExportTool; return m_instance; } bool ExportTool::exportFile(const QString &fn, const QJsonArray &records, FileType ft) { if(ft !=FT_Xlsx) { qDebug()<<"仅支持导出位XLsx文件"; } if(records.isEmpty()) { qDebug()<<"导出失败,没有数据"; return false; } QString filePath = fn; // 如果未传入路径,使用默认路径+自动命名 if (filePath.isEmpty()) { QString defaultDir = QCoreApplication::applicationDirPath() + "/export"; QDir dir(defaultDir); if (!dir.exists()) { dir.mkpath("."); // 创建目录包括父目录 } // 2. 自动生成文件名 QString fileName = QString("数据导出_%1.xlsx") .arg(QDateTime::currentDateTime().toString("yyyyMMddHHmmss")); // 拼接完整路径 filePath = dir.filePath(fileName); qDebug() << "未指定路径,自动保存至:" << filePath; } //创建文档 QXlsx::Document xlsx; //获取表头2 QJsonObject firstObj = records.first().toObject(); QStringList headers = firstObj.keys(); for(int col =0;col<headers.size();++col) { xlsx.write(1, col + 1, headers[col]); } //写入数据--从第二行写入 for (int row = 0; row < records.size(); ++row) { QJsonObject obj = records[row].toObject(); // 遍历当前行的所有字段,写入对应列 for (int col = 0; col < headers.size(); ++col) { QString key = headers[col]; // 字段名(与表头对应) QJsonValue value = obj.value(key); // 字段值 // 将 QJsonValue 转换为 QVariant QVariant cellValue; if (value.isString()) { cellValue = value.toString(); } else if (value.isDouble()) { cellValue = value.toDouble(); } else if (value.isBool()) { cellValue = value.toBool(); } else if (value.isNull()) { cellValue = ""; // 空值显示为空字符串 } else { cellValue = "不支持的类型"; } // 写入单元格 xlsx.write(row + 2, col + 1, cellValue); } } // 导出文件 bool saveSuccess = xlsx.saveAs(fn); if (saveSuccess) { qDebug() << "XLSX 导出成功:" << fn; } else { qDebug() << "XLSX 导出失败:" << fn; } return saveSuccess; } bool ExportTool::importFile(const QString& filePath, QJsonArray& records, const ImportOptions& options) { // 1. 参数校验 if (options.saveToDb && options.tableName.isEmpty()) { qDebug() << "保存数据库失败:未指定目标表名"; return false; } if (options.fileType != FT_Xlsx) { qDebug() << "仅支持导入XLSX文件"; return false; } // 2. 清空输出容器 records = QJsonArray(); // 3. 检查文件存在性 if (!QFile::exists(filePath)) { qDebug() << "文件不存在:" << filePath; return false; } // 4. 读取XLSX文件 QXlsx::Document xlsx(filePath); QXlsx::Worksheet *sheet = xlsx.currentWorksheet(); if (!sheet) { qDebug() << "无法获取工作表,文件可能损坏"; return false; } // 读取表头 QStringList headers; int col = 0; while (true) { std::shared_ptr<QXlsx::Cell> cell = sheet->cellAt(1, col); if (!cell || cell->value().isNull()) break; headers << cell->value().toString(); col++; } qDebug() << "读取到的表头:" << headers; if (headers.isEmpty()) { qDebug() << "文件没有有效的表头数据"; return false; } // 读取数据行 int row = 2; while (true) { std::shared_ptr<QXlsx::Cell> firstCell = sheet->cellAt(row, 1); if (!firstCell || firstCell->value().isNull()) break; QJsonObject recordObj; for (int c = 0; c < headers.size(); c++) { std::shared_ptr<QXlsx::Cell> cell = sheet->cellAt(row, c + 1); if (cell) { QVariant value = cell->value(); // 类型转换 if (value.type() == QVariant::String) { recordObj[headers[c]] = value.toString(); } else if (value.type() == QVariant::Int || value.type() == QVariant::Double) { recordObj[headers[c]] = value.toDouble(); } else if (value.type() == QVariant::Bool) { recordObj[headers[c]] = value.toBool(); } else { recordObj[headers[c]] = value.toString(); } } else { recordObj[headers[c]] = QJsonValue::Null; } } records.append(recordObj); row++; } qDebug() << "XLSX导入完成,共" << records.size() << "条记录"; // 5. 保存到数据库(使用options中的配置) if (options.saveToDb && !records.isEmpty()) { DataBaseManager *dbMgr = DataBaseManager::instance(); if (!dbMgr->connect()) { qDebug() << "数据库连接失败:" << dbMgr->getLastError(); return false; } if (!dbMgr->existTable(options.tableName)) { qDebug() << "目标表不存在:" << options.tableName; dbMgr->close(); return false; } // 事务处理(使用options.batchSize作为批次大小) if (!dbMgr->exec("BEGIN TRANSACTION;")) { qDebug() << "开启事务失败:" << dbMgr->getLastError(); dbMgr->close(); return false; } int total = records.size(); bool transactionSuccess = true; for (int i = 0; i < total; i++) { QJsonObject obj = records[i].toObject(); QVariantMap dataMap; for (auto it = obj.begin(); it != obj.end(); ++it) { dataMap[it.key()] = it->toVariant(); } if (!dbMgr->insertRecord(options.tableName, dataMap)) { qDebug() << "第" << (i + 1) << "条记录插入失败"; transactionSuccess = false; break; } // 批次提交 if ((i + 1) % options.batchSize == 0) { if (!dbMgr->exec("COMMIT;") || !dbMgr->exec("BEGIN TRANSACTION;")) { qDebug() << "批次提交失败"; transactionSuccess = false; break; } } } // 处理最后一批 if (transactionSuccess) { transactionSuccess = dbMgr->exec("COMMIT;"); } else { dbMgr->exec("ROLLBACK;"); } dbMgr->close(); return transactionSuccess; } return true; } 这是我实现文件的导入导出的功能,导出功能已经实现,导入函数有点问题,请帮我实现文件的导入功能
最新发布
08-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值