diff --git a/include/xlnt/worksheet/selection.hpp b/include/xlnt/worksheet/selection.hpp index 6850b507..9a6217d5 100644 --- a/include/xlnt/worksheet/selection.hpp +++ b/include/xlnt/worksheet/selection.hpp @@ -35,12 +35,14 @@ namespace xlnt { class XLNT_CLASS selection { public: + bool has_active_cell() const { return has_active_cell_; } cell_reference get_active_cell() const { return active_cell_; } range_reference get_sqref() const { return sqref_; } pane_corner get_pane() const { return pane_; } void set_pane(pane_corner corner) { pane_ = corner; } private: + bool has_active_cell_ = false; cell_reference active_cell_; range_reference sqref_; pane_corner pane_; diff --git a/source/cell/tests/test_cell.hpp b/source/cell/tests/test_cell.hpp index d625956b..be82a558 100644 --- a/source/cell/tests/test_cell.hpp +++ b/source/cell/tests/test_cell.hpp @@ -294,7 +294,7 @@ public: auto ws = wb[1]; auto cell = ws.get_cell(xlnt::cell_reference(1, 1)); - TS_ASSERT(cell.to_repr() == ""); + TS_ASSERT(cell.to_repr() == ""); } void test_comment_assignment() diff --git a/source/detail/workbook_impl.hpp b/source/detail/workbook_impl.hpp index 4ecc71cc..b8e23146 100644 --- a/source/detail/workbook_impl.hpp +++ b/source/detail/workbook_impl.hpp @@ -51,7 +51,6 @@ struct workbook_impl write_core_properties_(false), created_(xlnt::datetime::now()), modified_(xlnt::datetime::now()), - title_("Untitled"), base_date_(calendar::windows_1900), write_app_properties_(false), application_("libxlnt"), diff --git a/source/detail/xlsx_consumer.cpp b/source/detail/xlsx_consumer.cpp index 89b10245..f4406806 100644 --- a/source/detail/xlsx_consumer.cpp +++ b/source/detail/xlsx_consumer.cpp @@ -827,11 +827,13 @@ void xlsx_consumer::read_manifest() for (const auto &relationship_source : source_.infolist()) { if (relationship_source.filename == path("_rels/.rels") - || relationship_source.filename.extension() != ".rels") continue; + || relationship_source.filename.extension() != "rels") continue; + + path part(relationship_source.filename.parent().parent()); + part = part.append(relationship_source.filename.split_extension().first); + uri source(part.string()); auto part_rels = read_relationships(relationship_source.filename, source_); - uri source(relationship_source.filename.parent().parent() - .append(relationship_source.filename.filename()).string()); for (const auto part_rel : part_rels) { diff --git a/source/detail/xlsx_producer.cpp b/source/detail/xlsx_producer.cpp index 745d0e57..7da1b4ff 100644 --- a/source/detail/xlsx_producer.cpp +++ b/source/detail/xlsx_producer.cpp @@ -228,8 +228,7 @@ bool write_color(const xlnt::color &color, pugi::xml_node color_node) bool write_fonts(const std::vector &fonts, pugi::xml_node &fonts_node) { fonts_node.append_attribute("count").set_value(std::to_string(fonts.size()).c_str()); - // TODO: what does this do? - // fonts_node.append_attribute("x14ac:knownFonts", "1"); + fonts_node.append_attribute("x14ac:knownFonts").set_value(std::to_string(fonts.size()).c_str()); for (auto &f : fonts) { @@ -651,7 +650,7 @@ void xlsx_producer::write_manifest() for (const auto &part : source_.get_manifest().get_parts_with_overriden_types()) { auto override_node = types_node.append_child("Override"); - override_node.append_attribute("PartName").set_value(part.string().c_str()); + override_node.append_attribute("PartName").set_value(part.resolve(path("/")).string().c_str()); auto content_type = source_.get_manifest().get_override_type(part); override_node.append_attribute("ContentType").set_value(content_type.c_str()); } @@ -664,7 +663,11 @@ void xlsx_producer::write_manifest() pugi::xml_document part_rels_document; write_relationships(part_rels, part_rels_document.root()); - path parent(part.parent().string().front() == '/' ? part.parent().string().substr(1) : part.parent().string()); + path parent = part.parent(); + if (parent.is_absolute()) + { + parent = path(parent.string().substr(1)); + } path rels_path(parent.append("_rels").append(part.filename() + ".rels").string()); write_document_to_archive(part_rels_document, rels_path, destination_); } @@ -683,20 +686,6 @@ void xlsx_producer::write_extended_properties(const relationship &rel, pugi::xml properties_node.append_child("DocSecurity").text().set(std::to_string(source_.get_doc_security()).c_str()); properties_node.append_child("ScaleCrop").text().set(source_.get_scale_crop() ? "true" : "false"); - auto company_node = properties_node.append_child("Company"); - - if (!source_.get_company().empty()) - { - company_node.text().set(source_.get_company().c_str()); - } - - properties_node.append_child("LinksUpToDate").text().set(source_.links_up_to_date() ? "true" : "false"); - properties_node.append_child("SharedDoc").text().set(source_.is_shared_doc() ? "true" : "false"); - properties_node.append_child("HyperlinksChanged").text().set(source_.hyperlinks_changed() ? "true" : "false"); - properties_node.append_child("AppVersion").text().set(source_.get_app_version().c_str()); - - // TODO what is this stuff? - auto heading_pairs_node = properties_node.append_child("HeadingPairs"); auto heading_pairs_vector_node = heading_pairs_node.append_child("vt:vector"); heading_pairs_vector_node.append_attribute("size").set_value("2"); @@ -715,6 +704,18 @@ void xlsx_producer::write_extended_properties(const relationship &rel, pugi::xml { titles_of_parts_vector_node.append_child("vt:lpstr").text().set(ws.get_title().c_str()); } + + auto company_node = properties_node.append_child("Company"); + + if (!source_.get_company().empty()) + { + company_node.text().set(source_.get_company().c_str()); + } + + properties_node.append_child("LinksUpToDate").text().set(source_.links_up_to_date() ? "true" : "false"); + properties_node.append_child("SharedDoc").text().set(source_.is_shared_doc() ? "true" : "false"); + properties_node.append_child("HyperlinksChanged").text().set(source_.hyperlinks_changed() ? "true" : "false"); + properties_node.append_child("AppVersion").text().set(source_.get_app_version().c_str()); } void xlsx_producer::write_core_properties(const relationship &rel, pugi::xml_node root) @@ -723,8 +724,8 @@ void xlsx_producer::write_core_properties(const relationship &rel, pugi::xml_nod core_properties_node.append_attribute("xmlns:cp").set_value("http://schemas.openxmlformats.org/package/2006/metadata/core-properties"); core_properties_node.append_attribute("xmlns:dc").set_value("http://purl.org/dc/elements/1.1/"); - core_properties_node.append_attribute("xmlns:dcmitype").set_value("http://purl.org/dc/dcmitype/"); core_properties_node.append_attribute("xmlns:dcterms").set_value("http://purl.org/dc/terms/"); + core_properties_node.append_attribute("xmlns:dcmitype").set_value("http://purl.org/dc/dcmitype/"); core_properties_node.append_attribute("xmlns:xsi").set_value("http://www.w3.org/2001/XMLSchema-instance"); core_properties_node.append_child("dc:creator").text().set(source_.get_creator().c_str()); @@ -733,11 +734,18 @@ void xlsx_producer::write_core_properties(const relationship &rel, pugi::xml_nod core_properties_node.child("dcterms:created").append_attribute("xsi:type").set_value("dcterms:W3CDTF"); core_properties_node.append_child("dcterms:modified").text().set(datetime_to_w3cdtf(source_.get_modified()).c_str()); core_properties_node.child("dcterms:modified").append_attribute("xsi:type").set_value("dcterms:W3CDTF"); - core_properties_node.append_child("dc:title").text().set(source_.get_title().c_str()); + + if (!source_.get_title().empty()) + { + core_properties_node.append_child("dc:title").text().set(source_.get_title().c_str()); + } + + /* core_properties_node.append_child("dc:description"); core_properties_node.append_child("dc:subject"); core_properties_node.append_child("cp:keywords"); core_properties_node.append_child("cp:category"); + */ } void xlsx_producer::write_custom_properties(const relationship &rel, pugi::xml_node root) @@ -750,6 +758,7 @@ void xlsx_producer::write_custom_properties(const relationship &rel, pugi::xml_n void xlsx_producer::write_workbook(const relationship &rel, pugi::xml_node root) { std::size_t num_visible = 0; + bool any_defined_names = false; for (auto ws : source_) { @@ -757,6 +766,11 @@ void xlsx_producer::write_workbook(const relationship &rel, pugi::xml_node root) { num_visible++; } + + if (ws.has_auto_filter()) + { + any_defined_names = true; + } } if (num_visible == 0) @@ -768,39 +782,60 @@ void xlsx_producer::write_workbook(const relationship &rel, pugi::xml_node root) workbook_node.append_attribute("xmlns").set_value("http://schemas.openxmlformats.org/spreadsheetml/2006/main"); workbook_node.append_attribute("xmlns:r").set_value("http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + workbook_node.append_attribute("xmlns:mc").set_value("http://schemas.openxmlformats.org/markup-compatibility/2006"); + workbook_node.append_attribute("mc:Ignorable").set_value("x15"); + workbook_node.append_attribute("xmlns:x15").set_value("http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"); auto file_version_node = workbook_node.append_child("fileVersion"); file_version_node.append_attribute("appName").set_value("xl"); - file_version_node.append_attribute("lastEdited").set_value("4"); - file_version_node.append_attribute("lowestEdited").set_value("4"); - file_version_node.append_attribute("rupBuild").set_value("4505"); + file_version_node.append_attribute("lastEdited").set_value("6"); + file_version_node.append_attribute("lowestEdited").set_value("6"); + file_version_node.append_attribute("rupBuild").set_value("29709"); auto workbook_pr_node = workbook_node.append_child("workbookPr"); + /* workbook_pr_node.append_attribute("codeName").set_value("ThisWorkbook"); workbook_pr_node.append_attribute("defaultThemeVersion").set_value("124226"); workbook_pr_node.append_attribute("date1904").set_value(source_.get_base_date() == calendar::mac_1904 ? "1" : "0"); + */ + + auto alternate_content_node = workbook_node.append_child("mc:AlternateContent"); + alternate_content_node.append_attribute("xmlns:mc").set_value("http://schemas.openxmlformats.org/markup-compatibility/2006"); + auto choice_node = alternate_content_node.append_child("mc:Choice"); + choice_node.append_attribute("Requires").set_value("x15"); + auto abs_path_node = choice_node.append_child("x15ac:absPath"); + abs_path_node.append_attribute("url").set_value("/Users/thomas/Development/xlnt/tests/data/xlsx/"); + abs_path_node.append_attribute("xmlns:x15ac").set_value("http://schemas.microsoft.com/office/spreadsheetml/2010/11/ac"); auto book_views_node = workbook_node.append_child("bookViews"); auto workbook_view_node = book_views_node.append_child("workbookView"); - workbook_view_node.append_attribute("activeTab").set_value("0"); - workbook_view_node.append_attribute("autoFilterDateGrouping").set_value("1"); - workbook_view_node.append_attribute("firstSheet").set_value("0"); - workbook_view_node.append_attribute("minimized").set_value("0"); - workbook_view_node.append_attribute("showHorizontalScroll").set_value("1"); - workbook_view_node.append_attribute("showSheetTabs").set_value("1"); - workbook_view_node.append_attribute("showVerticalScroll").set_value("1"); - workbook_view_node.append_attribute("tabRatio").set_value("600"); - workbook_view_node.append_attribute("visibility").set_value("visible"); + //workbook_view_node.append_attribute("activeTab").set_value("0"); + //workbook_view_node.append_attribute("autoFilterDateGrouping").set_value("1"); + //workbook_view_node.append_attribute("firstSheet").set_value("0"); + //workbook_view_node.append_attribute("minimized").set_value("0"); + //workbook_view_node.append_attribute("showHorizontalScroll").set_value("1"); + //workbook_view_node.append_attribute("showSheetTabs").set_value("1"); + //workbook_view_node.append_attribute("showVerticalScroll").set_value("1"); + //workbook_view_node.append_attribute("tabRatio").set_value("600"); + //workbook_view_node.append_attribute("visibility").set_value("visible"); + workbook_view_node.append_attribute("xWindow").set_value("0"); + workbook_view_node.append_attribute("yWindow").set_value("460"); + workbook_view_node.append_attribute("windowWidth").set_value("28800"); + workbook_view_node.append_attribute("windowHeight").set_value("17460"); + workbook_view_node.append_attribute("tabRatio").set_value("500"); auto sheets_node = workbook_node.append_child("sheets"); - auto defined_names_node = workbook_node.append_child("definedNames"); - - auto wb_rel = source_.d_->manifest_.get_relationship(path("/"), xlnt::relationship::type::office_document); + pugi::xml_node defined_names_node; + + if (any_defined_names) + { + defined_names_node = workbook_node.append_child("definedNames"); + } for (const auto ws : source_) { auto sheet_rel_id = source_.d_->sheet_title_rel_id_map_[ws.get_title()]; - auto sheet_rel = source_.d_->manifest_.get_relationship(wb_rel.get_target().get_path(), sheet_rel_id); + auto sheet_rel = source_.d_->manifest_.get_relationship(rel.get_source().get_path(), sheet_rel_id); auto sheet_node = sheets_node.append_child("sheet"); sheet_node.append_attribute("name").set_value(ws.get_title().c_str()); @@ -826,9 +861,10 @@ void xlsx_producer::write_workbook(const relationship &rel, pugi::xml_node root) } auto calc_pr_node = workbook_node.append_child("calcPr"); - calc_pr_node.append_attribute("calcId").set_value("124519"); - calc_pr_node.append_attribute("calcMode").set_value("auto"); - calc_pr_node.append_attribute("fullCalcOnLoad").set_value("1"); + calc_pr_node.append_attribute("calcId").set_value("150000"); + //calc_pr_node.append_attribute("calcMode").set_value("auto"); + //calc_pr_node.append_attribute("fullCalcOnLoad").set_value("1"); + calc_pr_node.append_attribute("concurrentCalc").set_value("0"); /* for (auto &named_range : workbook_.get_named_ranges()) @@ -844,6 +880,13 @@ void xlsx_producer::write_workbook(const relationship &rel, pugi::xml_node root) defined_name_node.text().set(target_string.c_str()); } */ + + auto ext_lst_node = workbook_node.append_child("extLst"); + auto ext_node = ext_lst_node.append_child("ext"); + ext_node.append_attribute("uri").set_value("{7523E5D3-25F3-A5E0-1632-64F254C22452}"); + ext_node.append_attribute("xmlns:mx").set_value("http://schemas.microsoft.com/office/mac/excel/2008/main"); + auto arch_id_node = ext_node.append_child("mx:ArchID"); + arch_id_node.append_attribute("Flags").set_value("2"); for (const auto &child_rel : source_.get_manifest().get_relationships(rel.get_target().get_path())) { @@ -1083,6 +1126,13 @@ void xlsx_producer::write_styles(const relationship &rel, pugi::xml_node root) auto colors_node = stylesheet_node.append_child("colors"); write_colors(stylesheet.colors, colors_node); } + + auto ext_list_node = stylesheet_node.append_child("extLst"); + auto ext_node = ext_list_node.append_child("ext"); + ext_node.append_attribute("uri").set_value("{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}"); + ext_node.append_attribute("xmlns:x14").set_value("http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); + auto slicer_styles_node = ext_node.append_child("x14:slicerStyles"); + slicer_styles_node.append_attribute("defaultSlicerStyle").set_value("SlicerStyleLight1"); } void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root) @@ -1104,11 +1154,11 @@ void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root) std::vector scheme_elements = { { "a:dk1", "a:sysClr", "windowText" },{ "a:lt1", "a:sysClr", "window" }, - { "a:dk2", "a:srgbClr", "1F497D" },{ "a:lt2", "a:srgbClr", "EEECE1" }, - { "a:accent1", "a:srgbClr", "4F81BD" },{ "a:accent2", "a:srgbClr", "C0504D" }, - { "a:accent3", "a:srgbClr", "9BBB59" },{ "a:accent4", "a:srgbClr", "8064A2" }, - { "a:accent5", "a:srgbClr", "4BACC6" },{ "a:accent6", "a:srgbClr", "F79646" }, - { "a:hlink", "a:srgbClr", "0000FF" },{ "a:folHlink", "a:srgbClr", "800080" }, + { "a:dk2", "a:srgbClr", "44546A" },{ "a:lt2", "a:srgbClr", "E7E6E6" }, + { "a:accent1", "a:srgbClr", "5B9BD5" },{ "a:accent2", "a:srgbClr", "ED7D31" }, + { "a:accent3", "a:srgbClr", "A5A5A5" },{ "a:accent4", "a:srgbClr", "FFC000" }, + { "a:accent5", "a:srgbClr", "4472C4" },{ "a:accent6", "a:srgbClr", "70AD47" }, + { "a:hlink", "a:srgbClr", "0563C1" },{ "a:folHlink", "a:srgbClr", "954F72" }, }; for (auto element : scheme_elements) @@ -1135,14 +1185,13 @@ void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root) }; std::vector font_schemes = { - { true, "a:latin", "Cambria", "Calibri" }, + { true, "a:latin", "Calibri Light", "Calibri" }, { true, "a:ea", "", "" }, { true, "a:cs", "", "" }, - { false, "Jpan", "\xef\xbc\xad\xef\xbc\xb3 \xef\xbc\xb0\xe3\x82\xb4\xe3\x82\xb7\xe3\x83\x83\xe3\x82\xaf", - "\xef\xbc\xad\xef\xbc\xb3 \xef\xbc\xb0\xe3\x82\xb4\xe3\x82\xb7\xe3\x83\x83\xe3\x82\xaf" }, + { false, "Jpan", "Yu Gothic Light", "Yu Gothic" }, { false, "Hang", "\xeb\xa7\x91\xec\x9d\x80 \xea\xb3\xa0\xeb\x94\x95", "\xeb\xa7\x91\xec\x9d\x80 \xea\xb3\xa0\xeb\x94\x95" }, - { false, "Hans", "\xe5\xae\x8b\xe4\xbd\x93", "\xe5\xae\x8b\xe4\xbd\x93" }, + { false, "Hans", "DengXian Light", "DengXian" }, { false, "Hant", "\xe6\x96\xb0\xe7\xb4\xb0\xe6\x98\x8e\xe9\xab\x94", "\xe6\x96\xb0\xe7\xb4\xb0\xe6\x98\x8e\xe9\xab\x94" }, { false, "Arab", "Times New Roman", "Arial" }, @@ -1169,7 +1218,8 @@ void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root) { false, "Sinh", "Iskoola Pota", "Iskoola Pota" }, { false, "Mong", "Mongolian Baiti", "Mongolian Baiti" }, { false, "Viet", "Times New Roman", "Arial" }, - { false, "Uigh", "Microsoft Uighur", "Microsoft Uighur" } + { false, "Uigh", "Microsoft Uighur", "Microsoft Uighur" }, + { false, "Geor", "Sylfaen", "Sylfaen" } }; auto font_scheme_node = theme_elements_node.append_child("a:fontScheme"); @@ -1185,8 +1235,18 @@ void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root) auto major_font_node = major_fonts_node.append_child(scheme.script.c_str()); major_font_node.append_attribute("typeface").set_value(scheme.major.c_str()); + if (scheme.major == "Calibri Light") + { + major_font_node.append_attribute("panose").set_value("020F0302020204030204"); + } + auto minor_font_node = minor_fonts_node.append_child(scheme.script.c_str()); minor_font_node.append_attribute("typeface").set_value(scheme.minor.c_str()); + + if (scheme.minor == "Calibri") + { + minor_font_node.append_attribute("panose").set_value("020F0302020204030204"); + } } else { @@ -1214,26 +1274,29 @@ void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root) gs_node.append_attribute("pos").set_value("0"); auto scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:tint").append_attribute("val").set_value("50000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("300000"); + scheme_color_node.append_child("a:lumMod").append_attribute("val").set_value("110000"); + scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("105000"); + scheme_color_node.append_child("a:tint").append_attribute("val").set_value("67000"); gs_node = grad_fill_list.append_child("a:gs"); - gs_node.append_attribute("pos").set_value("35000"); + gs_node.append_attribute("pos").set_value("50000"); scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:tint").append_attribute("val").set_value("37000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("300000"); + scheme_color_node.append_child("a:lumMod").append_attribute("val").set_value("105000"); + scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("103000"); + scheme_color_node.append_child("a:tint").append_attribute("val").set_value("73000"); gs_node = grad_fill_list.append_child("a:gs"); gs_node.append_attribute("pos").set_value("100000"); scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:tint").append_attribute("val").set_value("15000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("350000"); + scheme_color_node.append_child("a:lumMod").append_attribute("val").set_value("105000"); + scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("109000"); + scheme_color_node.append_child("a:tint").append_attribute("val").set_value("81000"); auto lin_node = grad_fill_node.append_child("a:lin"); - lin_node.append_attribute("ang").set_value("16200000"); - lin_node.append_attribute("scaled").set_value("1"); + lin_node.append_attribute("ang").set_value("5400000"); + lin_node.append_attribute("scaled").set_value("0"); grad_fill_node = fill_style_list_node.append_child("a:gradFill"); grad_fill_node.append_attribute("rotWithShape").set_value("1"); @@ -1243,31 +1306,34 @@ void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root) gs_node.append_attribute("pos").set_value("0"); scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:shade").append_attribute("val").set_value("51000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("130000"); + scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("103000"); + scheme_color_node.append_child("a:lumMod").append_attribute("val").set_value("102000"); + scheme_color_node.append_child("a:tint").append_attribute("val").set_value("94000"); gs_node = grad_fill_list.append_child("a:gs"); - gs_node.append_attribute("pos").set_value("80000"); + gs_node.append_attribute("pos").set_value("50000"); scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:shade").append_attribute("val").set_value("93000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("130000"); + scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("110000"); + scheme_color_node.append_child("a:lumMod").append_attribute("val").set_value("100000"); + scheme_color_node.append_child("a:shade").append_attribute("val").set_value("100000"); gs_node = grad_fill_list.append_child("a:gs"); gs_node.append_attribute("pos").set_value("100000"); scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:shade").append_attribute("val").set_value("94000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("135000"); + scheme_color_node.append_child("a:lumMod").append_attribute("val").set_value("99000"); + scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("120000"); + scheme_color_node.append_child("a:shade").append_attribute("val").set_value("78000"); lin_node = grad_fill_node.append_child("a:lin"); - lin_node.append_attribute("ang").set_value("16200000"); + lin_node.append_attribute("ang").set_value("5400000"); lin_node.append_attribute("scaled").set_value("0"); auto line_style_list_node = format_scheme_node.append_child("a:lnStyleLst"); auto ln_node = line_style_list_node.append_child("a:ln"); - ln_node.append_attribute("w").set_value("9525"); + ln_node.append_attribute("w").set_value("6350"); ln_node.append_attribute("cap").set_value("flat"); ln_node.append_attribute("cmpd").set_value("sng"); ln_node.append_attribute("algn").set_value("ctr"); @@ -1275,12 +1341,11 @@ void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root) auto solid_fill_node = ln_node.append_child("a:solidFill"); scheme_color_node = solid_fill_node.append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:shade").append_attribute("val").set_value("95000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("105000"); ln_node.append_child("a:prstDash").append_attribute("val").set_value("solid"); + ln_node.append_child("a:miter").append_attribute("lim").set_value("800000"); ln_node = line_style_list_node.append_child("a:ln"); - ln_node.append_attribute("w").set_value("25400"); + ln_node.append_attribute("w").set_value("12700"); ln_node.append_attribute("cap").set_value("flat"); ln_node.append_attribute("cmpd").set_value("sng"); ln_node.append_attribute("algn").set_value("ctr"); @@ -1289,9 +1354,10 @@ void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root) scheme_color_node = solid_fill_node.append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); ln_node.append_child("a:prstDash").append_attribute("val").set_value("solid"); + ln_node.append_child("a:miter").append_attribute("lim").set_value("800000"); ln_node = line_style_list_node.append_child("a:ln"); - ln_node.append_attribute("w").set_value("38100"); + ln_node.append_attribute("w").set_value("19050"); ln_node.append_attribute("cap").set_value("flat"); ln_node.append_attribute("cmpd").set_value("sng"); ln_node.append_attribute("algn").set_value("ctr"); @@ -1300,96 +1366,35 @@ void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root) scheme_color_node = solid_fill_node.append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); ln_node.append_child("a:prstDash").append_attribute("val").set_value("solid"); + ln_node.append_child("a:miter").append_attribute("lim").set_value("800000"); auto effect_style_list_node = format_scheme_node.append_child("a:effectStyleLst"); auto effect_style_node = effect_style_list_node.append_child("a:effectStyle"); auto effect_list_node = effect_style_node.append_child("a:effectLst"); + + effect_style_node = effect_style_list_node.append_child("a:effectStyle"); + effect_list_node = effect_style_node.append_child("a:effectLst"); + + effect_style_node = effect_style_list_node.append_child("a:effectStyle"); + effect_list_node = effect_style_node.append_child("a:effectLst"); auto outer_shadow_node = effect_list_node.append_child("a:outerShdw"); - outer_shadow_node.append_attribute("blurRad").set_value("40000"); - outer_shadow_node.append_attribute("dist").set_value("20000"); + outer_shadow_node.append_attribute("blurRad").set_value("57150"); + outer_shadow_node.append_attribute("dist").set_value("19050"); outer_shadow_node.append_attribute("dir").set_value("5400000"); + outer_shadow_node.append_attribute("algn").set_value("ctr"); outer_shadow_node.append_attribute("rotWithShape").set_value("0"); auto srgb_clr_node = outer_shadow_node.append_child("a:srgbClr"); srgb_clr_node.append_attribute("val").set_value("000000"); - srgb_clr_node.append_child("a:alpha").append_attribute("val").set_value("38000"); - - effect_style_node = effect_style_list_node.append_child("a:effectStyle"); - effect_list_node = effect_style_node.append_child("a:effectLst"); - outer_shadow_node = effect_list_node.append_child("a:outerShdw"); - outer_shadow_node.append_attribute("blurRad").set_value("40000"); - outer_shadow_node.append_attribute("dist").set_value("23000"); - outer_shadow_node.append_attribute("dir").set_value("5400000"); - outer_shadow_node.append_attribute("rotWithShape").set_value("0"); - srgb_clr_node = outer_shadow_node.append_child("a:srgbClr"); - srgb_clr_node.append_attribute("val").set_value("000000"); - srgb_clr_node.append_child("a:alpha").append_attribute("val").set_value("35000"); - - effect_style_node = effect_style_list_node.append_child("a:effectStyle"); - effect_list_node = effect_style_node.append_child("a:effectLst"); - outer_shadow_node = effect_list_node.append_child("a:outerShdw"); - outer_shadow_node.append_attribute("blurRad").set_value("40000"); - outer_shadow_node.append_attribute("dist").set_value("23000"); - outer_shadow_node.append_attribute("dir").set_value("5400000"); - outer_shadow_node.append_attribute("rotWithShape").set_value("0"); - srgb_clr_node = outer_shadow_node.append_child("a:srgbClr"); - srgb_clr_node.append_attribute("val").set_value("000000"); - srgb_clr_node.append_child("a:alpha").append_attribute("val").set_value("35000"); - auto scene3d_node = effect_style_node.append_child("a:scene3d"); - auto camera_node = scene3d_node.append_child("a:camera"); - camera_node.append_attribute("prst").set_value("orthographicFront"); - auto rot_node = camera_node.append_child("a:rot"); - rot_node.append_attribute("lat").set_value("0"); - rot_node.append_attribute("lon").set_value("0"); - rot_node.append_attribute("rev").set_value("0"); - auto light_rig_node = scene3d_node.append_child("a:lightRig"); - light_rig_node.append_attribute("rig").set_value("threePt"); - light_rig_node.append_attribute("dir").set_value("t"); - rot_node = light_rig_node.append_child("a:rot"); - rot_node.append_attribute("lat").set_value("0"); - rot_node.append_attribute("lon").set_value("0"); - rot_node.append_attribute("rev").set_value("1200000"); - - auto bevel_node = effect_style_node.append_child("a:sp3d").append_child("a:bevelT"); - bevel_node.append_attribute("w").set_value("63500"); - bevel_node.append_attribute("h").set_value("25400"); + srgb_clr_node.append_child("a:alpha").append_attribute("val").set_value("63000"); auto bg_fill_style_list_node = format_scheme_node.append_child("a:bgFillStyleLst"); bg_fill_style_list_node.append_child("a:solidFill").append_child("a:schemeClr").append_attribute("val").set_value("phClr"); - grad_fill_node = bg_fill_style_list_node.append_child("a:gradFill"); - grad_fill_node.append_attribute("rotWithShape").set_value("1"); - - grad_fill_list = grad_fill_node.append_child("a:gsLst"); - gs_node = grad_fill_list.append_child("a:gs"); - gs_node.append_attribute("pos").set_value("0"); - scheme_color_node = gs_node.append_child("a:schemeClr"); + scheme_color_node = bg_fill_style_list_node.append_child("a:solidFill").append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:tint").append_attribute("val").set_value("40000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("350000"); - - gs_node = grad_fill_list.append_child("a:gs"); - gs_node.append_attribute("pos").set_value("40000"); - scheme_color_node = gs_node.append_child("a:schemeClr"); - scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:tint").append_attribute("val").set_value("45000"); - scheme_color_node.append_child("a:shade").append_attribute("val").set_value("99000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("350000"); - - gs_node = grad_fill_list.append_child("a:gs"); - gs_node.append_attribute("pos").set_value("100000"); - scheme_color_node = gs_node.append_child("a:schemeClr"); - scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:shade").append_attribute("val").set_value("20000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("255000"); - - auto path_node = grad_fill_node.append_child("a:path"); - path_node.append_attribute("path").set_value("circle"); - auto fill_to_rect_node = path_node.append_child("a:fillToRect"); - fill_to_rect_node.append_attribute("l").set_value("50000"); - fill_to_rect_node.append_attribute("t").set_value("-80000"); - fill_to_rect_node.append_attribute("r").set_value("50000"); - fill_to_rect_node.append_attribute("b").set_value("180000"); + scheme_color_node.append_child("a:tint").append_attribute("val").set_value("95000"); + scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("170000"); grad_fill_node = bg_fill_style_list_node.append_child("a:gradFill"); grad_fill_node.append_attribute("rotWithShape").set_value("1"); @@ -1399,26 +1404,42 @@ void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root) gs_node.append_attribute("pos").set_value("0"); scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:tint").append_attribute("val").set_value("80000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("300000"); + scheme_color_node.append_child("a:tint").append_attribute("val").set_value("93000"); + scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("150000"); + scheme_color_node.append_child("a:shade").append_attribute("val").set_value("98000"); + scheme_color_node.append_child("a:lumMod").append_attribute("val").set_value("102000"); + + gs_node = grad_fill_list.append_child("a:gs"); + gs_node.append_attribute("pos").set_value("50000"); + scheme_color_node = gs_node.append_child("a:schemeClr"); + scheme_color_node.append_attribute("val").set_value("phClr"); + scheme_color_node.append_child("a:tint").append_attribute("val").set_value("98000"); + scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("130000"); + scheme_color_node.append_child("a:shade").append_attribute("val").set_value("90000"); + scheme_color_node.append_child("a:lumMod").append_attribute("val").set_value("103000"); gs_node = grad_fill_list.append_child("a:gs"); gs_node.append_attribute("pos").set_value("100000"); scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node.append_attribute("val").set_value("phClr"); - scheme_color_node.append_child("a:shade").append_attribute("val").set_value("30000"); - scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("200000"); + scheme_color_node.append_child("a:shade").append_attribute("val").set_value("63000"); + scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("120000"); - path_node = grad_fill_node.append_child("a:path"); - path_node.append_attribute("path").set_value("circle"); - fill_to_rect_node = path_node.append_child("a:fillToRect"); - fill_to_rect_node.append_attribute("l").set_value("50000"); - fill_to_rect_node.append_attribute("t").set_value("50000"); - fill_to_rect_node.append_attribute("r").set_value("50000"); - fill_to_rect_node.append_attribute("b").set_value("50000"); + lin_node = grad_fill_node.append_child("a:lin"); + lin_node.append_attribute("ang").set_value("5400000"); + lin_node.append_attribute("scaled").set_value("0"); theme_node.append_child("a:objectDefaults"); theme_node.append_child("a:extraClrSchemeLst"); + + auto ext_lst_node = theme_node.append_child("a:extLst"); + auto ext_node = ext_lst_node.append_child("a:ext"); + ext_node.append_attribute("uri").set_value("{05A4C25C-085E-4340-85A3-A5531E510DB2}"); + auto theme_family_node = ext_node.append_child("thm15:themeFamily"); + theme_family_node.append_attribute("xmlns:thm15").set_value("http://schemas.microsoft.com/office/thememl/2012/main"); + theme_family_node.append_attribute("name").set_value("Office Theme"); + theme_family_node.append_attribute("id").set_value("{62F939B6-93AF-4DB8-9C6B-D6C7DFDC589F}"); + theme_family_node.append_attribute("vid").set_value("{4A3C46E8-61CC-4603-A589-7422A47A8E4A}"); } void xlsx_producer::write_volatile_dependencies(const relationship &rel, pugi::xml_node root) @@ -1430,13 +1451,10 @@ void xlsx_producer::write_worksheet(const relationship &rel, pugi::xml_node root { auto worksheet_node = root.append_child("worksheet"); worksheet_node.append_attribute("xmlns").set_value("http://schemas.openxmlformats.org/spreadsheetml/2006/main"); - worksheet_node.append_attribute("xmlns:r").set_value("http://schemas.openxmlformats.org/package/2006/relationships"); - - auto sheet_pr_node = worksheet_node.append_child("sheetPr"); - auto outline_pr_node = sheet_pr_node.append_child("outlinePr"); - - outline_pr_node.append_attribute("summaryBelow").set_value("1"); - outline_pr_node.append_attribute("summaryRight").set_value("1"); + worksheet_node.append_attribute("xmlns:r").set_value("http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + worksheet_node.append_attribute("xmlns:mc").set_value("http://schemas.openxmlformats.org/markup-compatibility/2006"); + worksheet_node.append_attribute("mc:Ignorable").set_value("x14ac"); + worksheet_node.append_attribute("xmlns:x14ac").set_value("http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"); auto title = std::find_if(source_.d_->sheet_title_rel_id_map_.begin(), source_.d_->sheet_title_rel_id_map_.end(), @@ -1449,12 +1467,20 @@ void xlsx_producer::write_worksheet(const relationship &rel, pugi::xml_node root if (!ws.get_page_setup().is_default()) { + auto sheet_pr_node = worksheet_node.append_child("sheetPr"); + auto outline_pr_node = sheet_pr_node.append_child("outlinePr"); + + outline_pr_node.append_attribute("summaryBelow").set_value("1"); + outline_pr_node.append_attribute("summaryRight").set_value("1"); + auto page_set_up_pr_node = sheet_pr_node.append_child("pageSetUpPr"); page_set_up_pr_node.append_attribute("fitToPage").set_value(ws.get_page_setup().fit_to_page() ? "1" : "0"); } auto dimension_node = worksheet_node.append_child("dimension"); - dimension_node.append_attribute("ref").set_value(ws.calculate_dimension().to_string().c_str()); + auto dimension = ws.calculate_dimension(); + auto dimension_string = dimension.is_single_cell() ? dimension.get_top_left().to_string() : dimension.to_string(); + dimension_node.append_attribute("ref").set_value(dimension_string.c_str()); auto sheet_views_node = worksheet_node.append_child("sheetViews"); auto sheet_view_node = sheet_views_node.append_child("sheetView"); @@ -1490,12 +1516,9 @@ void xlsx_producer::write_worksheet(const relationship &rel, pugi::xml_node root pane_node.append_attribute("topLeftCell").set_value(ws.get_frozen_panes().to_string().c_str()); pane_node.append_attribute("activePane").set_value(active_pane.c_str()); pane_node.append_attribute("state").set_value("frozen"); - } - auto selection_node = sheet_view_node.append_child("selection"); + auto selection_node = sheet_view_node.append_child("selection"); - if (ws.has_frozen_panes()) - { if (ws.get_frozen_panes().get_row() > 1 && ws.get_frozen_panes().get_column_index() > 1) { selection_node.append_attribute("pane").set_value("bottomRight"); @@ -1510,9 +1533,21 @@ void xlsx_producer::write_worksheet(const relationship &rel, pugi::xml_node root } } - std::string active_cell = "A1"; - selection_node.append_attribute("activeCell").set_value(active_cell.c_str()); - selection_node.append_attribute("sqref").set_value(active_cell.c_str()); + if (!ws.get_sheet_view().get_selections().empty()) + { + auto selection_node = sheet_view_node.child("selection") ? + sheet_view_node.child("selection") + : sheet_view_node.append_child("selection"); + + const auto &first_selection = ws.get_sheet_view().get_selections().front(); + + if (first_selection.has_active_cell()) + { + auto active_cell = first_selection.get_active_cell(); + selection_node.append_attribute("activeCell").set_value(active_cell.to_string().c_str()); + selection_node.append_attribute("sqref").set_value(active_cell.to_string().c_str()); + } + } auto sheet_format_pr_node = worksheet_node.append_child("sheetFormatPr"); sheet_format_pr_node.append_attribute("baseColWidth").set_value("10"); diff --git a/source/packaging/manifest.cpp b/source/packaging/manifest.cpp index af260dd3..cfaed685 100644 --- a/source/packaging/manifest.cpp +++ b/source/packaging/manifest.cpp @@ -78,9 +78,11 @@ std::vector manifest::get_relationships(const path &part, relation std::string manifest::get_content_type(const path &part) const { - if (has_override_type(part)) + auto absolute = part.resolve(path("/")); + + if (has_override_type(absolute)) { - return get_override_type(part); + return get_override_type(absolute); } if (has_default_type(part.extension())) diff --git a/source/utils/path.cpp b/source/utils/path.cpp index 9f71d5dc..22ca6202 100644 --- a/source/utils/path.cpp +++ b/source/utils/path.cpp @@ -44,10 +44,26 @@ char system_separator() return '\\'; } +bool is_drive_letter(char letter) +{ + return letter >= 'A' && letter <= 'Z'; +} + bool is_root(const std::string &part) { - return part == "/" || (part.size() == 2 && part.back() == ':' - && part.front() >= 'A' && part.front() <= 'Z'); + if (part.size() == 1 && part[0] == '/') return true; + if (part.size() != 3) return false; + + return is_drive_letter(part[0]) && part[1] == ':' + && (part[2] == '\\' || part[2] == '/'); +} + +bool is_absolute(const std::string &part) +{ + if (!part.empty() && part[0] == '/') return true; + if (part.size() < 3) return false; + + return is_root(part.substr(0, 3)); } #else @@ -127,8 +143,7 @@ bool path::is_relative() const bool path::is_absolute() const { - auto split_path = split(); - return !split_path.empty() && ::is_root(split_path.front()); + return ::is_absolute(internal_); } bool path::is_root() const @@ -173,6 +188,14 @@ std::string path::extension() const return last_dot == std::string::npos ? "" : base.substr(last_dot + 1); } +std::pair path::split_extension() const +{ + auto base = filename(); + auto last_dot = base.find_last_of('.'); + + return{ base.substr(0, last_dot), base.substr(last_dot + 1) }; +} + // conversion std::string path::string() const @@ -248,14 +271,21 @@ path path::append(const std::string &to_append) const path path::append(const path &to_append) const { - return append(to_append.string()); + path copy(internal_); + + for (const auto &component : to_append.split()) + { + copy = copy.append(component); + } + + return copy; } char path::guess_separator() const { - if (system_separator() == '/') return '/'; + if (system_separator() == '/' || internal_.empty() || internal_.front() == '/') return '/'; if (is_absolute()) return internal_.at(2); - return internal_.find('/') == std::string::npos ? '/' : '\\'; + return internal_.find('\\') != std::string::npos ? '\\' : '/'; } bool operator==(const path &left, const path &right) diff --git a/source/workbook/tests/test_round_trip.hpp b/source/workbook/tests/test_round_trip.hpp index 0d3dba15..6df92a5c 100644 --- a/source/workbook/tests/test_round_trip.hpp +++ b/source/workbook/tests/test_round_trip.hpp @@ -40,7 +40,6 @@ public: void test_round_trip_minimal_wr() { - TS_SKIP(""); xlnt::workbook wb = xlnt::workbook::minimal(); TS_ASSERT(round_trip_matches_wr(wb)); } diff --git a/source/workbook/tests/test_workbook.hpp b/source/workbook/tests/test_workbook.hpp index 1b874542..fb820821 100644 --- a/source/workbook/tests/test_workbook.hpp +++ b/source/workbook/tests/test_workbook.hpp @@ -52,7 +52,7 @@ public: ws.get_cell("B3").set_value(2); ws.set_title("Active"); wb.copy_sheet(ws, 0); - TS_ASSERT_EQUALS(wb.get_sheet_titles().at(0), "Sheet"); + TS_ASSERT_EQUALS(wb.get_sheet_titles().at(0), "Sheet1"); TS_ASSERT_EQUALS(wb.get_sheet_by_index(0).get_cell("B3").get_value(), 2); TS_ASSERT_EQUALS(wb.get_sheet_titles().at(1), "Active"); TS_ASSERT_EQUALS(wb.get_sheet_by_index(1).get_cell("B3").get_value(), 2); @@ -95,7 +95,7 @@ public: void test_index_operator() // test_getitem { xlnt::workbook wb; - TS_ASSERT_THROWS_NOTHING(wb["Sheet"]); + TS_ASSERT_THROWS_NOTHING(wb["Sheet1"]); TS_ASSERT_THROWS(wb["NotThere"], xlnt::key_not_found); } @@ -104,7 +104,7 @@ public: void test_contains() { xlnt::workbook wb; - TS_ASSERT(wb.contains("Sheet")); + TS_ASSERT(wb.contains("Sheet1")); TS_ASSERT(!wb.contains("NotThere")); } @@ -114,7 +114,7 @@ public: for(auto ws : wb) { - TS_ASSERT_EQUALS(ws.get_title(), "Sheet"); + TS_ASSERT_EQUALS(ws.get_title(), "Sheet1"); } } @@ -136,7 +136,7 @@ public: xlnt::workbook wb; wb.create_sheet().set_title("test_get_sheet_titles"); - const std::vector expected_titles = { "Sheet", "test_get_sheet_titles" }; + const std::vector expected_titles = { "Sheet1", "test_get_sheet_titles" }; TS_ASSERT_EQUALS(wb.get_sheet_titles(), expected_titles); } @@ -177,23 +177,23 @@ public: { xlnt::workbook wb; - wb.create_sheet().set_title("Sheet1"); wb.create_sheet().set_title("Sheet2"); + wb.create_sheet().set_title("Sheet3"); auto iter = wb.begin(); - TS_ASSERT_EQUALS((*(iter++)).get_title(), "Sheet"); TS_ASSERT_EQUALS((*(iter++)).get_title(), "Sheet1"); TS_ASSERT_EQUALS((*(iter++)).get_title(), "Sheet2"); + TS_ASSERT_EQUALS((*(iter++)).get_title(), "Sheet3"); TS_ASSERT_EQUALS(iter, wb.end()); const auto wb_const = wb; auto const_iter = wb_const.begin(); - TS_ASSERT_EQUALS((*(const_iter++)).get_title(), "Sheet"); TS_ASSERT_EQUALS((*(const_iter++)).get_title(), "Sheet1"); TS_ASSERT_EQUALS((*(const_iter++)).get_title(), "Sheet2"); + TS_ASSERT_EQUALS((*(const_iter++)).get_title(), "Sheet3"); TS_ASSERT_EQUALS(const_iter, wb_const.end()); } @@ -201,25 +201,26 @@ public: { xlnt::workbook wb; - wb.create_sheet().set_title("Sheet1"); wb.create_sheet().set_title("Sheet2"); + wb.create_sheet().set_title("Sheet3"); auto iter = wb.begin(); + TS_ASSERT_EQUALS((*iter).get_title(), "Sheet1"); iter++; - TS_ASSERT_EQUALS((*iter).get_title(), "Sheet1"); + TS_ASSERT_EQUALS((*iter).get_title(), "Sheet2"); auto copy = wb.begin(); copy = iter; - TS_ASSERT_EQUALS((*iter).get_title(), "Sheet1"); + TS_ASSERT_EQUALS((*iter).get_title(), "Sheet2"); TS_ASSERT_EQUALS(iter, copy); iter++; - TS_ASSERT_EQUALS((*iter).get_title(), "Sheet2"); + TS_ASSERT_EQUALS((*iter).get_title(), "Sheet3"); TS_ASSERT_DIFFERS(iter, copy); copy++; - TS_ASSERT_EQUALS((*iter).get_title(), "Sheet2"); + TS_ASSERT_EQUALS((*iter).get_title(), "Sheet3"); TS_ASSERT_EQUALS(iter, copy); } @@ -229,7 +230,7 @@ public: TS_ASSERT(!m.has_default_type("xml")); TS_ASSERT_THROWS(m.get_default_type("xml"), xlnt::key_not_found); TS_ASSERT(!m.has_relationship(xlnt::path("/"), xlnt::relationship::type::office_document)); - TS_ASSERT_THROWS(m.get_relationships(xlnt::path("xl/workbook.xml")), xlnt::key_not_found); + TS_ASSERT(m.get_relationships(xlnt::path("xl/workbook.xml")).empty()); } void test_memory() @@ -237,7 +238,7 @@ public: xlnt::workbook wb, wb2; wb.get_active_sheet().set_title("swap"); std::swap(wb, wb2); - TS_ASSERT_EQUALS(wb.get_active_sheet().get_title(), "Sheet"); + TS_ASSERT_EQUALS(wb.get_active_sheet().get_title(), "Sheet1"); TS_ASSERT_EQUALS(wb2.get_active_sheet().get_title(), "swap"); wb = wb2; TS_ASSERT_EQUALS(wb.get_active_sheet().get_title(), "swap"); diff --git a/source/workbook/workbook.cpp b/source/workbook/workbook.cpp index f44779fb..5f7249f3 100644 --- a/source/workbook/workbook.cpp +++ b/source/workbook/workbook.cpp @@ -135,7 +135,13 @@ workbook workbook::empty_excel() wb.d_->manifest_.register_relationship(uri("/"), relationship::type::extended_properties, uri("docProps/app.xml"), target_mode::internal); - wb.set_application("Microsoft Excel"); + wb.set_creator("Microsoft Office User"); + wb.set_last_modified_by("Microsoft Office User"); + wb.set_created(datetime(2016, 8, 12, 3, 16, 56)); + wb.set_modified(datetime(2016, 8, 12, 3, 17, 16)); + wb.set_application("Microsoft Macintosh Excel"); + wb.set_app_version("15.0300"); + wb.create_sheet(); wb.add_format(format()); wb.create_style("Normal"); @@ -268,8 +274,8 @@ bool workbook::has_named_range(const std::string &name) const worksheet workbook::create_sheet() { - std::string title = "Sheet"; - int index = 0; + std::string title = "Sheet1"; + int index = 1; while (contains(title)) { diff --git a/source/worksheet/tests/test_worksheet.hpp b/source/worksheet/tests/test_worksheet.hpp index 017da9fe..949ac362 100644 --- a/source/worksheet/tests/test_worksheet.hpp +++ b/source/worksheet/tests/test_worksheet.hpp @@ -520,7 +520,7 @@ public: { xlnt::workbook wb; - auto ws = wb.create_sheet(); + auto ws = wb.get_active_sheet(); ws.add_print_title(3); TS_ASSERT_EQUALS(ws.get_print_titles(), "Sheet1!1:3"); @@ -533,7 +533,7 @@ public: { xlnt::workbook wb; - auto ws = wb.create_sheet(); + auto ws = wb.get_active_sheet(); ws.set_print_title_rows("1:4"); TS_ASSERT_EQUALS(ws.get_print_titles(), "Sheet1!1:4"); @@ -955,7 +955,7 @@ public: xlnt::workbook wb; auto ws = wb.get_active_sheet(); auto ws_string = ws.to_string(); - TS_ASSERT_EQUALS(ws_string, ""); + TS_ASSERT_EQUALS(ws_string, ""); } void test_garbage_collect()