begin work on handling properties correctly

This commit is contained in:
Thomas Fussell 2017-01-14 14:09:01 -05:00
parent 753597510d
commit f18e9dbc09
6 changed files with 1216 additions and 1072 deletions

View File

@ -291,6 +291,11 @@ public:
/// </summary>
bool has_core_property(const std::string &property_name) const;
/// <summary>
///
/// </summary>
std::vector<std::string> core_properties() const;
/// <summary>
///
/// </summary>
@ -308,6 +313,11 @@ public:
/// </summary>
bool has_extended_property(const std::string &property_name) const;
/// <summary>
///
/// </summary>
std::vector<std::string> extended_properties() const;
/// <summary>
///
/// </summary>
@ -325,6 +335,11 @@ public:
/// </summary>
bool has_custom_property(const std::string &property_name) const;
/// <summary>
///
/// </summary>
std::vector<std::string> custom_properties() const;
/// <summary>
///
/// </summary>

View File

@ -124,7 +124,8 @@ const std::unordered_map<std::string, std::string> &constants::namespaces()
{"encryption-password", "http://schemas.microsoft.com/office/2006/keyEncryptor/password"},
{"encryption-certificate", "http://schemas.microsoft.com/office/2006/keyEncryptor/certificate"},
{"dc", "http://purl.org/dc/elements/1.1/"}, {"dcterms", "http://purl.org/dc/terms/"},
{"dc", "http://purl.org/dc/elements/1.1/"},
{"dcterms", "http://purl.org/dc/terms/"},
{"dcmitype", "http://purl.org/dc/dcmitype/"},
{"mc", "http://schemas.openxmlformats.org/markup-compatibility/2006"},
{"mx", "http://schemas.microsoft.com/office/mac/excel/2008/main"},

View File

@ -1656,24 +1656,23 @@ void xlsx_consumer::read_stylesheet()
return result;
};
*/
//std::size_t xf_id = 0;
/*
std::size_t xf_id = 0;
for (const auto &record : style_records)
{
/*
auto style_iter = std::find_if(styles.begin(), styles.end(),
[&xf_id](const std::pair<style, std::size_t> &s) { return s.second == xf_id; });
[&xf_id](const std::pair<style_impl, std::size_t> &s) { return s.second == xf_id; });
++xf_id;
if (style_iter == styles.end()) continue;
auto new_style = stylesheet.create_style(style_iter->first.name);
*new_style.d_ = style_iter->first;
*/
(void)record;
}
*/
std::size_t record_index = 0;
for (const auto &record : format_records)

File diff suppressed because it is too large Load Diff

View File

@ -71,9 +71,7 @@ private:
// Package Parts
void write_content_types();
void write_core_properties(const relationship &rel);
void write_extended_properties(const relationship &rel);
void write_custom_properties(const relationship &rel);
void write_properties(const relationship &rel);
void write_image(const path &image_path);
// SpreadsheetML-Specific Package Parts
@ -125,11 +123,41 @@ private:
void write_table_styles();
void write_colors(const std::vector<xlnt::color> &colors);
/// <summary>
/// Dereference serializer_ pointer and return a reference to the object.
/// This is called by internal methods so that we can use . instead of ->.
/// </summary>
xml::serializer &serializer();
template<typename T>
void write_element(const std::string &ns, const std::string &name, T value)
{
write_start_element(ns, name);
write_characters(value);
write_end_element(ns, name);
}
void write_start_element(const std::string &name);
void write_start_element(const std::string &ns, const std::string &name);
void write_end_element(const std::string &name);
void write_end_element(const std::string &ns, const std::string &name);
void write_namespace(const std::string &ns, const std::string &prefix);
template<typename T>
void write_attribute(const std::string &name, T value)
{
current_part_serializer_->attribute(name, value);
}
template<typename T>
void write_attribute(const xml::qname &name, T value)
{
current_part_serializer_->attribute(name, value);
}
template<typename T>
void write_characters(T characters)
{
current_part_serializer_->characters(characters);
}
/// <summary>
/// A reference to the workbook which is the object of read/write operations.

View File

@ -103,6 +103,20 @@ void open_stream(std::ofstream &stream, const std::string &path)
}
#endif
template<typename T>
std::vector<std::string> keys(const T &container)
{
auto result = std::vector<std::string>();
auto iter = container.begin();
while (iter != container.end())
{
result.push_back((iter++)->first);
}
return result;
}
} // namespace
namespace xlnt {
@ -112,6 +126,11 @@ bool workbook::has_core_property(const std::string &property_name) const
return d_->core_properties_.count(property_name) > 0;
}
std::vector<std::string> workbook::core_properties() const
{
return keys(d_->core_properties_);
}
template <>
XLNT_API std::string workbook::core_property(const std::string &property_name) const
{
@ -141,6 +160,11 @@ bool workbook::has_extended_property(const std::string &property_name) const
return d_->extended_properties_.count(property_name) > 0;
}
std::vector<std::string> workbook::extended_properties() const
{
return keys(d_->extended_properties_);
}
template <>
XLNT_API void workbook::extended_property(const std::string &property_name, const std::string value)
{
@ -165,12 +189,16 @@ XLNT_API std::string workbook::extended_property(const std::string &property_nam
return d_->extended_properties_.at(property_name);
}
bool workbook::has_custom_property(const std::string &property_name) const
{
return d_->custom_properties_.count(property_name) > 0;
}
std::vector<std::string> workbook::custom_properties() const
{
return keys(d_->custom_properties_);
}
template <>
XLNT_API void workbook::custom_property(const std::string &property_name, const std::string value)
{
@ -194,25 +222,27 @@ workbook workbook::empty()
auto impl = new detail::workbook_impl();
workbook wb(impl);
wb.d_->manifest_.register_override_type(
path("/xl/workbook.xml"), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml");
wb.d_->manifest_.register_relationship(
uri("/"), relationship_type::office_document, uri("xl/workbook.xml"), target_mode::internal);
wb.d_->manifest_.register_override_type(path("/xl/workbook.xml"),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml");
wb.d_->manifest_.register_relationship(uri("/"), relationship_type::office_document,
uri("xl/workbook.xml"), target_mode::internal);
wb.d_->manifest_.register_default_type("rels", "application/vnd.openxmlformats-package.relationships+xml");
wb.d_->manifest_.register_default_type("xml", "application/xml");
wb.d_->manifest_.register_default_type("rels",
"application/vnd.openxmlformats-package.relationships+xml");
wb.d_->manifest_.register_default_type("xml",
"application/xml");
wb.thumbnail(excel_thumbnail(), "jpeg", "image/jpeg");
wb.d_->manifest_.register_override_type(
path("/docProps/core.xml"), "application/vnd.openxmlformats-package.core-properties+xml");
wb.d_->manifest_.register_relationship(
uri("/"), relationship_type::core_properties, uri("docProps/core.xml"), target_mode::internal);
wb.d_->manifest_.register_override_type(path("/docProps/core.xml"),
"application/vnd.openxmlformats-package.core-properties+xml");
wb.d_->manifest_.register_relationship(uri("/"), relationship_type::core_properties,
uri("docProps/core.xml"), target_mode::internal);
wb.d_->manifest_.register_override_type(
path("/docProps/app.xml"), "application/vnd.openxmlformats-officedocument.extended-properties+xml");
wb.d_->manifest_.register_relationship(
uri("/"), relationship_type::extended_properties, uri("docProps/app.xml"), target_mode::internal);
wb.d_->manifest_.register_override_type(path("/docProps/app.xml"),
"application/vnd.openxmlformats-officedocument.extended-properties+xml");
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");
@ -267,12 +297,19 @@ workbook workbook::empty()
.side(border_side::diagonal, border::border_property());
wb.d_->stylesheet_.get().borders.push_back(default_border);
auto default_fill = fill(pattern_fill().type(pattern_fill_type::none));
auto default_fill = fill(pattern_fill()
.type(pattern_fill_type::none));
stylesheet.fills.push_back(default_fill);
auto gray125_fill = pattern_fill().type(pattern_fill_type::gray125);
auto gray125_fill = pattern_fill()
.type(pattern_fill_type::gray125);
stylesheet.fills.push_back(gray125_fill);
auto default_font = font().name("Calibri").size(12).scheme("minor").family(2).color(theme_color(1));
auto default_font = font()
.name("Calibri")
.size(12)
.scheme("minor")
.family(2)
.color(theme_color(1));
stylesheet.fonts.push_back(default_font);
wb.create_style("Normal")
@ -317,73 +354,85 @@ workbook::workbook(detail::workbook_impl *impl)
void workbook::register_app_properties_in_manifest()
{
auto wb_rel = manifest().relationship(path("/"), relationship_type::office_document);
auto wb_rel = manifest().relationship(path("/"),
relationship_type::office_document);
if (!manifest().has_relationship(wb_rel.target().path(), relationship_type::extended_properties))
if (!manifest().has_relationship(wb_rel.target().path(),
relationship_type::extended_properties))
{
manifest().register_override_type(
path("/docProps/app.xml"), "application/vnd.openxmlformats-officedocument.extended-properties+xml");
manifest().register_relationship(
uri("/"), relationship_type::extended_properties, uri("docProps/app.xml"), target_mode::internal);
manifest().register_override_type(path("/docProps/app.xml"),
"application/vnd.openxmlformats-officedocument.extended-properties+xml");
manifest().register_relationship(uri("/"), relationship_type::extended_properties,
uri("docProps/app.xml"), target_mode::internal);
}
}
void workbook::register_core_properties_in_manifest()
{
auto wb_rel = manifest().relationship(path("/"), relationship_type::office_document);
auto wb_rel = manifest().relationship(path("/"),
relationship_type::office_document);
if (!manifest().has_relationship(wb_rel.target().path(), relationship_type::core_properties))
if (!manifest().has_relationship(wb_rel.target().path(),
relationship_type::core_properties))
{
manifest().register_override_type(
path("/docProps/core.xml"), "application/vnd.openxmlformats-package.core-properties+xml");
manifest().register_relationship(
uri("/"), relationship_type::core_properties, uri("docProps/core.xml"), target_mode::internal);
manifest().register_override_type(path("/docProps/core.xml"),
"application/vnd.openxmlformats-package.core-properties+xml");
manifest().register_relationship(uri("/"), relationship_type::core_properties,
uri("docProps/core.xml"), target_mode::internal);
}
}
void workbook::register_shared_string_table_in_manifest()
{
auto wb_rel = manifest().relationship(path("/"), relationship_type::office_document);
auto wb_rel = manifest().relationship(path("/"),
relationship_type::office_document);
if (!manifest().has_relationship(wb_rel.target().path(), relationship_type::shared_string_table))
if (!manifest().has_relationship(wb_rel.target().path(),
relationship_type::shared_string_table))
{
manifest().register_override_type(constants::part_shared_strings(),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml");
manifest().register_relationship(
wb_rel.target(), relationship_type::shared_string_table, uri("sharedStrings.xml"), target_mode::internal);
manifest().register_relationship(wb_rel.target(), relationship_type::shared_string_table,
uri("sharedStrings.xml"), target_mode::internal);
}
}
void workbook::register_stylesheet_in_manifest()
{
auto wb_rel = manifest().relationship(path("/"), relationship_type::office_document);
auto wb_rel = manifest().relationship(path("/"),
relationship_type::office_document);
if (!manifest().has_relationship(wb_rel.target().path(), relationship_type::stylesheet))
if (!manifest().has_relationship(wb_rel.target().path(),
relationship_type::stylesheet))
{
manifest().register_override_type(
constants::part_styles(), "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml");
manifest().register_relationship(
wb_rel.target(), relationship_type::stylesheet, uri("styles.xml"), target_mode::internal);
manifest().register_override_type(constants::part_styles(),
"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml");
manifest().register_relationship(wb_rel.target(), relationship_type::stylesheet,
uri("styles.xml"), target_mode::internal);
}
}
void workbook::register_theme_in_manifest()
{
auto wb_rel = manifest().relationship(path("/"), relationship_type::office_document);
auto wb_rel = manifest().relationship(path("/"),
relationship_type::office_document);
if (!manifest().has_relationship(wb_rel.target().path(), relationship_type::theme))
if (!manifest().has_relationship(wb_rel.target().path(),
relationship_type::theme))
{
manifest().register_override_type(
constants::part_theme(), "application/vnd.openxmlformats-officedocument.theme+xml");
manifest().register_relationship(
wb_rel.target(), relationship_type::theme, uri("theme/theme1.xml"), target_mode::internal);
manifest().register_override_type(constants::part_theme(),
"application/vnd.openxmlformats-officedocument.theme+xml");
manifest().register_relationship(wb_rel.target(), relationship_type::theme,
uri("theme/theme1.xml"), target_mode::internal);
}
}
void workbook::register_comments_in_manifest(worksheet ws)
{
auto wb_rel = manifest().relationship(path("/"), relationship_type::office_document);
auto ws_rel = manifest().relationship(wb_rel.target().path(), d_->sheet_title_rel_id_map_.at(ws.title()));
auto wb_rel = manifest().relationship(path("/"),
relationship_type::office_document);
auto ws_rel = manifest().relationship(wb_rel.target().path(),
d_->sheet_title_rel_id_map_.at(ws.title()));
path ws_path(ws_rel.source().path().parent().append(ws_rel.target().path()));
if (!manifest().has_relationship(ws_path, relationship_type::vml_drawing))
@ -1113,8 +1162,8 @@ void workbook::thumbnail(
if (!d_->manifest_.has_relationship(path("/"), relationship_type::thumbnail))
{
d_->manifest_.register_default_type(extension, content_type);
d_->manifest_.register_relationship(
uri("/"), relationship_type::thumbnail, uri("docProps/thumbnail.jpeg"), target_mode::internal);
d_->manifest_.register_relationship(uri("/"), relationship_type::thumbnail,
uri("docProps/thumbnail.jpeg"), target_mode::internal);
}
auto thumbnail_rel = d_->manifest_.relationship(path("/"), relationship_type::thumbnail);