From 617f7a2525fe20133b77241162e5ea5ed48222af Mon Sep 17 00:00:00 2001 From: Thomas Fussell Date: Wed, 21 Mar 2018 09:03:37 -0400 Subject: [PATCH] improve hyperlinks and style round tripping --- include/xlnt/styles/font.hpp | 16 +- source/cell/cell.cpp | 22 +- source/detail/implementations/stylesheet.hpp | 10 +- source/detail/serialization/xlsx_consumer.cpp | 99 +++++++-- source/detail/serialization/xlsx_producer.cpp | 202 ++++++++++++------ source/styles/font.cpp | 119 ++++------- source/workbook/workbook.cpp | 15 +- source/worksheet/worksheet.cpp | 3 +- .../data/10_comments_hyperlinks_formulae.xlsx | Bin 39701 -> 33351 bytes tests/data/13_custom_heights_widths.xlsx | Bin 17332 -> 10758 bytes tests/workbook/serialization_test_suite.hpp | 116 +++++++--- 11 files changed, 379 insertions(+), 223 deletions(-) diff --git a/include/xlnt/styles/font.hpp b/include/xlnt/styles/font.hpp index ff421c25..b428ae8a 100644 --- a/include/xlnt/styles/font.hpp +++ b/include/xlnt/styles/font.hpp @@ -68,12 +68,22 @@ public: bool bold() const; /// - /// Sets the bold state of the font to bold and returns a reference to the font. + /// Sets the vertical alignment of the font to subscript and returns a reference to the font. /// - font &superscript(bool superscript); + font &subscript(bool value); /// - /// Returns true if this font has a superscript applied. + /// Returns true if this font has a vertical alignment of subscript. + /// + bool subscript() const; + + /// + /// Sets the vertical alignment of the font to superscript and returns a reference to the font. + /// + font &superscript(bool value); + + /// + /// Returns true if this font has a vertical alignment of superscript. /// bool superscript() const; diff --git a/source/cell/cell.cpp b/source/cell/cell.cpp index 13761c0d..0c89c93f 100644 --- a/source/cell/cell.cpp +++ b/source/cell/cell.cpp @@ -367,10 +367,14 @@ hyperlink cell::hyperlink() const return xlnt::hyperlink(&d_->hyperlink_.get()); } -void cell::hyperlink(const std::string &hyperlink) +void cell::hyperlink(const std::string &url) { - if (hyperlink.length() == 0 - || std::find(hyperlink.begin(), hyperlink.end(), ':') == hyperlink.end()) + hyperlink(url, url); +} + +void cell::hyperlink(const std::string &url, const std::string &display) +{ + if (url.empty() || std::find(url.begin(), url.end(), ':') == url.end() || display.empty()) { throw invalid_parameter(); } @@ -384,7 +388,7 @@ void cell::hyperlink(const std::string &hyperlink) // check for existing relationships for (const auto &rel : manifest.relationships(ws.path(), relationship_type::hyperlink)) { - if (rel.target().path().string() == hyperlink) + if (rel.target().path().string() == url) { d_->hyperlink_.get().relationship = rel; existing = true; @@ -397,20 +401,14 @@ void cell::hyperlink(const std::string &hyperlink) auto rel_id = manifest.register_relationship( uri(ws.path().string()), relationship_type::hyperlink, - uri(hyperlink), + uri(url), target_mode::external); // TODO: make manifest::register_relationship return the created relationship instead of rel id d_->hyperlink_.get().relationship = manifest.relationship(ws.path(), rel_id); } - value(hyperlink); -} - -void cell::hyperlink(const std::string &url, const std::string &display) -{ - hyperlink(url); - d_->hyperlink_.get().display = display; value(display); + d_->hyperlink_.get().display = display; } void cell::hyperlink(xlnt::cell target) diff --git a/source/detail/implementations/stylesheet.hpp b/source/detail/implementations/stylesheet.hpp index f0b2a48f..884f041d 100644 --- a/source/detail/implementations/stylesheet.hpp +++ b/source/detail/implementations/stylesheet.hpp @@ -401,23 +401,21 @@ struct stylesheet { auto iter = format_impls.begin(); bool added = false; + pattern.references = 0; auto id = find_or_add(format_impls, pattern, &added); std::advance(iter, static_cast::difference_type>(id)); auto &result = *iter; - if (added) - { - result.references = 0; - } - result.parent = this; result.id = id; result.references++; if (id != pattern.id) { - pattern.references -= pattern.references > 0 ? 1 : 0; + iter = format_impls.begin(); + std::advance(iter, static_cast::difference_type>(pattern.id)); + iter->references -= iter->references > 0 ? 1 : 0; garbage_collect(); } diff --git a/source/detail/serialization/xlsx_consumer.cpp b/source/detail/serialization/xlsx_consumer.cpp index 6288d0de..4d7f5073 100644 --- a/source/detail/serialization/xlsx_consumer.cpp +++ b/source/detail/serialization/xlsx_consumer.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -273,8 +274,8 @@ cell xlsx_consumer::read_cell() has_shared_formula = parser().attribute("t") == "shared"; } - skip_attributes( - { "aca", "ref", "dt2D", "dtr", "del1", "del2", "r1", "r2", "ca", "si", "bx" }); + skip_attributes({ "aca", "ref", "dt2D", "dtr", "del1", + "del2", "r1", "r2", "ca", "si", "bx" }); formula_value_string = read_text(); } @@ -441,14 +442,21 @@ std::string xlsx_consumer::read_worksheet_begin(const std::string &rel_id) new_view.default_grid_color(is_true(parser().attribute("defaultGridColor"))); } - if (parser().attribute_present("view") && parser().attribute("view") != "normal") + if (parser().attribute_present("view") + && parser().attribute("view") != "normal") { new_view.type(parser().attribute("view") == "pageBreakPreview" ? sheet_view_type::page_break_preview : sheet_view_type::page_layout); } - skip_attributes({ "windowProtection", "showFormulas", "showRowColHeaders", "showZeros", "rightToLeft", "tabSelected", "showRuler", "showOutlineSymbols", "showWhiteSpace", + if (parser().attribute_present("tabSelected") + && is_true(parser().attribute("tabSelected"))) + { + target_.d_->view_.get().active_tab = ws.id() - 1; + } + + skip_attributes({ "windowProtection", "showFormulas", "showRowColHeaders", "showZeros", "rightToLeft", "showRuler", "showOutlineSymbols", "showWhiteSpace", "view", "topLeftCell", "colorId", "zoomScale", "zoomScaleNormal", "zoomScaleSheetLayoutView", "zoomScalePageLayoutView" }); @@ -841,6 +849,7 @@ worksheet xlsx_consumer::read_worksheet_end(const std::string &rel_id) { while (in_element(qn("spreadsheetml", "hyperlinks"))) { + // CT_Hyperlink expect_start_element(qn("spreadsheetml", "hyperlink"), xml::content::simple); auto cell = ws.cell(parser().attribute("ref")); @@ -853,11 +862,39 @@ worksheet xlsx_consumer::read_worksheet_end(const std::string &rel_id) if (hyperlink_rel != hyperlinks.end()) { - cell.hyperlink(hyperlink_rel->target().path().string()); + auto url = hyperlink_rel->target().path().string(); + + if (cell.has_value()) + { + cell.hyperlink(url, cell.value()); + } + else + { + cell.hyperlink(url); + } } } + else if (parser().attribute_present("location")) + { + auto hyperlink = hyperlink_impl(); + + auto location = parser().attribute("location"); + hyperlink.relationship = relationship("", relationship_type::hyperlink, + uri(""), uri(location), target_mode::internal); + + if (parser().attribute_present("display")) + { + hyperlink.display = parser().attribute("display"); + } + + if (parser().attribute_present("tooltip")) + { + hyperlink.tooltip = parser().attribute("tooltip"); + } + + cell.d_->hyperlink_ = hyperlink; + } - skip_attributes({ "location", "tooltip", "display" }); expect_end_element(qn("spreadsheetml", "hyperlink")); } } @@ -1500,8 +1537,8 @@ void xlsx_consumer::read_office_document(const std::string &content_type) // CT_ while (in_element(qn("workbook", "bookViews"))) { expect_start_element(qn("workbook", "workbookView"), xml::content::simple); - skip_attributes({"activeTab", "firstSheet", - "showHorizontalScroll", "showSheetTabs", "showVerticalScroll"}); + skip_attributes({"firstSheet", "showHorizontalScroll", + "showSheetTabs", "showVerticalScroll"}); workbook_view view; @@ -1530,6 +1567,11 @@ void xlsx_consumer::read_office_document(const std::string &content_type) // CT_ view.tab_ratio = parser().attribute("tabRatio"); } + if (parser().attribute_present("activeTab")) + { + view.active_tab = parser().attribute("activeTab"); + } + target_.view(view); skip_attributes(); @@ -1923,7 +1965,11 @@ void xlsx_consumer::read_stylesheet() { auto &fonts = stylesheet.fonts; auto count = parser().attribute("count"); - skip_attributes({qn("x14ac", "knownFonts")}); + + if (parser().attribute_present(qn("x14ac", "knownFonts"))) + { + target_.enable_known_fonts(); + } while (in_element(qn("spreadsheetml", "fonts"))) { @@ -1969,7 +2015,16 @@ void xlsx_consumer::read_stylesheet() } else if (font_property_element == qn("spreadsheetml", "vertAlign")) { - new_font.superscript(parser().attribute("val") == "superscript"); + auto vert_align = parser().attribute("val"); + + if (vert_align == "superscript") + { + new_font.superscript(true); + } + else if (vert_align == "subscript") + { + new_font.subscript(true); + } } else if (font_property_element == qn("spreadsheetml", "strike")) { @@ -2130,33 +2185,33 @@ void xlsx_consumer::read_stylesheet() ? format_records.emplace(format_records.end()) : style_records.emplace(style_records.end())); - record.first.border_applied = parser().attribute_present("applyBorder") - && is_true(parser().attribute("applyBorder")); + record.first.border_applied = !parser().attribute_present("applyBorder") + || is_true(parser().attribute("applyBorder")); record.first.border_id = parser().attribute_present("borderId") ? parser().attribute("borderId") : 0; - record.first.fill_applied = parser().attribute_present("applyFill") - && is_true(parser().attribute("applyFill")); + record.first.fill_applied = !parser().attribute_present("applyFill") + || is_true(parser().attribute("applyFill")); record.first.fill_id = parser().attribute_present("fillId") ? parser().attribute("fillId") : 0; - record.first.font_applied = parser().attribute_present("applyFont") - && is_true(parser().attribute("applyFont")); + record.first.font_applied = !parser().attribute_present("applyFont") + || is_true(parser().attribute("applyFont")); record.first.font_id = parser().attribute_present("fontId") ? parser().attribute("fontId") : 0; - record.first.number_format_applied = parser().attribute_present("applyNumberFormat") - && is_true(parser().attribute("applyNumberFormat")); + record.first.number_format_applied = !parser().attribute_present("applyNumberFormat") + || is_true(parser().attribute("applyNumberFormat")); record.first.number_format_id = parser().attribute_present("numFmtId") ? parser().attribute("numFmtId") : 0; auto apply_alignment_present = parser().attribute_present("applyAlignment"); - record.first.alignment_applied = apply_alignment_present - && is_true(parser().attribute("applyAlignment")); + record.first.alignment_applied = !apply_alignment_present + || is_true(parser().attribute("applyAlignment")); auto apply_protection_present = parser().attribute_present("applyProtection"); - record.first.protection_applied = apply_protection_present - && is_true(parser().attribute("applyProtection")); + record.first.protection_applied = !apply_protection_present + || is_true(parser().attribute("applyProtection")); record.first.pivot_button_ = parser().attribute_present("pivotButton") && is_true(parser().attribute("pivotButton")); diff --git a/source/detail/serialization/xlsx_producer.cpp b/source/detail/serialization/xlsx_producer.cpp index e3c3a242..513d45bb 100644 --- a/source/detail/serialization/xlsx_producer.cpp +++ b/source/detail/serialization/xlsx_producer.cpp @@ -500,7 +500,7 @@ void xlsx_producer::write_workbook(const relationship &rel) const auto &view = source_.view(); - if (view.active_tab.is_set()) + if (view.active_tab.is_set() && view.active_tab.get() != std::size_t(0)) { write_attribute("activeTab", view.active_tab.get()); } @@ -932,34 +932,50 @@ void xlsx_producer::write_font(const font &f) if (f.bold()) { write_start_element(xmlns, "b"); - write_attribute("val", write_bool(true)); write_end_element(xmlns, "b"); } if (f.italic()) { write_start_element(xmlns, "i"); - write_attribute("val", write_bool(true)); write_end_element(xmlns, "i"); } if (f.underlined()) { write_start_element(xmlns, "u"); - write_attribute("val", f.underline()); + if (f.underline() != font::underline_style::single) + { + write_attribute("val", f.underline()); + } write_end_element(xmlns, "u"); } if (f.strikethrough()) { write_start_element(xmlns, "strike"); - write_attribute("val", write_bool(true)); write_end_element(xmlns, "strike"); } - write_start_element(xmlns, "sz"); - write_attribute("val", f.size()); - write_end_element(xmlns, "sz"); + if (f.superscript()) + { + write_start_element(xmlns, "vertAlign"); + write_attribute("val", "superscript"); + write_end_element(xmlns, "vertAlign"); + } + else if (f.subscript()) + { + write_start_element(xmlns, "vertAlign"); + write_attribute("val", "subscript"); + write_end_element(xmlns, "vertAlign"); + } + + if (f.has_size()) + { + write_start_element(xmlns, "sz"); + write_attribute("val", f.size()); + write_end_element(xmlns, "sz"); + } if (f.has_color()) { @@ -968,9 +984,12 @@ void xlsx_producer::write_font(const font &f) write_end_element(xmlns, "color"); } - write_start_element(xmlns, "name"); - write_attribute("val", f.name()); - write_end_element(xmlns, "name"); + if (f.has_name()) + { + write_start_element(xmlns, "name"); + write_attribute("val", f.name()); + write_end_element(xmlns, "name"); + } if (f.has_family()) { @@ -1255,39 +1274,61 @@ void xlsx_producer::write_styles(const relationship & /*rel*/) const auto ¤t_style_impl = stylesheet.style_impls.at(current_style_name); write_start_element(xmlns, "xf"); - write_attribute("numFmtId", current_style_impl.number_format_id.get()); - write_attribute("fontId", current_style_impl.font_id.get()); - write_attribute("fillId", current_style_impl.fill_id.get()); - write_attribute("borderId", current_style_impl.border_id.get()); - if (current_style_impl.number_format_applied) + if (current_style_impl.number_format_id.is_set()) { - write_attribute("applyNumberFormat", write_bool(true)); + write_attribute("numFmtId", current_style_impl.number_format_id.get()); } - if (current_style_impl.fill_applied) + if (current_style_impl.font_id.is_set()) { - write_attribute("applyFill", write_bool(true)); + write_attribute("fontId", current_style_impl.font_id.get()); } - if (current_style_impl.font_applied) + if (current_style_impl.fill_id.is_set()) { - write_attribute("applyFont", write_bool(true)); + write_attribute("fillId", current_style_impl.fill_id.get()); } - if (current_style_impl.border_applied) + if (current_style_impl.border_id.is_set()) { - write_attribute("applyBorder", write_bool(true)); + write_attribute("borderId", current_style_impl.border_id.get()); } - if (current_style_impl.alignment_applied) + if (current_style_impl.number_format_id.is_set() + && !current_style_impl.number_format_applied) { - write_attribute("applyAlignment", write_bool(true)); + write_attribute("applyNumberFormat", write_bool(false)); } - if (current_style_impl.protection_applied) + if (current_style_impl.fill_id.is_set() + && !current_style_impl.fill_applied) { - write_attribute("applyProtection", write_bool(true)); + write_attribute("applyFill", write_bool(false)); + } + + if (current_style_impl.font_id.is_set() + && !current_style_impl.font_applied) + { + write_attribute("applyFont", write_bool(false)); + } + + if (current_style_impl.border_id.is_set() + && !current_style_impl.border_applied) + { + write_attribute("applyBorder", write_bool(false)); + } + + if (current_style_impl.alignment_id.is_set() + && !current_style_impl.alignment_applied) + { + write_attribute("applyAlignment", write_bool(false)); + } + + if (current_style_impl.protection_id.is_set() + && !current_style_impl.protection_applied) + { + write_attribute("applyProtection", write_bool(false)); } if (current_style_impl.pivot_button_) @@ -1371,34 +1412,40 @@ void xlsx_producer::write_styles(const relationship & /*rel*/) write_attribute("borderId", current_format_impl.border_id.get()); - if (current_format_impl.number_format_applied) + if (current_format_impl.number_format_id.is_set() + && !current_format_impl.number_format_applied) { - write_attribute("applyNumberFormat", write_bool(true)); + write_attribute("applyNumberFormat", write_bool(false)); } - if (current_format_impl.fill_applied) + if (current_format_impl.fill_id.is_set() + && !current_format_impl.fill_applied) { - write_attribute("applyFill", write_bool(true)); + write_attribute("applyFill", write_bool(false)); } - if (current_format_impl.font_applied) + if (current_format_impl.font_id.is_set() + && !current_format_impl.font_applied) { - write_attribute("applyFont", write_bool(true)); + write_attribute("applyFont", write_bool(false)); } - if (current_format_impl.border_applied) + if (current_format_impl.border_id.is_set() + && !current_format_impl.border_applied) { - write_attribute("applyBorder", write_bool(true)); + write_attribute("applyBorder", write_bool(false)); } - if (current_format_impl.alignment_applied) + if (current_format_impl.alignment_id.is_set() + && !current_format_impl.alignment_applied) { - write_attribute("applyAlignment", write_bool(true)); + write_attribute("applyAlignment", write_bool(false)); } - if (current_format_impl.protection_applied) + if (current_format_impl.protection_id.is_set() + && !current_format_impl.protection_applied) { - write_attribute("applyProtection", write_bool(true)); + write_attribute("applyProtection", write_bool(false)); } if (current_format_impl.pivot_button_) @@ -2129,9 +2176,15 @@ void xlsx_producer::write_worksheet(const relationship &rel) write_start_element(xmlns, "sheetViews"); write_start_element(xmlns, "sheetView"); + const auto wb_view = source_.view(); const auto view = ws.view(); - write_attribute("tabSelected", write_bool(view.id() == 0)); + if ((wb_view.active_tab.is_set() && (ws.id() - 1) == wb_view.active_tab.get()) + || (!wb_view.active_tab.is_set() && ws.id() == 1)) + { + write_attribute("tabSelected", write_bool(true)); + } + write_attribute("workbookViewId", view.id()); if (view.type() != sheet_view_type::normal) @@ -2272,26 +2325,39 @@ void xlsx_producer::write_worksheet(const relationship &rel) write_start_element(xmlns, "sheetData"); auto first_row = ws.lowest_row_or_props(); auto last_row = ws.highest_row_or_props(); + auto first_block_column = constants::max_column(); + auto last_block_column = constants::min_column(); for (auto row = first_row; row <= last_row; ++row) { - auto first_column = constants::max_column(); - auto last_column = constants::min_column(); - bool any_non_null = false; + auto first_check_row = row; + auto last_check_row = row; + auto first_row_in_block = row == first_row || row % 16 == 1; - for (auto column = dimension.top_left().column(); column <= dimension.bottom_right().column(); ++column) + // See note for CT_Row, span attribute about block optimization + if (first_row_in_block) { - if (!ws.has_cell(cell_reference(column, row))) continue; + first_check_row = first_row; + // round up to the next multiple of 16 + last_check_row = (((first_row - 1) / 16) + 1) * 16; + } - auto cell = ws.cell(cell_reference(column, row)); - - first_column = std::min(first_column, cell.column()); - last_column = std::max(last_column, cell.column()); - - if (!cell.garbage_collectible()) + for (auto check_row = first_check_row; check_row <= last_check_row; ++check_row) + { + for (auto column = dimension.top_left().column(); column <= dimension.bottom_right().column(); ++column) { - any_non_null = true; + if (!ws.has_cell(cell_reference(column, row))) continue; + auto cell = ws.cell(cell_reference(column, row)); + if (cell.garbage_collectible()) continue; + + first_block_column = std::min(first_block_column, cell.column()); + last_block_column = std::max(last_block_column, cell.column()); + + if (row == check_row) + { + any_non_null = true; + } } } @@ -2300,26 +2366,14 @@ void xlsx_producer::write_worksheet(const relationship &rel) write_start_element(xmlns, "row"); write_attribute("r", row); - if (any_non_null) - { - auto span_string = std::to_string(first_column.index) + ":" + std::to_string(last_column.index); - write_attribute("spans", span_string); - } + auto span_string = std::to_string(first_block_column.index) + ":" + + std::to_string(last_block_column.index); + write_attribute("spans", span_string); if (ws.has_row_properties(row)) { const auto &props = ws.row_properties(row); - if (props.custom_height) - { - write_attribute("customHeight", write_bool(true)); - } - - if (props.dy_descent.is_set()) - { - write_attribute(xml::qname(xmlns_x14ac, "dyDescent"), props.dy_descent.get()); - } - if (props.height.is_set()) { auto height = props.height.get(); @@ -2338,6 +2392,16 @@ void xlsx_producer::write_worksheet(const relationship &rel) { write_attribute("hidden", write_bool(true)); } + + if (props.custom_height) + { + write_attribute("customHeight", write_bool(true)); + } + + if (props.dy_descent.is_set()) + { + write_attribute(xml::qname(xmlns_x14ac, "dyDescent"), props.dy_descent.get()); + } } if (any_non_null) @@ -2394,8 +2458,8 @@ void xlsx_producer::write_worksheet(const relationship &rel) write_attribute("t", "inlineStr"); break; - case cell::type::number: - write_attribute("t", "n"); + case cell::type::number: // default, don't write it + //write_attribute("t", "n"); break; case cell::type::shared_string: diff --git a/source/styles/font.cpp b/source/styles/font.cpp index b36369c1..0c5e6982 100644 --- a/source/styles/font.cpp +++ b/source/styles/font.cpp @@ -45,9 +45,9 @@ bool font::bold() const return bold_; } -font &font::superscript(bool superscript) +font &font::superscript(bool value) { - superscript_ = superscript; + superscript_ = value; return *this; } @@ -56,6 +56,17 @@ bool font::superscript() const return superscript_; } +font &font::subscript(bool value) +{ + subscript_ = value; + return *this; +} + +bool font::subscript() const +{ + return subscript_; +} + font &font::italic(bool italic) { italic_ = italic; @@ -181,6 +192,11 @@ font &font::charset(std::size_t charset) return *this; } +std::size_t font::charset() const +{ + return charset_.get(); +} + bool font::has_scheme() const { return scheme_.is_set(); @@ -209,79 +225,32 @@ std::string font::scheme() const bool font::operator==(const font &other) const { - if (bold() != other.bold()) - { - return false; - } - - if (has_color() != other.has_color()) - { - return false; - } - - if (has_color()) - { - if (color() != other.color()) - { - return false; - } - } - - if (has_family() != other.has_family()) - { - return false; - } - - if (has_family()) - { - if (family() != other.family()) - { - return false; - } - } - - if (italic() != other.italic()) - { - return false; - } - - if (name() != other.name()) - { - return false; - } - - if (has_scheme() != other.has_scheme()) - { - return false; - } - - if (has_scheme()) - { - if (scheme() != other.scheme()) - { - return false; - } - } - - if (std::fabs(size() - other.size()) != 0.0) - { - return false; - } - - if (strikethrough() != other.strikethrough()) - { - return false; - } - - if (superscript() != other.superscript()) - { - return false; - } - - if (underline() != other.underline()) - { - return false; - } + // name + if (has_name() != other.has_name()) return false; + if (has_name() && name() != other.name()) return false; + // size + if (has_size() != other.has_size()) return false; + if (has_size() && std::fabs(size() - other.size()) != 0.0) return false; + // family + if (has_family() != other.has_family()) return false; + if (has_family() && family() != other.family()) return false; + // scheme + if (has_scheme() != other.has_scheme()) return false; + if (has_scheme() && scheme() != other.scheme()) return false; + // color + if (has_color() != other.has_color()) return false; + if (has_color() && color() != other.color()) return false; + // charset + if (has_charset()!= other.has_charset()) return false; + if (has_charset() && charset()!= other.charset()) return false; + // modifiers + if (bold() != other.bold()) return false; + if (italic() != other.italic()) return false; + if (strikethrough() != other.strikethrough()) return false; + if (superscript() != other.superscript()) return false; + if (subscript() != other.subscript()) return false; + if (underline() != other.underline()) return false; + if (shadow() != other.shadow()) return false; return true; } diff --git a/source/workbook/workbook.cpp b/source/workbook/workbook.cpp index 5773d74c..48f50518 100644 --- a/source/workbook/workbook.cpp +++ b/source/workbook/workbook.cpp @@ -408,6 +408,7 @@ workbook workbook::empty() wb.d_->file_version_ = file_version; xlnt::workbook_view wb_view; + wb_view.active_tab = 0; wb_view.x_window = 0; wb_view.y_window = 460; wb_view.window_width = 28800; @@ -462,13 +463,17 @@ workbook workbook::empty() .color(theme_color(1)); stylesheet.fonts.push_back(default_font); - wb.create_builtin_style(0); + wb.create_builtin_style(0) + .border(default_border, true) + .fill(default_fill, true) + .font(default_font, true) + .number_format(xlnt::number_format::general(), true); wb.create_format(true) - .border(default_border, false) - .fill(default_fill, false) - .font(default_font, false) - .number_format(xlnt::number_format::general(), false) + .border(default_border, true) + .fill(default_fill, true) + .font(default_font, true) + .number_format(xlnt::number_format::general(), true) .style("Normal"); xlnt::calculation_properties calc_props; diff --git a/source/worksheet/worksheet.cpp b/source/worksheet/worksheet.cpp index dea1125b..e1d83379 100644 --- a/source/worksheet/worksheet.cpp +++ b/source/worksheet/worksheet.cpp @@ -608,7 +608,8 @@ column_t worksheet::highest_column_or_props() const range_reference worksheet::calculate_dimension() const { - return range_reference(lowest_column(), lowest_row(), highest_column(), highest_row()); + return range_reference(lowest_column(), lowest_row(), + highest_column(), highest_row_or_props()); } range worksheet::range(const std::string &reference_string) diff --git a/tests/data/10_comments_hyperlinks_formulae.xlsx b/tests/data/10_comments_hyperlinks_formulae.xlsx index 0e5a7f2e49b42c532003ea580f43987437212e9d..c989dc5feaad03f2ea2d4050ea5af5087301e021 100644 GIT binary patch literal 33351 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 ZSJ&T=!2z3cARr{bpB3P$-|Odp{|mL|h&uoP literal 39701 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%0DrhVw2k8 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 literal 17332 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 diff --git a/tests/workbook/serialization_test_suite.hpp b/tests/workbook/serialization_test_suite.hpp index c2dd48f8..dce7aa59 100644 --- a/tests/workbook/serialization_test_suite.hpp +++ b/tests/workbook/serialization_test_suite.hpp @@ -189,38 +189,56 @@ public: auto sheet1 = wb.active_sheet(); sheet1.format_properties(format_properties); - auto &view = sheet1.view(); auto selection = xlnt::selection(); selection.active_cell("C1"); selection.sqref("C1"); - view.add_selection(selection); + sheet1.view().add_selection(selection); + // comments auto comment_font = xlnt::font() .bold(true) .size(10) .color(xlnt::indexed_color(81)) .name("Calibri"); + sheet1.cell("A1").value("Sheet1!A1"); + sheet1.cell("A1").comment("Sheet1 comment", comment_font, "Microsoft Office User"); + + sheet1.cell("A2").value("Sheet1!A2"); + sheet1.cell("A2").comment("Sheet1 comment2", comment_font, "Microsoft Office User"); + + // hyperlinks auto hyperlink_font = xlnt::font() .size(12) .color(xlnt::theme_color(10)) .name("Calibri") + .family(2) + .scheme("minor") .underline(xlnt::font::underline_style::single); + auto hyperlink_style = wb.create_builtin_style(8); + hyperlink_style.font(hyperlink_font, true); + hyperlink_style.number_format(hyperlink_style.number_format(), false); + hyperlink_style.fill(hyperlink_style.fill(), false); + hyperlink_style.border(hyperlink_style.border(), false); + auto hyperlink_format = wb.create_format(); + hyperlink_format.font(hyperlink_font, true); + hyperlink_format.number_format(hyperlink_format.number_format(), true); + hyperlink_format.fill(hyperlink_format.fill(), true); + hyperlink_format.border(hyperlink_format.border(), true); + hyperlink_format.style(hyperlink_style); sheet1.cell("A4").hyperlink("https://microsoft.com/", "hyperlink1"); - sheet1.cell("A4").font(hyperlink_font); + sheet1.cell("A4").format(hyperlink_format); + sheet1.cell("A5").hyperlink("https://google.com/"); - sheet1.cell("A5").font(hyperlink_font); + sheet1.cell("A5").format(hyperlink_format); + sheet1.cell("A6").hyperlink(sheet1.cell("A1")); - sheet1.cell("A6").font(hyperlink_font); + sheet1.cell("A6").format(hyperlink_format); + sheet1.cell("A7").hyperlink("mailto:invalid@example.com?subject=important"); - sheet1.cell("A7").font(hyperlink_font); - - sheet1.cell("A1").value("Sheet1!A1"); - sheet1.cell("A1").comment("Sheet1 comment", comment_font, "Microsoft Office User"); - - sheet1.cell("A2").value("Sheet1!A2"); - sheet1.cell("A2").comment("Sheet1 comment2", comment_font, "Microsoft Office User"); + sheet1.cell("A7").format(hyperlink_format); + // formulae sheet1.cell("C1").formula("=CONCATENATE(C2,C3)"); sheet1.cell("C2").value("a"); sheet1.cell("C3").value("b"); @@ -232,20 +250,36 @@ public: auto sheet2 = wb.create_sheet(); sheet2.format_properties(format_properties); + sheet2.add_view(xlnt::sheet_view()); + sheet2.view().add_selection(selection); + // comments + sheet2.cell("A1").value("Sheet2!A1"); + sheet2.cell("A1").comment("Sheet2 comment", comment_font, "Microsoft Office User"); + + sheet2.cell("A2").value("Sheet2!A2"); + sheet2.cell("A2").comment("Sheet2 comment2", comment_font, "Microsoft Office User"); + + // hyperlinks sheet2.cell("A4").hyperlink("https://apple.com/", "hyperlink2"); - sheet2.cell("A4").font(hyperlink_font); - - sheet2.cell("A1").value("Sheet2!A1"); - sheet2.cell("A1").comment("Sheet2 comment", comment_font, "Microsoft Office User"); - - sheet2.cell("A2").value("Sheet2!A2"); - sheet2.cell("A2").comment("Sheet2 comment2", comment_font, "Microsoft Office User"); + sheet2.cell("A4").format(hyperlink_format); + // formulae sheet2.cell("C1").formula("=C2*C3"); sheet2.cell("C2").value(2); sheet2.cell("C3").value(3); + for (auto i = 1; i <= 4; ++i) + { + sheet2.row_properties(i).dy_descent = 0.2; + } + + wb.default_slicer_style("SlicerStyleLight1"); + wb.enable_known_fonts(); + + wb.core_property(xlnt::core_property::created, "2018-03-18T20:53:30Z"); + wb.core_property(xlnt::core_property::modified, "2018-03-18T20:59:53Z"); + const auto path = path_helper::test_file("10_comments_hyperlinks_formulae.xlsx"); xlnt_assert(workbook_matches_file(wb, path)); } @@ -372,14 +406,12 @@ public: wb.load(path); auto ws1 = wb.sheet_by_index(0); - xlnt_assert_equals(ws1.cell("C1").value(), "ab"); xlnt_assert(ws1.cell("C1").has_formula()); xlnt_assert_equals(ws1.cell("C1").formula(), "CONCATENATE(C2,C3)"); xlnt_assert_equals(ws1.cell("C2").value(), "a"); xlnt_assert_equals(ws1.cell("C3").value(), "b"); auto ws2 = wb.sheet_by_index(1); - xlnt_assert_equals(ws2.cell("C1").value(), 6); xlnt_assert(ws2.cell("C1").has_formula()); xlnt_assert_equals(ws2.cell("C1").formula(), "C2*C3"); xlnt_assert_equals(ws2.cell("C2").value(), 2); @@ -448,28 +480,49 @@ public: xlnt_assert(!ws.row_properties(4).height.is_set()); xlnt_assert_equals(ws.row_properties(5).height.get(), 100); - xlnt_assert_delta(ws.column_properties("A").width.get(), 15.949776785714286, 1.0E-9); + auto width = ((16.0 * 7) - 5) / 7; + + xlnt_assert_delta(ws.column_properties("A").width.get(), width, 1.0E-9); xlnt_assert(!ws.column_properties("B").width.is_set()); - xlnt_assert_delta(ws.column_properties("C").width.get(), 15.949776785714286, 1.0E-9); + xlnt_assert_delta(ws.column_properties("C").width.get(), width, 1.0E-9); xlnt_assert(!ws.column_properties("D").width.is_set()); - xlnt_assert_delta(ws.column_properties("E").width.get(), 15.949776785714286, 1.0E-9); + xlnt_assert_delta(ws.column_properties("E").width.get(), width, 1.0E-9); } void test_write_custom_heights_widths() { xlnt::workbook wb; + + wb.core_property(xlnt::core_property::creator, "Microsoft Office User"); + wb.core_property(xlnt::core_property::last_modified_by, "Microsoft Office User"); + wb.core_property(xlnt::core_property::created, "2017-10-30T23:03:54Z"); + wb.core_property(xlnt::core_property::modified, "2017-10-30T23:08:31Z"); + wb.default_slicer_style("SlicerStyleLight1"); + wb.enable_known_fonts(); + auto ws = wb.active_sheet(); + auto sheet_format_properties = xlnt::sheet_format_properties(); + sheet_format_properties.base_col_width = 10.0; + sheet_format_properties.default_row_height = 16.0; + sheet_format_properties.dy_descent = 0.2; + ws.format_properties(sheet_format_properties); + ws.cell("A1").value("A1"); ws.cell("B1").value("B1"); ws.cell("D1").value("D1"); ws.cell("A2").value("A2"); - ws.cell("B2").value("B2"); - ws.cell("D2").value("D2"); ws.cell("A4").value("A4"); + ws.cell("B2").value("B2"); ws.cell("B4").value("B4"); + ws.cell("D2").value("D2"); ws.cell("D4").value("D4"); + for (auto i = 1; i <= 5; ++i) + { + ws.row_properties(i).dy_descent = 0.2; + } + ws.row_properties(1).height = 100; ws.row_properties(1).custom_height = true; @@ -479,19 +532,22 @@ public: ws.row_properties(5).height = 100; ws.row_properties(5).custom_height = true; - ws.column_properties("A").width = 15.949776785714286; + auto width = ((16.0 * 7) - 5) / 7; + + ws.column_properties("A").width = width; ws.column_properties("A").custom_width = true; - ws.column_properties("C").width = 15.949776785714286; + ws.column_properties("C").width = width; ws.column_properties("C").custom_width = true; - ws.column_properties("E").width = 15.949776785714286; + ws.column_properties("E").width = width; ws.column_properties("E").custom_width = true; wb.default_slicer_style("SlicerStyleLight1"); wb.enable_known_fonts(); - xlnt_assert(workbook_matches_file(wb, path_helper::test_file("13_custom_heights_widths.xlsx"))); + xlnt_assert(workbook_matches_file(wb, + path_helper::test_file("13_custom_heights_widths.xlsx"))); } ///