diff --git a/source/detail/serialization/xlsx_consumer.cpp b/source/detail/serialization/xlsx_consumer.cpp index dc50106cb..0b24a76d5 100644 --- a/source/detail/serialization/xlsx_consumer.cpp +++ b/source/detail/serialization/xlsx_consumer.cpp @@ -267,7 +267,7 @@ xlnt::detail::Cell parse_cell(xlnt::row_t row_arg, xml::parser *parser, std::uno case xml::parser::end_attribute: case xml::parser::eof: default: { - throw xlnt::exception("unexcpected XML parsing event"); + throw xlnt::exception("unexpected XML parsing event"); } } // Prevents unhandled exceptions from being triggered. @@ -344,7 +344,7 @@ std::pair parse_row(xml::parser *parser, xlnt::detail case xml::parser::end_attribute: case xml::parser::eof: default: { - throw xlnt::exception("unexcpected XML parsing event"); + throw xlnt::exception("unexpected XML parsing event"); } } } @@ -382,7 +382,7 @@ Sheet_Data parse_sheet_data(xml::parser *parser, xlnt::detail::number_serialiser case xml::parser::end_attribute: case xml::parser::eof: default: { - throw xlnt::exception("unexcpected XML parsing event"); + throw xlnt::exception("unexpected XML parsing event"); } } } @@ -2317,7 +2317,12 @@ void xlsx_consumer::read_stylesheet() if (current_style_element == qn("spreadsheetml", "borders")) { auto &borders = stylesheet.borders; - auto count = parser().attribute("count"); + optional count; + if (parser().attribute_present("count")) + { + count = parser().attribute("count"); + borders.reserve(count.get()); + } while (in_element(qn("spreadsheetml", "borders"))) { @@ -2370,15 +2375,22 @@ void xlsx_consumer::read_stylesheet() expect_end_element(qn("spreadsheetml", "border")); } - if (count != borders.size()) +#ifdef THROW_ON_INVALID_XML + if (count.is_set() && count != borders.size()) { throw xlnt::exception("border counts don't match"); } +#endif } else if (current_style_element == qn("spreadsheetml", "fills")) { auto &fills = stylesheet.fills; - auto count = parser().attribute("count"); + optional count; + if (parser().attribute_present("count")) + { + count = parser().attribute("count"); + fills.reserve(count.get()); + } while (in_element(qn("spreadsheetml", "fills"))) { @@ -2455,15 +2467,22 @@ void xlsx_consumer::read_stylesheet() expect_end_element(qn("spreadsheetml", "fill")); } - if (count != fills.size()) +#ifdef THROW_ON_INVALID_XML + if (count.is_set() && count != fills.size()) { throw xlnt::exception("counts don't match"); } +#endif } else if (current_style_element == qn("spreadsheetml", "fonts")) { auto &fonts = stylesheet.fonts; - auto count = parser().attribute("count", 0); + optional count; + if (parser().attribute_present("count")) + { + count = parser().attribute("count"); + fonts.reserve(count.get()); + } if (parser().attribute_present(qn("x14ac", "knownFonts"))) { @@ -2598,15 +2617,22 @@ void xlsx_consumer::read_stylesheet() expect_end_element(qn("spreadsheetml", "font")); } - if (count != stylesheet.fonts.size()) +#ifdef THROW_ON_INVALID_XML + if (count.is_set() && count != stylesheet.fonts.size()) { - // throw xlnt::exception("counts don't match"); + throw xlnt::exception("counts don't match"); } +#endif } else if (current_style_element == qn("spreadsheetml", "numFmts")) { auto &number_formats = stylesheet.number_formats; - auto count = parser().attribute("count"); + optional count; + if (parser().attribute_present("count")) + { + count = parser().attribute("count"); + number_formats.reserve(count.get()); + } while (in_element(qn("spreadsheetml", "numFmts"))) { @@ -2629,14 +2655,21 @@ void xlsx_consumer::read_stylesheet() number_formats.push_back(nf); } - if (count != number_formats.size()) +#ifdef THROW_ON_INVALID_XML + if (count.is_set() && count != number_formats.size()) { throw xlnt::exception("counts don't match"); } +#endif } else if (current_style_element == qn("spreadsheetml", "cellStyles")) { - auto count = parser().attribute("count"); + optional count; + if (parser().attribute_present("count")) + { + count = parser().attribute("count"); + styles.reserve(count.get()); + } while (in_element(qn("spreadsheetml", "cellStyles"))) { @@ -2665,16 +2698,30 @@ void xlsx_consumer::read_stylesheet() expect_end_element(qn("spreadsheetml", "cellStyle")); } - if (count != styles.size()) +#ifdef THROW_ON_INVALID_XML + if (count.is_set() && count != styles.size()) { throw xlnt::exception("counts don't match"); } +#endif } else if (current_style_element == qn("spreadsheetml", "cellStyleXfs") || current_style_element == qn("spreadsheetml", "cellXfs")) { auto in_style_records = current_style_element.name() == "cellStyleXfs"; - auto count = parser().attribute("count"); + optional count; + if (parser().attribute_present("count")) + { + count = parser().attribute("count"); + if (in_style_records) + { + style_records.reserve(count.get()); + } + else + { + format_records.reserve(count.get()); + } + } while (in_element(current_style_element)) { @@ -2803,15 +2850,21 @@ void xlsx_consumer::read_stylesheet() expect_end_element(qn("spreadsheetml", "xf")); } - if ((in_style_records && count != style_records.size()) - || (!in_style_records && count != format_records.size())) +#ifdef THROW_ON_INVALID_XML + if (count.is_set() && ((in_style_records && count != style_records.size()) + || (!in_style_records && count != format_records.size()))) { throw xlnt::exception("counts don't match"); } +#endif } else if (current_style_element == qn("spreadsheetml", "dxfs")) { - auto count = parser().attribute("count"); + optional count; + if (parser().attribute_present("count")) + { + count = parser().attribute("count"); + } std::size_t processed = 0; while (in_element(current_style_element)) @@ -2822,17 +2875,23 @@ void xlsx_consumer::read_stylesheet() ++processed; } - if (count != processed) +#ifdef THROW_ON_INVALID_XML + if (count.is_set() && count != processed) { throw xlnt::exception("counts don't match"); } +#endif } else if (current_style_element == qn("spreadsheetml", "tableStyles")) { skip_attribute("defaultTableStyle"); skip_attribute("defaultPivotStyle"); - auto count = parser().attribute("count"); + optional count; + if (parser().attribute_present("count")) + { + count = parser().attribute("count"); + } std::size_t processed = 0; while (in_element(qn("spreadsheetml", "tableStyles"))) @@ -2843,10 +2902,12 @@ void xlsx_consumer::read_stylesheet() ++processed; } - if (count != processed) +#ifdef THROW_ON_INVALID_XML + if (count.is_set() && count != processed) { throw xlnt::exception("counts don't match"); } +#endif } else if (current_style_element == qn("spreadsheetml", "extLst")) {