#include "xlsxhandler.h" #include "logger.h" void XlsxHandler::test() { QString sourceFilePath = QDir::currentPath() + "/sample.xlsx"; qDebug() << "fileName:" << sourceFilePath; readFile(sourceFilePath); } void XlsxHandler::readFile(const QString sourceFilePath) { // 检查文件是否存在 if(!QFile::exists(sourceFilePath)) { qDebug() << "xlsx file not existed:" << sourceFilePath; return; } // 尝试打开文件 QXlsx::Document xlsx(sourceFilePath); #if 0 // 获取所有工作表名称 QStringList sheetNames = xlsx.sheetNames(); qDebug() << "工作表名称:" << sheetNames; #endif QXlsx::Worksheet *workSheet = xlsx.currentWorksheet(); if(!workSheet) { qDebug() << "current sheet is empty."; return; } // 获取工作表的行数和列数 int rowCount = workSheet->dimension().rowCount(); int colCount = workSheet->dimension().columnCount(); qDebug() << "row:" << rowCount << "col:" << colCount; logde << "0:" << workSheet->cellAt(1, 1)->value().toString().toStdString(); qDebug() << workSheet->cellAt(1, 1)->value().toString(); int index = 2; Global::ExperimentInfo ei; ei.sampleName = workSheet->cellAt(index++, 2)->value().toString(); ei.sampleWeight = workSheet->cellAt(index++, 2)->value().toString(); index++; // skip crucible weight. ei.date = workSheet->cellAt(index++, 2)->value().toString(); ei.experimentor = workSheet->cellAt(index++, 2)->value().toString(); index++; // skip measure type. ei.phaseSize = workSheet->cellAt(index++, 2)->value().toInt(); QVector phaseTotalVtr; int startLineIndex = 9; for(int i = 0; i < ei.phaseSize; i++) { Global::PhaseTotalInfo phaseTotal; phaseTotal.phaseIndex = i + 1; readPhaseData(workSheet, startLineIndex, phaseTotal); phaseTotalVtr.push_back(phaseTotal); } } void XlsxHandler::readPhaseData(QXlsx::Worksheet *workSheet, int &startLineIndex, Global::PhaseTotalInfo &phaseTotal) { // skip.# Time/min Temp/℃ Voltage/mW startLineIndex++; // skip.第一段 startLineIndex++; phaseTotal.phase.cutoff_temp = workSheet->cellAt(startLineIndex++, 2)->value().toDouble(); phaseTotal.phase.temp_flow = workSheet->cellAt(startLineIndex++, 2)->value().toDouble(); phaseTotal.phase.constant_temp_time_min = (uint16_t)(workSheet->cellAt(startLineIndex++, 2)->value().toInt()); phaseTotal.phase.gas = static_cast(workSheet->cellAt(startLineIndex++, 2)->value().toInt()); int dataSize = workSheet->cellAt(startLineIndex++, 2)->value().toInt(); for(int i = 0; i < dataSize; i++) { Global::ExperimentData data; data.runTime = workSheet->cellAt(startLineIndex, 2)->value().toDouble(); data.sampleTemp = workSheet->cellAt(startLineIndex, 3)->value().toDouble(); data.dsc = workSheet->cellAt(startLineIndex, 4)->value().toDouble(); phaseTotal.dataVtr.push_back(data); startLineIndex++; } } void XlsxHandler::writeFile() { Global::ExperimentInfo& ei = Global::_experimentInfo; QXlsx::Document xlsx; xlsx.addSheet("Sheet1"); // 添加一个新的工作表 int row = 0; xlsx.write(row++ , 1, ConFileDataInfo); xlsx.write(row , 1, ConSampleName); xlsx.write(row , 2, ei.sampleName); row++; xlsx.write(row , 1, ConSampleWeight); xlsx.write(row , 2, ei.sampleWeight); xlsx.write(row , 3, ConUnitMg); row++; xlsx.write(row , 1, ConCrucibleWeight); xlsx.write(row , 2, 0); xlsx.write(row , 3, ConUnitMg); row++; xlsx.write(row , 1, Conexperimenter); xlsx.write(row , 2, ei.experimentor); row++; xlsx.write(row , 1, ConDate); xlsx.write(row , 2, ei.date); row++; xlsx.write(row , 1, ConMeasureType); xlsx.write(row , 2, "样品"); row++; xlsx.write(row , 1, ConPhaseSize); xlsx.write(row , 2, ei.phaseVtr.size()); row++; // write phase data int dataSizeRow = 0; for(int i = 0; i < ei.phaseVtr.size();i++){ const Phase& phase = ei.phaseVtr.at(i); xlsx.write(row , 1, ConPhaseProfix); xlsx.write(row , 2, ConPhaseHeaderTime); xlsx.write(row , 3, ConPhaseHeaderTemp); xlsx.write(row , 4, ConPhaseHeaderVoltage); row++; xlsx.write(row , 1, ConPhaseIndex); xlsx.write(row , 2, i + 1); row++; // phase info xlsx.write(row , 1, ConPhaseCutoffTemp); xlsx.write(row , 2, phase.cutoff_temp); xlsx.write(row , 3, ConUnitDegreeCentigrade); row++; xlsx.write(row , 1, ConPhaseHeatingRate); xlsx.write(row , 2, phase.temp_flow); xlsx.write(row , 3, ConUnitDegreeCentigradePerMin); row++; xlsx.write(row , 1, ConPhaseConstantTempTime); xlsx.write(row , 2, phase.constant_temp_time_min); xlsx.write(row , 3, ConUnitMin); row++; xlsx.write(row , 1, ConPhaseAtmosphere); switch(phase.gas){ case GasType::NC: xlsx.write(row , 2, "NC"); break; case GasType::N2: xlsx.write(row , 2, "N2"); break; case GasType::O2: xlsx.write(row , 2, "O2"); break; default:break; } row++; // phase data. dataSizeRow = row; xlsx.write(row , 1, ConPhaseDataSize); xlsx.write(row , 2, 0); row++; } #if 0 // 创建一个新的 Excel 文档 QXlsx::Document xlsx; // 检查数据是否为空 if (data.isEmpty()) { qWarning() << "没有数据可写入"; return ; } // 遍历数据并写入单元格 for (int row = 0; row < data.size(); ++row) { const QVector& rowData = data[row]; for (int col = 0; col < rowData.size(); ++col) { QString cellValue = rowData[col]; xlsx.write(row + 1, col + 1, cellValue); // 行和列从1开始 } } // 保存文件 if (!xlsx.saveAs(filePath)) { qWarning() << "无法保存文件:" << filePath; return ; } qDebug() << "文件保存成功:" << filePath; return ; #endif }