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
{
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_;

View File

@ -294,7 +294,7 @@ public:
auto ws = wb[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()

View File

@ -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"),

View File

@ -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)
{

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)
{
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_element> 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_scheme> 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");

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
{
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()))

View File

@ -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<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
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)

View File

@ -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));
}

View File

@ -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<int>(), 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<int>(), 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<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);
}
@ -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");

View File

@ -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))
{

View File

@ -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, "<Worksheet \"Sheet\">");
TS_ASSERT_EQUALS(ws_string, "<Worksheet \"Sheet1\">");
}
void test_garbage_collect()