diff --git a/Libs/Project/ExcelProjectReader.cpp b/Libs/Project/ExcelProjectReader.cpp index b0b833e002..3ec7a2eb62 100644 --- a/Libs/Project/ExcelProjectReader.cpp +++ b/Libs/Project/ExcelProjectReader.cpp @@ -32,7 +32,8 @@ class ExcelProjectReader::Container { auto rows = ws.rows(false); auto headers = rows[0]; - for (int i = ws.lowest_row(); i < ws.highest_row(); i++) { + int highest_row = ws.highest_row(); + for (int i = ws.lowest_row(); i < highest_row; i++) { StringMap map; bool empty = true; for (int h = 0; h < headers.length(); h++) { diff --git a/Libs/Project/ExcelProjectWriter.cpp b/Libs/Project/ExcelProjectWriter.cpp index 255f4bdc8b..aa70aacb29 100644 --- a/Libs/Project/ExcelProjectWriter.cpp +++ b/Libs/Project/ExcelProjectWriter.cpp @@ -1,6 +1,7 @@ #include "ExcelProjectWriter.h" #include + #include #include @@ -28,8 +29,8 @@ static int get_index_for_column(xlnt::worksheet& ws, const std::string& name) { } //--------------------------------------------------------------------------- -static void set_value(xlnt::worksheet& ws, int column, int subject_id, const std::string& value) { - ws.cell(xlnt::cell_reference(column, subject_id)).value(value); +static void set_value(xlnt::worksheet& ws, int column, int row, const std::string& value) { + ws.cell(xlnt::cell_reference(column, row)).value(value); } //--------------------------------------------------------------------------- @@ -38,18 +39,31 @@ static void set_value(xlnt::worksheet& ws, const std::string& column_name, int s set_value(ws, column_index, subject_id + 2, value); // +1 for header, +1 for 1-indexed } +//--------------------------------------------------------------------------- +static void set_subject_value(xlnt::worksheet& ws, int column_index, int subject_id, const std::string& value) { + set_value(ws, column_index, subject_id + 2, value); // +1 for header, +1 for 1-indexed +} + //--------------------------------------------------------------------------- static void store_subjects(Project& project, xlnt::workbook& wb) { xlnt::worksheet ws = wb.sheet_by_index(0); ws.title("data"); + // cache column indices for performance, get_index_for_column can be expensive + std::map column_map; + auto subjects = project.get_subjects(); for (int i = 0; i < subjects.size(); i++) { auto subject = subjects[i]; auto map = ProjectUtils::convert_subject_to_map(&project, subject.get()); for (auto& [key, value] : map) { - set_value(ws, key, i, value); + if (column_map.find(key) == column_map.end()) { + int column_index = get_index_for_column(ws, key); + column_map[key] = column_index; + } + + set_subject_value(ws, column_map[key], i, value); } } }