continue working through xml problems as a result of fixing xml comparison

pull/108/head
Thomas Fussell 2016-12-26 09:38:26 -05:00
parent c8f2ca204b
commit c637f412b6
13 changed files with 217 additions and 97 deletions

View File

@ -54,7 +54,7 @@ public:
/// <summary>
///
/// </summary>
operator bool() const
explicit operator bool() const
{
return is_set();
}

View File

@ -32,6 +32,9 @@ namespace xlnt {
/// </summary>
class XLNT_API calculation_properties
{
public:
std::size_t calc_id;
bool concurrent_calc;
};
} // namespace xlnt

View File

@ -318,6 +318,23 @@ public:
template <typename T = std::string>
void core_property(const std::string &property_name, const T value);
/// <summary>
/// Returns true if the workbook has the extended property with the given name.
/// </summary>
bool has_extended_property(const std::string &property_name) const;
/// <summary>
///
/// </summary>
template <typename T = std::string>
T extended_property(const std::string &property_name) const;
/// <summary>
///
/// </summary>
template <typename T = std::string>
void extended_property(const std::string &property_name, const T value);
/// <summary>
///
/// </summary>

View File

@ -25,6 +25,7 @@
#include <cstddef>
#include <xlnt/xlnt_config.hpp>
#include <xlnt/utils/optional.hpp>
namespace xlnt {
@ -68,37 +69,37 @@ public:
/// <summary>
///
/// </summary>
std::size_t active_tab = 0;
optional<std::size_t> active_tab;
/// <summary>
///
/// </summary>
std::size_t first_sheet = 0;
optional<std::size_t> first_sheet;
/// <summary>
///
/// </summary>
std::size_t tab_ratio = 500;
optional<std::size_t> tab_ratio;
/// <summary>
///
/// </summary>
std::size_t window_width = 28800;
optional<std::size_t> window_width;
/// <summary>
///
/// </summary>
std::size_t window_height = 17460;
optional<std::size_t> window_height;
/// <summary>
///
/// </summary>
std::size_t x_window = 0;
optional<std::size_t> x_window;
/// <summary>
///
/// </summary>
std::size_t y_window = 460;
optional<std::size_t> y_window;
};
} // namespace xlnt

View File

@ -548,21 +548,21 @@ const workbook &cell::workbook() const
std::pair<int, int> cell::anchor() const
{
int left = 0;
double left = 0;
for (column_t column_index = 1; column_index <= d_->column_ - 1; column_index++)
{
left += worksheet().cell(column_index, row()).width();
}
int top = 0;
double top = 0;
for (row_t row_index = 1; row_index <= d_->row_ - 1; row_index++)
{
top += worksheet().cell(column(), row_index).height();
}
return {left, top};
return {static_cast<int>(left), static_cast<int>(top)};
}
cell::type cell::data_type() const
@ -955,7 +955,7 @@ protection cell::protection() const
bool cell::has_hyperlink() const
{
return d_->hyperlink_;
return d_->hyperlink_.is_set();
}
// comment
@ -997,7 +997,7 @@ void cell::comment(const class comment &new_comment)
// offset comment 5 pixels down and 5 pixels right of the top right corner of the cell
auto cell_position = anchor();
cell_position.first += width() + 5;
cell_position.first += static_cast<int>(width()) + 5;
cell_position.second += 5;
d_->comment_.get().position(cell_position.first, cell_position.second);

View File

@ -320,7 +320,7 @@ std::array<xlnt::optional<xlnt::rich_text>, 3> parse_header_footer(const std::st
{
current_run.second = xlnt::font();
}
current_run.second.get().size(static_cast<std::size_t>(std::stoi(current_token.value)));
current_run.second.get().size(std::stod(current_token.value));
break;
case hf_code::text_font_color:
@ -1328,7 +1328,7 @@ void xlsx_consumer::read_stylesheet()
if (font_property_element == xml::qname(xmlns, "sz"))
{
new_font.size(parser().attribute<std::size_t>("val"));
new_font.size(parser().attribute<double>("val"));
}
else if (font_property_element == xml::qname(xmlns, "name"))
{
@ -2692,7 +2692,7 @@ rich_text xlsx_consumer::read_rich_text(const xml::qname &parent)
if (current_run_property_element == xml::qname(xmlns, "sz"))
{
run.second.get().size(parser().attribute<std::size_t>("val"));
run.second.get().size(parser().attribute<double>("val"));
}
else if (current_run_property_element == xml::qname(xmlns, "rFont"))
{

View File

@ -238,19 +238,19 @@ void xlsx_producer::write_extended_properties(const relationship & /*rel*/)
serializer().namespace_decl(xmlns, "");
serializer().namespace_decl(xmlns_vt, "vt");
if (source_.has_core_property("Application"))
if (source_.has_extended_property("Application"))
{
serializer().element(xmlns, "Application", source_.core_property("Application"));
serializer().element(xmlns, "Application", source_.extended_property("Application"));
}
if (source_.has_core_property("DocSecurity"))
if (source_.has_extended_property("DocSecurity"))
{
serializer().element(xmlns, "DocSecurity", source_.core_property("DocSecurity"));
serializer().element(xmlns, "DocSecurity", source_.extended_property("DocSecurity"));
}
if (source_.has_core_property("ScaleCrop"))
if (source_.has_extended_property("ScaleCrop"))
{
serializer().element(xmlns, "ScaleCrop", source_.core_property("ScaleCrop"));
serializer().element(xmlns, "ScaleCrop", source_.extended_property("ScaleCrop"));
}
serializer().start_element(xmlns, "HeadingPairs");
@ -279,29 +279,29 @@ void xlsx_producer::write_extended_properties(const relationship & /*rel*/)
serializer().end_element(xmlns_vt, "vector");
serializer().end_element(xmlns, "TitlesOfParts");
if (source_.has_core_property("Company"))
if (source_.has_extended_property("Company"))
{
serializer().element(xmlns, "Company", source_.core_property("Company"));
serializer().element(xmlns, "Company", source_.extended_property("Company"));
}
if (source_.has_core_property("LinksUpToDate"))
if (source_.has_extended_property("LinksUpToDate"))
{
serializer().element(xmlns, "LinksUpToDate", source_.core_property("LinksUpToDate"));
serializer().element(xmlns, "LinksUpToDate", source_.extended_property("LinksUpToDate"));
}
if (source_.has_core_property("LinksUpToDate"))
if (source_.has_extended_property("SharedDoc"))
{
serializer().element(xmlns, "SharedDoc", source_.core_property("SharedDoc"));
serializer().element(xmlns, "SharedDoc", source_.extended_property("SharedDoc"));
}
if (source_.has_core_property("LinksUpToDate"))
if (source_.has_extended_property("HyperlinksChanged"))
{
serializer().element(xmlns, "HyperlinksChanged", source_.core_property("HyperlinksChanged"));
serializer().element(xmlns, "HyperlinksChanged", source_.extended_property("HyperlinksChanged"));
}
if (source_.has_core_property("LinksUpToDate"))
if (source_.has_extended_property("AppVersion"))
{
serializer().element(xmlns, "AppVersion", source_.core_property("AppVersion"));
serializer().element(xmlns, "AppVersion", source_.extended_property("AppVersion"));
}
serializer().end_element(xmlns, "Properties");
@ -426,23 +426,20 @@ void xlsx_producer::write_workbook(const relationship &rel)
serializer().end_element(xmlns, "fileVersion");
}
if (source_.has_code_name() || source_.base_date() == calendar::mac_1904)
serializer().start_element(xmlns, "workbookPr");
if (source_.has_code_name())
{
serializer().start_element(xmlns, "workbookPr");
if (source_.has_code_name())
{
serializer().attribute("codeName", source_.code_name());
}
if (source_.base_date() == calendar::mac_1904)
{
serializer().attribute("date1904", "1");
}
serializer().end_element(xmlns, "workbookPr");
serializer().attribute("codeName", source_.code_name());
}
if (source_.base_date() == calendar::mac_1904)
{
serializer().attribute("date1904", "1");
}
serializer().end_element(xmlns, "workbookPr");
if (source_.has_view())
{
serializer().start_element(xmlns, "bookViews");
@ -450,20 +447,70 @@ void xlsx_producer::write_workbook(const relationship &rel)
const auto &view = source_.view();
serializer().attribute("activeTab", "0");
serializer().attribute("autoFilterDateGrouping", "1");
serializer().attribute("firstSheet", "0");
serializer().attribute("minimized", "0");
serializer().attribute("showHorizontalScroll", "1");
serializer().attribute("showSheetTabs", "1");
serializer().attribute("showVerticalScroll", "1");
serializer().attribute("visibility", "visible");
if (view.active_tab.is_set())
{
serializer().attribute("activeTab", view.active_tab.get());
}
serializer().attribute("xWindow", view.x_window);
serializer().attribute("yWindow", view.y_window);
serializer().attribute("windowWidth", view.window_width);
serializer().attribute("windowHeight", view.window_height);
serializer().attribute("tabRatio", view.tab_ratio);
if (view.auto_filter_date_grouping)
{
serializer().attribute("autoFilterDateGrouping", write_bool(view.auto_filter_date_grouping));
}
if (view.first_sheet.is_set())
{
serializer().attribute("firstSheet", view.first_sheet.get());
}
if (view.minimized)
{
serializer().attribute("minimized", write_bool(view.minimized));
}
if (view.show_horizontal_scroll)
{
serializer().attribute("showHorizontalScroll", write_bool(view.show_horizontal_scroll));
}
if (view.show_sheet_tabs)
{
serializer().attribute("showSheetTabs", write_bool(view.show_sheet_tabs));
}
if (view.show_vertical_scroll)
{
serializer().attribute("showVerticalScroll", write_bool(view.show_vertical_scroll));
}
if (!view.visible)
{
serializer().attribute("visibility", write_bool(view.visible));
}
if (view.x_window.is_set())
{
serializer().attribute("xWindow", view.x_window.get());
}
if (view.y_window.is_set())
{
serializer().attribute("yWindow", view.y_window.get());
}
if (view.window_width.is_set())
{
serializer().attribute("windowWidth", view.window_width.get());
}
if (view.window_height.is_set())
{
serializer().attribute("windowHeight", view.window_height.get());
}
if (view.tab_ratio.is_set())
{
serializer().attribute("tabRatio", view.tab_ratio.get());
}
serializer().end_element(xmlns, "workbookView");
serializer().end_element(xmlns, "bookViews");
@ -516,10 +563,10 @@ void xlsx_producer::write_workbook(const relationship &rel)
if (source_.has_calculation_properties())
{
serializer().start_element(xmlns, "calcPr");
serializer().attribute("calcId", 150000);
serializer().attribute("calcMode", "auto");
serializer().attribute("fullCalcOnLoad", "1");
serializer().attribute("concurrentCalc", "0");
serializer().attribute("calcId", source_.calculation_properties().calc_id);
//serializer().attribute("calcMode", "auto");
//serializer().attribute("fullCalcOnLoad", "1");
serializer().attribute("concurrentCalc", write_bool(source_.calculation_properties().concurrent_calc));
serializer().end_element(xmlns, "calcPr");
}
@ -2862,7 +2909,7 @@ xml::serializer &xlsx_producer::serializer()
std::string xlsx_producer::write_bool(bool boolean) const
{
return boolean ? "true" : "false";
return boolean ? "1" : "0";
}
void xlsx_producer::write_relationships(const std::vector<xlnt::relationship> &relationships, const path &part)

View File

@ -58,7 +58,7 @@ format format::style(const std::string &new_style)
bool format::has_style() const
{
return d_->style;
return d_->style.is_set();
}
const style format::style() const

View File

@ -112,6 +112,12 @@ bool workbook::has_core_property(const std::string &property_name) const
return d_->core_properties_.count(property_name) > 0;
}
template <>
std::string workbook::core_property(const std::string &property_name) const
{
return d_->core_properties_.at(property_name);
}
template <>
void workbook::core_property(const std::string &property_name, const std::string value)
{
@ -130,27 +136,56 @@ void workbook::core_property(const std::string &property_name, const datetime va
d_->core_properties_[property_name] = value.to_iso_string();
}
bool workbook::has_extended_property(const std::string &property_name) const
{
return d_->extended_properties_.count(property_name) > 0;
}
template <>
void workbook::extended_property(const std::string &property_name, const std::string value)
{
d_->extended_properties_[property_name] = value;
}
template <>
void workbook::extended_property(const std::string &property_name, const char *value)
{
d_->extended_properties_[property_name] = value;
}
template <>
void workbook::extended_property(const std::string &property_name, const datetime value)
{
d_->extended_properties_[property_name] = value.to_iso_string();
}
template <>
std::string workbook::extended_property(const std::string &property_name) const
{
return d_->extended_properties_.at(property_name);
}
workbook workbook::minimal()
{
auto impl = new detail::workbook_impl();
workbook wb(impl);
wb.d_->manifest_.register_default_type("rels", "application/vnd.openxmlformats-package.relationships+xml");
wb.d_->manifest_.register_relationship(uri("/"),
relationship_type::office_document, uri("workbook.xml"), target_mode::internal);
wb.d_->manifest_.register_override_type(
path("/workbook.xml"), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml");
wb.d_->manifest_.register_relationship(
uri("/"), relationship_type::office_document, uri("workbook.xml"), target_mode::internal);
std::string title("1");
auto title = std::string("1");
wb.d_->worksheets_.push_back(detail::worksheet_impl(&wb, 1, title));
wb.d_->manifest_.register_override_type(
path("/sheet1.xml"), "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml");
auto ws_rel = wb.d_->manifest_.register_relationship(
uri("workbook.xml"), relationship_type::worksheet, uri("sheet1.xml"), target_mode::internal);
auto ws_rel = wb.d_->manifest_.register_relationship(uri("workbook.xml"),
relationship_type::worksheet, uri("sheet1.xml"), target_mode::internal);
wb.d_->sheet_title_rel_id_map_[title] = ws_rel;
wb.d_->manifest_.register_override_type(path("/workbook.xml"),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml");
wb.d_->manifest_.register_override_type(path("/sheet1.xml"),
"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml");
return wb;
}
@ -179,16 +214,31 @@ workbook workbook::empty_excel()
wb.d_->manifest_.register_relationship(
uri("/"), relationship_type::extended_properties, uri("docProps/app.xml"), target_mode::internal);
wb.core_property("Creator", "Microsoft Office User");
wb.core_property("LastModifiedBy", "Microsoft Office User");
wb.core_property("Created", datetime(2016, 8, 12, 3, 16, 56));
wb.core_property("Modified", datetime(2016, 8, 12, 3, 17, 16));
wb.core_property("Application", "Microsoft Macintosh Excel");
wb.core_property("AppVersion", "15.0300");
wb.core_property("creator", "Microsoft Office User");
wb.core_property("lastModifiedBy", "Microsoft Office User");
wb.core_property("created", datetime(2016, 8, 12, 3, 16, 56));
wb.core_property("modified", datetime(2016, 8, 12, 3, 17, 16));
wb.extended_property("Application", "Microsoft Macintosh Excel");
wb.extended_property("DocSecurity", "0");
wb.extended_property("ScaleCrop", "false");
wb.extended_property("Company", "");
wb.extended_property("LinksUpToDate", "false");
wb.extended_property("SharedDoc", "false");
wb.extended_property("HyperlinksChanged", "false");
wb.extended_property("AppVersion", "15.0300");
auto file_version = detail::workbook_impl::file_version_t{"xl", 6, 6, 26709};
wb.d_->file_version_ = file_version;
xlnt::workbook_view wb_view;
wb_view.x_window = 0;
wb_view.y_window = 460;
wb_view.window_width = 28800;
wb_view.window_height = 17460;
wb_view.tab_ratio = 500;
wb.view(wb_view);
auto ws = wb.create_sheet();
page_margins margins;
@ -203,6 +253,8 @@ workbook workbook::empty_excel()
sheet_view view;
ws.add_view(view);
wb.theme(xlnt::theme());
wb.d_->stylesheet_ = detail::stylesheet();
auto &stylesheet = wb.d_->stylesheet_.get();
@ -236,7 +288,10 @@ workbook workbook::empty_excel()
.number_format(xlnt::number_format::general(), false)
.style("Normal");
wb.theme(xlnt::theme());
xlnt::calculation_properties calc_props;
calc_props.calc_id = 150000;
calc_props.concurrent_calc = false;
wb.calculation_properties(calc_props);
return wb;
}
@ -269,10 +324,10 @@ workbook workbook::empty_libre_office()
std::string title("Sheet1");
wb.d_->worksheets_.push_back(detail::worksheet_impl(&wb, 1, title));
wb.d_->manifest_.register_override_type(
path("xl/worksheets/sheet1.xml"), "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml");
auto ws_rel = wb.d_->manifest_.register_relationship(
uri("xl/workbook.xml"), relationship_type::worksheet, uri("worksheets/sheet1.xml"), target_mode::internal);
wb.d_->manifest_.register_override_type(path("xl/worksheets/sheet1.xml"),
"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml");
auto ws_rel = wb.d_->manifest_.register_relationship(uri("xl/workbook.xml"),
relationship_type::worksheet, uri("worksheets/sheet1.xml"), target_mode::internal);
wb.d_->sheet_title_rel_id_map_[title] = ws_rel;
auto ws = wb.sheet_by_index(0);
@ -403,8 +458,8 @@ workbook workbook::empty_libre_office()
.protection(default_protection, true)
.style("Normal");
wb.core_property(
"Application", "LibreOffice/5.1.4.2$Windows_x86 LibreOffice_project/f99d75f39f1c57ebdd7ffc5f42867c12031db97a");
wb.extended_property("Application",
"LibreOffice/5.1.4.2$Windows_x86 LibreOffice_project/f99d75f39f1c57ebdd7ffc5f42867c12031db97a");
return wb;
}
@ -1353,12 +1408,6 @@ std::size_t workbook::rup_build() const
return d_->file_version_.get().rup_build;
}
template <>
std::string workbook::core_property(const std::string &property_name) const
{
return d_->core_properties_.at(property_name);
}
/// <summary>
///
/// </summary>

View File

@ -825,8 +825,8 @@ cell_reference worksheet::point_pos(int left, int top) const
column_t current_column = 1;
row_t current_row = 1;
int left_pos = 0;
int top_pos = 0;
double left_pos = 0;
double top_pos = 0;
while (left_pos <= left)
{

Binary file not shown.

Binary file not shown.

View File

@ -38,6 +38,9 @@ public:
static bool compare_files(const std::string &left,
const std::string &right, const std::string &content_type)
{
// content types are stored in unordered maps, too complicated to compare
if (content_type == "[Content_Types].xml") return true;
auto is_xml = (content_type.substr(0, 12) == "application/"
&& content_type.substr(content_type.size() - 4) == "+xml")
|| content_type == "application/xml"
@ -62,7 +65,7 @@ public:
auto is_whitespace = [](const std::string &v)
{
return v.find_first_not_of("\n\t ") == std::string::npos;
return v.find_first_not_of("\n\r\t ") == std::string::npos;
};
for (auto left_event : left_parser)