finish excel template, fix errors

This commit is contained in:
Thomas Fussell 2016-08-12 23:06:25 -04:00
parent 1b5bdbeb18
commit 4baeeb824f
11 changed files with 284 additions and 208 deletions

View File

@ -35,12 +35,14 @@ namespace xlnt {
class XLNT_CLASS selection class XLNT_CLASS selection
{ {
public: public:
bool has_active_cell() const { return has_active_cell_; }
cell_reference get_active_cell() const { return active_cell_; } cell_reference get_active_cell() const { return active_cell_; }
range_reference get_sqref() const { return sqref_; } range_reference get_sqref() const { return sqref_; }
pane_corner get_pane() const { return pane_; } pane_corner get_pane() const { return pane_; }
void set_pane(pane_corner corner) { pane_ = corner; } void set_pane(pane_corner corner) { pane_ = corner; }
private: private:
bool has_active_cell_ = false;
cell_reference active_cell_; cell_reference active_cell_;
range_reference sqref_; range_reference sqref_;
pane_corner pane_; pane_corner pane_;

View File

@ -294,7 +294,7 @@ public:
auto ws = wb[1]; auto ws = wb[1];
auto cell = ws.get_cell(xlnt::cell_reference(1, 1)); auto cell = ws.get_cell(xlnt::cell_reference(1, 1));
TS_ASSERT(cell.to_repr() == "<Cell Sheet1.A1>"); TS_ASSERT(cell.to_repr() == "<Cell Sheet2.A1>");
} }
void test_comment_assignment() void test_comment_assignment()

View File

@ -51,7 +51,6 @@ struct workbook_impl
write_core_properties_(false), write_core_properties_(false),
created_(xlnt::datetime::now()), created_(xlnt::datetime::now()),
modified_(xlnt::datetime::now()), modified_(xlnt::datetime::now()),
title_("Untitled"),
base_date_(calendar::windows_1900), base_date_(calendar::windows_1900),
write_app_properties_(false), write_app_properties_(false),
application_("libxlnt"), application_("libxlnt"),

View File

@ -827,11 +827,13 @@ void xlsx_consumer::read_manifest()
for (const auto &relationship_source : source_.infolist()) for (const auto &relationship_source : source_.infolist())
{ {
if (relationship_source.filename == path("_rels/.rels") 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_); 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) for (const auto part_rel : part_rels)
{ {

View File

@ -228,8 +228,7 @@ bool write_color(const xlnt::color &color, pugi::xml_node color_node)
bool write_fonts(const std::vector<xlnt::font> &fonts, pugi::xml_node &fonts_node) bool write_fonts(const std::vector<xlnt::font> &fonts, pugi::xml_node &fonts_node)
{ {
fonts_node.append_attribute("count").set_value(std::to_string(fonts.size()).c_str()); 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").set_value(std::to_string(fonts.size()).c_str());
// fonts_node.append_attribute("x14ac:knownFonts", "1");
for (auto &f : fonts) 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()) for (const auto &part : source_.get_manifest().get_parts_with_overriden_types())
{ {
auto override_node = types_node.append_child("Override"); 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); auto content_type = source_.get_manifest().get_override_type(part);
override_node.append_attribute("ContentType").set_value(content_type.c_str()); 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; pugi::xml_document part_rels_document;
write_relationships(part_rels, part_rels_document.root()); 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()); path rels_path(parent.append("_rels").append(part.filename() + ".rels").string());
write_document_to_archive(part_rels_document, rels_path, destination_); 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("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"); 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_node = properties_node.append_child("HeadingPairs");
auto heading_pairs_vector_node = heading_pairs_node.append_child("vt:vector"); auto heading_pairs_vector_node = heading_pairs_node.append_child("vt:vector");
heading_pairs_vector_node.append_attribute("size").set_value("2"); 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()); 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) 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: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: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: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_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()); 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.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.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.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:description");
core_properties_node.append_child("dc:subject"); core_properties_node.append_child("dc:subject");
core_properties_node.append_child("cp:keywords"); core_properties_node.append_child("cp:keywords");
core_properties_node.append_child("cp:category"); core_properties_node.append_child("cp:category");
*/
} }
void xlsx_producer::write_custom_properties(const relationship &rel, pugi::xml_node root) 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) void xlsx_producer::write_workbook(const relationship &rel, pugi::xml_node root)
{ {
std::size_t num_visible = 0; std::size_t num_visible = 0;
bool any_defined_names = false;
for (auto ws : source_) for (auto ws : source_)
{ {
@ -757,6 +766,11 @@ void xlsx_producer::write_workbook(const relationship &rel, pugi::xml_node root)
{ {
num_visible++; num_visible++;
} }
if (ws.has_auto_filter())
{
any_defined_names = true;
}
} }
if (num_visible == 0) 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").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: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"); auto file_version_node = workbook_node.append_child("fileVersion");
file_version_node.append_attribute("appName").set_value("xl"); file_version_node.append_attribute("appName").set_value("xl");
file_version_node.append_attribute("lastEdited").set_value("4"); file_version_node.append_attribute("lastEdited").set_value("6");
file_version_node.append_attribute("lowestEdited").set_value("4"); file_version_node.append_attribute("lowestEdited").set_value("6");
file_version_node.append_attribute("rupBuild").set_value("4505"); file_version_node.append_attribute("rupBuild").set_value("29709");
auto workbook_pr_node = workbook_node.append_child("workbookPr"); auto workbook_pr_node = workbook_node.append_child("workbookPr");
/*
workbook_pr_node.append_attribute("codeName").set_value("ThisWorkbook"); workbook_pr_node.append_attribute("codeName").set_value("ThisWorkbook");
workbook_pr_node.append_attribute("defaultThemeVersion").set_value("124226"); 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"); 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 book_views_node = workbook_node.append_child("bookViews");
auto workbook_view_node = book_views_node.append_child("workbookView"); auto workbook_view_node = book_views_node.append_child("workbookView");
workbook_view_node.append_attribute("activeTab").set_value("0"); //workbook_view_node.append_attribute("activeTab").set_value("0");
workbook_view_node.append_attribute("autoFilterDateGrouping").set_value("1"); //workbook_view_node.append_attribute("autoFilterDateGrouping").set_value("1");
workbook_view_node.append_attribute("firstSheet").set_value("0"); //workbook_view_node.append_attribute("firstSheet").set_value("0");
workbook_view_node.append_attribute("minimized").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("showHorizontalScroll").set_value("1");
workbook_view_node.append_attribute("showSheetTabs").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("showVerticalScroll").set_value("1");
workbook_view_node.append_attribute("tabRatio").set_value("600"); //workbook_view_node.append_attribute("tabRatio").set_value("600");
workbook_view_node.append_attribute("visibility").set_value("visible"); //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 sheets_node = workbook_node.append_child("sheets");
auto defined_names_node = workbook_node.append_child("definedNames"); pugi::xml_node defined_names_node;
auto wb_rel = source_.d_->manifest_.get_relationship(path("/"), xlnt::relationship::type::office_document); if (any_defined_names)
{
defined_names_node = workbook_node.append_child("definedNames");
}
for (const auto ws : source_) for (const auto ws : source_)
{ {
auto sheet_rel_id = source_.d_->sheet_title_rel_id_map_[ws.get_title()]; 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"); auto sheet_node = sheets_node.append_child("sheet");
sheet_node.append_attribute("name").set_value(ws.get_title().c_str()); 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"); auto calc_pr_node = workbook_node.append_child("calcPr");
calc_pr_node.append_attribute("calcId").set_value("124519"); calc_pr_node.append_attribute("calcId").set_value("150000");
calc_pr_node.append_attribute("calcMode").set_value("auto"); //calc_pr_node.append_attribute("calcMode").set_value("auto");
calc_pr_node.append_attribute("fullCalcOnLoad").set_value("1"); //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()) 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()); 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())) 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"); auto colors_node = stylesheet_node.append_child("colors");
write_colors(stylesheet.colors, colors_node); 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) 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_element> scheme_elements = { std::vector<scheme_element> scheme_elements = {
{ "a:dk1", "a:sysClr", "windowText" },{ "a:lt1", "a:sysClr", "window" }, { "a:dk1", "a:sysClr", "windowText" },{ "a:lt1", "a:sysClr", "window" },
{ "a:dk2", "a:srgbClr", "1F497D" },{ "a:lt2", "a:srgbClr", "EEECE1" }, { "a:dk2", "a:srgbClr", "44546A" },{ "a:lt2", "a:srgbClr", "E7E6E6" },
{ "a:accent1", "a:srgbClr", "4F81BD" },{ "a:accent2", "a:srgbClr", "C0504D" }, { "a:accent1", "a:srgbClr", "5B9BD5" },{ "a:accent2", "a:srgbClr", "ED7D31" },
{ "a:accent3", "a:srgbClr", "9BBB59" },{ "a:accent4", "a:srgbClr", "8064A2" }, { "a:accent3", "a:srgbClr", "A5A5A5" },{ "a:accent4", "a:srgbClr", "FFC000" },
{ "a:accent5", "a:srgbClr", "4BACC6" },{ "a:accent6", "a:srgbClr", "F79646" }, { "a:accent5", "a:srgbClr", "4472C4" },{ "a:accent6", "a:srgbClr", "70AD47" },
{ "a:hlink", "a:srgbClr", "0000FF" },{ "a:folHlink", "a:srgbClr", "800080" }, { "a:hlink", "a:srgbClr", "0563C1" },{ "a:folHlink", "a:srgbClr", "954F72" },
}; };
for (auto element : scheme_elements) for (auto element : scheme_elements)
@ -1135,14 +1185,13 @@ void xlsx_producer::write_theme(const relationship &rel, pugi::xml_node root)
}; };
std::vector<font_scheme> font_schemes = { std::vector<font_scheme> font_schemes = {
{ true, "a:latin", "Cambria", "Calibri" }, { true, "a:latin", "Calibri Light", "Calibri" },
{ true, "a:ea", "", "" }, { true, "a:ea", "", "" },
{ true, "a:cs", "", "" }, { 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", { false, "Jpan", "Yu Gothic Light", "Yu Gothic" },
"\xef\xbc\xad\xef\xbc\xb3 \xef\xbc\xb0\xe3\x82\xb4\xe3\x82\xb7\xe3\x83\x83\xe3\x82\xaf" },
{ false, "Hang", "\xeb\xa7\x91\xec\x9d\x80 \xea\xb3\xa0\xeb\x94\x95", { 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" }, "\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", { 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" }, "\xe6\x96\xb0\xe7\xb4\xb0\xe6\x98\x8e\xe9\xab\x94" },
{ false, "Arab", "Times New Roman", "Arial" }, { 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, "Sinh", "Iskoola Pota", "Iskoola Pota" },
{ false, "Mong", "Mongolian Baiti", "Mongolian Baiti" }, { false, "Mong", "Mongolian Baiti", "Mongolian Baiti" },
{ false, "Viet", "Times New Roman", "Arial" }, { 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"); 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()); 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()); 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()); 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()); 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 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"); gs_node.append_attribute("pos").set_value("0");
auto scheme_color_node = gs_node.append_child("a:schemeClr"); auto scheme_color_node = gs_node.append_child("a:schemeClr");
scheme_color_node.append_attribute("val").set_value("phClr"); 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:lumMod").append_attribute("val").set_value("110000");
scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("300000"); 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 = 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 = gs_node.append_child("a:schemeClr");
scheme_color_node.append_attribute("val").set_value("phClr"); 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:lumMod").append_attribute("val").set_value("105000");
scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("300000"); 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 = grad_fill_list.append_child("a:gs");
gs_node.append_attribute("pos").set_value("100000"); gs_node.append_attribute("pos").set_value("100000");
scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node = gs_node.append_child("a:schemeClr");
scheme_color_node.append_attribute("val").set_value("phClr"); 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:lumMod").append_attribute("val").set_value("105000");
scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("350000"); 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"); auto 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("1"); lin_node.append_attribute("scaled").set_value("0");
grad_fill_node = fill_style_list_node.append_child("a:gradFill"); grad_fill_node = fill_style_list_node.append_child("a:gradFill");
grad_fill_node.append_attribute("rotWithShape").set_value("1"); 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"); gs_node.append_attribute("pos").set_value("0");
scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node = gs_node.append_child("a:schemeClr");
scheme_color_node.append_attribute("val").set_value("phClr"); 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("103000");
scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("130000"); 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 = 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 = gs_node.append_child("a:schemeClr");
scheme_color_node.append_attribute("val").set_value("phClr"); 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("110000");
scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("130000"); 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 = grad_fill_list.append_child("a:gs");
gs_node.append_attribute("pos").set_value("100000"); gs_node.append_attribute("pos").set_value("100000");
scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node = gs_node.append_child("a:schemeClr");
scheme_color_node.append_attribute("val").set_value("phClr"); 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:lumMod").append_attribute("val").set_value("99000");
scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("135000"); 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 = 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"); lin_node.append_attribute("scaled").set_value("0");
auto line_style_list_node = format_scheme_node.append_child("a:lnStyleLst"); auto line_style_list_node = format_scheme_node.append_child("a:lnStyleLst");
auto ln_node = line_style_list_node.append_child("a:ln"); 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("cap").set_value("flat");
ln_node.append_attribute("cmpd").set_value("sng"); ln_node.append_attribute("cmpd").set_value("sng");
ln_node.append_attribute("algn").set_value("ctr"); 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"); auto solid_fill_node = ln_node.append_child("a:solidFill");
scheme_color_node = solid_fill_node.append_child("a:schemeClr"); scheme_color_node = solid_fill_node.append_child("a:schemeClr");
scheme_color_node.append_attribute("val").set_value("phClr"); 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: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 = 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("cap").set_value("flat");
ln_node.append_attribute("cmpd").set_value("sng"); ln_node.append_attribute("cmpd").set_value("sng");
ln_node.append_attribute("algn").set_value("ctr"); 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 = solid_fill_node.append_child("a:schemeClr");
scheme_color_node.append_attribute("val").set_value("phClr"); 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: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 = 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("cap").set_value("flat");
ln_node.append_attribute("cmpd").set_value("sng"); ln_node.append_attribute("cmpd").set_value("sng");
ln_node.append_attribute("algn").set_value("ctr"); 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 = solid_fill_node.append_child("a:schemeClr");
scheme_color_node.append_attribute("val").set_value("phClr"); 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: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_list_node = format_scheme_node.append_child("a:effectStyleLst");
auto effect_style_node = effect_style_list_node.append_child("a:effectStyle"); auto effect_style_node = effect_style_list_node.append_child("a:effectStyle");
auto effect_list_node = effect_style_node.append_child("a:effectLst"); 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"); 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("blurRad").set_value("57150");
outer_shadow_node.append_attribute("dist").set_value("20000"); outer_shadow_node.append_attribute("dist").set_value("19050");
outer_shadow_node.append_attribute("dir").set_value("5400000"); 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"); outer_shadow_node.append_attribute("rotWithShape").set_value("0");
auto srgb_clr_node = outer_shadow_node.append_child("a:srgbClr"); auto srgb_clr_node = outer_shadow_node.append_child("a:srgbClr");
srgb_clr_node.append_attribute("val").set_value("000000"); srgb_clr_node.append_attribute("val").set_value("000000");
srgb_clr_node.append_child("a:alpha").append_attribute("val").set_value("38000"); srgb_clr_node.append_child("a:alpha").append_attribute("val").set_value("63000");
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");
auto bg_fill_style_list_node = format_scheme_node.append_child("a:bgFillStyleLst"); 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"); 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"); scheme_color_node = bg_fill_style_list_node.append_child("a:solidFill").append_child("a:schemeClr");
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.append_attribute("val").set_value("phClr"); 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:tint").append_attribute("val").set_value("95000");
scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("350000"); scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("170000");
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");
grad_fill_node = bg_fill_style_list_node.append_child("a:gradFill"); grad_fill_node = bg_fill_style_list_node.append_child("a:gradFill");
grad_fill_node.append_attribute("rotWithShape").set_value("1"); 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"); gs_node.append_attribute("pos").set_value("0");
scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node = gs_node.append_child("a:schemeClr");
scheme_color_node.append_attribute("val").set_value("phClr"); 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:tint").append_attribute("val").set_value("93000");
scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("300000"); 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 = grad_fill_list.append_child("a:gs");
gs_node.append_attribute("pos").set_value("100000"); gs_node.append_attribute("pos").set_value("100000");
scheme_color_node = gs_node.append_child("a:schemeClr"); scheme_color_node = gs_node.append_child("a:schemeClr");
scheme_color_node.append_attribute("val").set_value("phClr"); 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:shade").append_attribute("val").set_value("63000");
scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("200000"); scheme_color_node.append_child("a:satMod").append_attribute("val").set_value("120000");
path_node = grad_fill_node.append_child("a:path"); lin_node = grad_fill_node.append_child("a:lin");
path_node.append_attribute("path").set_value("circle"); lin_node.append_attribute("ang").set_value("5400000");
fill_to_rect_node = path_node.append_child("a:fillToRect"); lin_node.append_attribute("scaled").set_value("0");
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");
theme_node.append_child("a:objectDefaults"); theme_node.append_child("a:objectDefaults");
theme_node.append_child("a:extraClrSchemeLst"); 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) 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"); 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").set_value("http://schemas.openxmlformats.org/spreadsheetml/2006/main");
worksheet_node.append_attribute("xmlns:r").set_value("http://schemas.openxmlformats.org/package/2006/relationships"); 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");
auto sheet_pr_node = worksheet_node.append_child("sheetPr"); worksheet_node.append_attribute("mc:Ignorable").set_value("x14ac");
auto outline_pr_node = sheet_pr_node.append_child("outlinePr"); worksheet_node.append_attribute("xmlns:x14ac").set_value("http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac");
outline_pr_node.append_attribute("summaryBelow").set_value("1");
outline_pr_node.append_attribute("summaryRight").set_value("1");
auto title = std::find_if(source_.d_->sheet_title_rel_id_map_.begin(), auto title = std::find_if(source_.d_->sheet_title_rel_id_map_.begin(),
source_.d_->sheet_title_rel_id_map_.end(), 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()) 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"); 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"); 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"); 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_views_node = worksheet_node.append_child("sheetViews");
auto sheet_view_node = sheet_views_node.append_child("sheetView"); 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("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("activePane").set_value(active_pane.c_str());
pane_node.append_attribute("state").set_value("frozen"); 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) if (ws.get_frozen_panes().get_row() > 1 && ws.get_frozen_panes().get_column_index() > 1)
{ {
selection_node.append_attribute("pane").set_value("bottomRight"); 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"; if (!ws.get_sheet_view().get_selections().empty())
selection_node.append_attribute("activeCell").set_value(active_cell.c_str()); {
selection_node.append_attribute("sqref").set_value(active_cell.c_str()); 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"); auto sheet_format_pr_node = worksheet_node.append_child("sheetFormatPr");
sheet_format_pr_node.append_attribute("baseColWidth").set_value("10"); sheet_format_pr_node.append_attribute("baseColWidth").set_value("10");

View File

@ -78,9 +78,11 @@ std::vector<relationship> manifest::get_relationships(const path &part, relation
std::string manifest::get_content_type(const path &part) const 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())) if (has_default_type(part.extension()))

View File

@ -44,10 +44,26 @@ char system_separator()
return '\\'; return '\\';
} }
bool is_drive_letter(char letter)
{
return letter >= 'A' && letter <= 'Z';
}
bool is_root(const std::string &part) bool is_root(const std::string &part)
{ {
return part == "/" || (part.size() == 2 && part.back() == ':' if (part.size() == 1 && part[0] == '/') return true;
&& part.front() >= 'A' && part.front() <= 'Z'); 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 #else
@ -127,8 +143,7 @@ bool path::is_relative() const
bool path::is_absolute() const bool path::is_absolute() const
{ {
auto split_path = split(); return ::is_absolute(internal_);
return !split_path.empty() && ::is_root(split_path.front());
} }
bool path::is_root() const 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); return last_dot == std::string::npos ? "" : base.substr(last_dot + 1);
} }
std::pair<std::string, std::string> 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 // conversion
std::string path::string() const 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 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 char path::guess_separator() const
{ {
if (system_separator() == '/') return '/'; if (system_separator() == '/' || internal_.empty() || internal_.front() == '/') return '/';
if (is_absolute()) return internal_.at(2); 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) bool operator==(const path &left, const path &right)

View File

@ -40,7 +40,6 @@ public:
void test_round_trip_minimal_wr() void test_round_trip_minimal_wr()
{ {
TS_SKIP("");
xlnt::workbook wb = xlnt::workbook::minimal(); xlnt::workbook wb = xlnt::workbook::minimal();
TS_ASSERT(round_trip_matches_wr(wb)); TS_ASSERT(round_trip_matches_wr(wb));
} }

View File

@ -52,7 +52,7 @@ public:
ws.get_cell("B3").set_value(2); ws.get_cell("B3").set_value(2);
ws.set_title("Active"); ws.set_title("Active");
wb.copy_sheet(ws, 0); 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<int>(), 2); TS_ASSERT_EQUALS(wb.get_sheet_by_index(0).get_cell("B3").get_value<int>(), 2);
TS_ASSERT_EQUALS(wb.get_sheet_titles().at(1), "Active"); TS_ASSERT_EQUALS(wb.get_sheet_titles().at(1), "Active");
TS_ASSERT_EQUALS(wb.get_sheet_by_index(1).get_cell("B3").get_value<int>(), 2); TS_ASSERT_EQUALS(wb.get_sheet_by_index(1).get_cell("B3").get_value<int>(), 2);
@ -95,7 +95,7 @@ public:
void test_index_operator() // test_getitem void test_index_operator() // test_getitem
{ {
xlnt::workbook wb; xlnt::workbook wb;
TS_ASSERT_THROWS_NOTHING(wb["Sheet"]); TS_ASSERT_THROWS_NOTHING(wb["Sheet1"]);
TS_ASSERT_THROWS(wb["NotThere"], xlnt::key_not_found); TS_ASSERT_THROWS(wb["NotThere"], xlnt::key_not_found);
} }
@ -104,7 +104,7 @@ public:
void test_contains() void test_contains()
{ {
xlnt::workbook wb; xlnt::workbook wb;
TS_ASSERT(wb.contains("Sheet")); TS_ASSERT(wb.contains("Sheet1"));
TS_ASSERT(!wb.contains("NotThere")); TS_ASSERT(!wb.contains("NotThere"));
} }
@ -114,7 +114,7 @@ public:
for(auto ws : wb) 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; xlnt::workbook wb;
wb.create_sheet().set_title("test_get_sheet_titles"); wb.create_sheet().set_title("test_get_sheet_titles");
const std::vector<std::string> expected_titles = { "Sheet", "test_get_sheet_titles" }; const std::vector<std::string> expected_titles = { "Sheet1", "test_get_sheet_titles" };
TS_ASSERT_EQUALS(wb.get_sheet_titles(), expected_titles); TS_ASSERT_EQUALS(wb.get_sheet_titles(), expected_titles);
} }
@ -177,23 +177,23 @@ public:
{ {
xlnt::workbook wb; xlnt::workbook wb;
wb.create_sheet().set_title("Sheet1");
wb.create_sheet().set_title("Sheet2"); wb.create_sheet().set_title("Sheet2");
wb.create_sheet().set_title("Sheet3");
auto iter = wb.begin(); auto iter = wb.begin();
TS_ASSERT_EQUALS((*(iter++)).get_title(), "Sheet");
TS_ASSERT_EQUALS((*(iter++)).get_title(), "Sheet1"); TS_ASSERT_EQUALS((*(iter++)).get_title(), "Sheet1");
TS_ASSERT_EQUALS((*(iter++)).get_title(), "Sheet2"); TS_ASSERT_EQUALS((*(iter++)).get_title(), "Sheet2");
TS_ASSERT_EQUALS((*(iter++)).get_title(), "Sheet3");
TS_ASSERT_EQUALS(iter, wb.end()); TS_ASSERT_EQUALS(iter, wb.end());
const auto wb_const = wb; const auto wb_const = wb;
auto const_iter = wb_const.begin(); 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(), "Sheet1");
TS_ASSERT_EQUALS((*(const_iter++)).get_title(), "Sheet2"); TS_ASSERT_EQUALS((*(const_iter++)).get_title(), "Sheet2");
TS_ASSERT_EQUALS((*(const_iter++)).get_title(), "Sheet3");
TS_ASSERT_EQUALS(const_iter, wb_const.end()); TS_ASSERT_EQUALS(const_iter, wb_const.end());
} }
@ -201,25 +201,26 @@ public:
{ {
xlnt::workbook wb; xlnt::workbook wb;
wb.create_sheet().set_title("Sheet1");
wb.create_sheet().set_title("Sheet2"); wb.create_sheet().set_title("Sheet2");
wb.create_sheet().set_title("Sheet3");
auto iter = wb.begin(); auto iter = wb.begin();
TS_ASSERT_EQUALS((*iter).get_title(), "Sheet1");
iter++; iter++;
TS_ASSERT_EQUALS((*iter).get_title(), "Sheet1"); TS_ASSERT_EQUALS((*iter).get_title(), "Sheet2");
auto copy = wb.begin(); auto copy = wb.begin();
copy = iter; copy = iter;
TS_ASSERT_EQUALS((*iter).get_title(), "Sheet1"); TS_ASSERT_EQUALS((*iter).get_title(), "Sheet2");
TS_ASSERT_EQUALS(iter, copy); TS_ASSERT_EQUALS(iter, copy);
iter++; iter++;
TS_ASSERT_EQUALS((*iter).get_title(), "Sheet2"); TS_ASSERT_EQUALS((*iter).get_title(), "Sheet3");
TS_ASSERT_DIFFERS(iter, copy); TS_ASSERT_DIFFERS(iter, copy);
copy++; copy++;
TS_ASSERT_EQUALS((*iter).get_title(), "Sheet2"); TS_ASSERT_EQUALS((*iter).get_title(), "Sheet3");
TS_ASSERT_EQUALS(iter, copy); TS_ASSERT_EQUALS(iter, copy);
} }
@ -229,7 +230,7 @@ public:
TS_ASSERT(!m.has_default_type("xml")); TS_ASSERT(!m.has_default_type("xml"));
TS_ASSERT_THROWS(m.get_default_type("xml"), xlnt::key_not_found); 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(!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() void test_memory()
@ -237,7 +238,7 @@ public:
xlnt::workbook wb, wb2; xlnt::workbook wb, wb2;
wb.get_active_sheet().set_title("swap"); wb.get_active_sheet().set_title("swap");
std::swap(wb, wb2); 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"); TS_ASSERT_EQUALS(wb2.get_active_sheet().get_title(), "swap");
wb = wb2; wb = wb2;
TS_ASSERT_EQUALS(wb.get_active_sheet().get_title(), "swap"); TS_ASSERT_EQUALS(wb.get_active_sheet().get_title(), "swap");

View File

@ -135,7 +135,13 @@ workbook workbook::empty_excel()
wb.d_->manifest_.register_relationship(uri("/"), relationship::type::extended_properties, wb.d_->manifest_.register_relationship(uri("/"), relationship::type::extended_properties,
uri("docProps/app.xml"), target_mode::internal); 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.create_sheet();
wb.add_format(format()); wb.add_format(format());
wb.create_style("Normal"); wb.create_style("Normal");
@ -268,8 +274,8 @@ bool workbook::has_named_range(const std::string &name) const
worksheet workbook::create_sheet() worksheet workbook::create_sheet()
{ {
std::string title = "Sheet"; std::string title = "Sheet1";
int index = 0; int index = 1;
while (contains(title)) while (contains(title))
{ {

View File

@ -520,7 +520,7 @@ public:
{ {
xlnt::workbook wb; xlnt::workbook wb;
auto ws = wb.create_sheet(); auto ws = wb.get_active_sheet();
ws.add_print_title(3); ws.add_print_title(3);
TS_ASSERT_EQUALS(ws.get_print_titles(), "Sheet1!1:3"); TS_ASSERT_EQUALS(ws.get_print_titles(), "Sheet1!1:3");
@ -533,7 +533,7 @@ public:
{ {
xlnt::workbook wb; xlnt::workbook wb;
auto ws = wb.create_sheet(); auto ws = wb.get_active_sheet();
ws.set_print_title_rows("1:4"); ws.set_print_title_rows("1:4");
TS_ASSERT_EQUALS(ws.get_print_titles(), "Sheet1!1:4"); TS_ASSERT_EQUALS(ws.get_print_titles(), "Sheet1!1:4");
@ -955,7 +955,7 @@ public:
xlnt::workbook wb; xlnt::workbook wb;
auto ws = wb.get_active_sheet(); auto ws = wb.get_active_sheet();
auto ws_string = ws.to_string(); auto ws_string = ws.to_string();
TS_ASSERT_EQUALS(ws_string, "<Worksheet \"Sheet\">"); TS_ASSERT_EQUALS(ws_string, "<Worksheet \"Sheet1\">");
} }
void test_garbage_collect() void test_garbage_collect()