DSCAnalysisTool/src/data/xlsxhandler.cpp

216 lines
6.5 KiB
C++
Raw Normal View History

2025-04-12 13:02:37 +00:00
#include "xlsxhandler.h"
#include "logger.h"
void XlsxHandler::test()
{
QString sourceFilePath = QDir::currentPath() + "/sample.xlsx";
2025-04-13 10:10:29 +00:00
qDebug() << "fileName:" << sourceFilePath;
2025-04-12 13:02:37 +00:00
readFile(sourceFilePath);
}
void XlsxHandler::readFile(const QString sourceFilePath)
{
// 检查文件是否存在
2025-04-13 10:10:29 +00:00
if(!QFile::exists(sourceFilePath))
{
2025-04-14 09:11:01 +00:00
qDebug() << "xlsx file not existed:" << sourceFilePath;
2025-04-13 10:10:29 +00:00
return;
2025-04-12 13:02:37 +00:00
}
// 尝试打开文件
QXlsx::Document xlsx(sourceFilePath);
#if 0
// 获取所有工作表名称
QStringList sheetNames = xlsx.sheetNames();
qDebug() << "工作表名称:" << sheetNames;
#endif
QXlsx::Worksheet *workSheet = xlsx.currentWorksheet();
2025-04-13 10:10:29 +00:00
if(!workSheet)
{
2025-04-14 09:11:01 +00:00
qDebug() << "current sheet is empty.";
2025-04-12 13:02:37 +00:00
return;
}
// 获取工作表的行数和列数
int rowCount = workSheet->dimension().rowCount();
int colCount = workSheet->dimension().columnCount();
qDebug() << "row:" << rowCount << "col:" << colCount;
2025-04-13 10:10:29 +00:00
logde << "0:" << workSheet->cellAt(1, 1)->value().toString().toStdString();
qDebug() << workSheet->cellAt(1, 1)->value().toString();
2025-04-12 13:02:37 +00:00
2025-04-13 10:10:29 +00:00
int index = 2;
2025-04-12 13:02:37 +00:00
Global::ExperimentInfo ei;
2025-04-13 10:10:29 +00:00
ei.sampleName = workSheet->cellAt(index++, 2)->value().toString();
2025-04-12 13:02:37 +00:00
ei.sampleWeight = workSheet->cellAt(index++, 2)->value().toString();
2025-04-14 09:11:01 +00:00
index++; // skip crucible weight.
2025-04-12 13:02:37 +00:00
ei.date = workSheet->cellAt(index++, 2)->value().toString();
2025-04-14 09:11:01 +00:00
ei.experimentor = workSheet->cellAt(index++, 2)->value().toString();
index++; // skip measure type.
2025-04-12 13:02:37 +00:00
ei.phaseSize = workSheet->cellAt(index++, 2)->value().toInt();
2025-04-13 10:10:29 +00:00
QVector<Global::PhaseTotalInfo> 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);
2025-04-12 13:02:37 +00:00
}
2025-04-13 10:10:29 +00:00
}
2025-04-12 13:02:37 +00:00
2025-04-13 10:10:29 +00:00
void XlsxHandler::readPhaseData(QXlsx::Worksheet *workSheet, int &startLineIndex,
Global::PhaseTotalInfo &phaseTotal)
{
2025-04-14 09:11:01 +00:00
// skip.# Time/min Temp/℃ Voltage/mW
2025-04-13 10:10:29 +00:00
startLineIndex++;
2025-04-14 09:11:01 +00:00
// skip.第一段
2025-04-13 10:10:29 +00:00
startLineIndex++;
2025-04-14 09:11:01 +00:00
phaseTotal.phase.cutoff_temp = workSheet->cellAt(startLineIndex++, 2)->value().toDouble();
phaseTotal.phase.temp_flow = workSheet->cellAt(startLineIndex++, 2)->value().toDouble();
2025-04-13 10:10:29 +00:00
phaseTotal.phase.constant_temp_time_min = (uint16_t)(workSheet->cellAt(startLineIndex++, 2)->value().toInt());
phaseTotal.phase.gas = static_cast<GasType>(workSheet->cellAt(startLineIndex++, 2)->value().toInt());
int dataSize = workSheet->cellAt(startLineIndex++, 2)->value().toInt();
for(int i = 0; i < dataSize; i++)
{
Global::ExperimentData data;
2025-04-14 09:11:01 +00:00
data.runTime = workSheet->cellAt(startLineIndex, 2)->value().toDouble();
data.sampleTemp = workSheet->cellAt(startLineIndex, 3)->value().toDouble();
data.dsc = workSheet->cellAt(startLineIndex, 4)->value().toDouble();
2025-04-13 10:10:29 +00:00
phaseTotal.dataVtr.push_back(data);
2025-04-14 09:11:01 +00:00
startLineIndex++;
2025-04-13 10:10:29 +00:00
}
2025-04-12 13:02:37 +00:00
}
2025-04-13 10:10:29 +00:00
void XlsxHandler::writeFile()
2025-04-12 13:02:37 +00:00
{
2025-04-14 09:11:01 +00:00
Global::ExperimentInfo& ei = Global::_experimentInfo;
2025-04-13 10:10:29 +00:00
QXlsx::Document xlsx;
xlsx.addSheet("Sheet1"); // 添加一个新的工作表
2025-04-14 09:11:01 +00:00
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++;
}
2025-04-13 10:10:29 +00:00
2025-04-12 13:02:37 +00:00
#if 0
2025-04-13 10:10:29 +00:00
// 创建一个新的 Excel 文档
QXlsx::Document xlsx;
// 检查数据是否为空
if (data.isEmpty()) {
qWarning() << "没有数据可写入";
return ;
}
// 遍历数据并写入单元格
for (int row = 0; row < data.size(); ++row) {
const QVector<QString>& 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 ;
2025-04-12 13:02:37 +00:00
#endif
}