mirror of
https://github.com/tfussell/xlnt.git
synced 2024-03-22 13:11:17 +08:00
clean up switches, closes #133
This commit is contained in:
parent
e617d140f0
commit
cf7f4e6c83
|
@ -94,11 +94,10 @@ std::string to_string(relationship_type t)
|
||||||
case relationship_type::image:
|
case relationship_type::image:
|
||||||
return "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
|
return "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
|
||||||
case relationship_type::unknown:
|
case relationship_type::unknown:
|
||||||
#ifndef __clang__
|
|
||||||
default:
|
|
||||||
#endif
|
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default_case("unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string to_string(pattern_fill_type fill_type)
|
std::string to_string(pattern_fill_type fill_type)
|
||||||
|
|
|
@ -23,10 +23,12 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <xlnt/utils/exceptions.hpp>
|
||||||
|
|
||||||
#define EXCEPT_ON_UNHANDLED_SWITCH_CASE
|
#define EXCEPT_ON_UNHANDLED_SWITCH_CASE
|
||||||
|
|
||||||
#ifdef EXCEPT_ON_UNHANDLED_SWITCH_CASE
|
#ifdef EXCEPT_ON_UNHANDLED_SWITCH_CASE
|
||||||
#define default_case(default_value) throw xlnt::exception("unhandled case");
|
#define default_case(default_value) throw xlnt::unhandled_switch_case();
|
||||||
#else
|
#else
|
||||||
#define default_case(default_value) return default_value;
|
#define default_case(default_value) return default_value;
|
||||||
#endif
|
#endif
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -245,9 +245,9 @@ std::array<xlnt::optional<xlnt::rich_text>, 3> parse_header_footer(const std::st
|
||||||
tokens.push_back(token);
|
tokens.push_back(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto parse_section = [&tokens, &result](hf_code code) {
|
const auto parse_section = [&tokens, &result](hf_code code)
|
||||||
|
{
|
||||||
std::vector<hf_code> end_codes{hf_code::left_section, hf_code::center_section, hf_code::right_section};
|
std::vector<hf_code> end_codes{hf_code::left_section, hf_code::center_section, hf_code::right_section};
|
||||||
|
|
||||||
end_codes.erase(std::find(end_codes.begin(), end_codes.end(), code));
|
end_codes.erase(std::find(end_codes.begin(), end_codes.end(), code));
|
||||||
|
|
||||||
std::size_t start_index = 0;
|
std::size_t start_index = 0;
|
||||||
|
@ -296,141 +296,197 @@ std::array<xlnt::optional<xlnt::rich_text>, 3> parse_header_footer(const std::st
|
||||||
switch (current_token.code)
|
switch (current_token.code)
|
||||||
{
|
{
|
||||||
case hf_code::text:
|
case hf_code::text:
|
||||||
break; // already handled above
|
{
|
||||||
|
break; // already handled above
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::left_section:
|
case hf_code::left_section:
|
||||||
break; // used below
|
{
|
||||||
|
break; // used below
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::center_section:
|
case hf_code::center_section:
|
||||||
break; // used below
|
{
|
||||||
|
break; // used below
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::right_section:
|
case hf_code::right_section:
|
||||||
break; // used below
|
{
|
||||||
|
break; // used below
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::current_page_number:
|
case hf_code::current_page_number:
|
||||||
current_run.first = current_run.first + "&P";
|
{
|
||||||
break;
|
current_run.first = current_run.first + "&P";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::total_page_number:
|
case hf_code::total_page_number:
|
||||||
current_run.first = current_run.first + "&N";
|
{
|
||||||
break;
|
current_run.first = current_run.first + "&N";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::font_size:
|
case hf_code::font_size:
|
||||||
if (!current_run.second.is_set())
|
|
||||||
{
|
|
||||||
current_run.second = xlnt::font();
|
|
||||||
}
|
|
||||||
current_run.second.get().size(std::stod(current_token.value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case hf_code::text_font_color:
|
|
||||||
if (current_token.value.size() == 6)
|
|
||||||
{
|
{
|
||||||
if (!current_run.second.is_set())
|
if (!current_run.second.is_set())
|
||||||
{
|
{
|
||||||
current_run.second = xlnt::font();
|
current_run.second = xlnt::font();
|
||||||
}
|
}
|
||||||
current_run.second.get().color(xlnt::rgb_color(current_token.value));
|
|
||||||
|
current_run.second.get().size(std::stod(current_token.value));
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
case hf_code::text_font_color:
|
||||||
|
{
|
||||||
|
if (current_token.value.size() == 6)
|
||||||
|
{
|
||||||
|
if (!current_run.second.is_set())
|
||||||
|
{
|
||||||
|
current_run.second = xlnt::font();
|
||||||
|
}
|
||||||
|
|
||||||
|
current_run.second.get().color(xlnt::rgb_color(current_token.value));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::text_strikethrough:
|
case hf_code::text_strikethrough:
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::text_superscript:
|
case hf_code::text_superscript:
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::text_subscript:
|
case hf_code::text_subscript:
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::date:
|
case hf_code::date:
|
||||||
current_run.first = current_run.first + "&D";
|
{
|
||||||
break;
|
current_run.first = current_run.first + "&D";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::time:
|
case hf_code::time:
|
||||||
current_run.first = current_run.first + "&T";
|
{
|
||||||
break;
|
current_run.first = current_run.first + "&T";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::picture_as_background:
|
case hf_code::picture_as_background:
|
||||||
current_run.first = current_run.first + "&G";
|
{
|
||||||
break;
|
current_run.first = current_run.first + "&G";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::text_single_underline:
|
case hf_code::text_single_underline:
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::text_double_underline:
|
case hf_code::text_double_underline:
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::workbook_file_path:
|
case hf_code::workbook_file_path:
|
||||||
current_run.first = current_run.first + "&Z";
|
{
|
||||||
break;
|
current_run.first = current_run.first + "&Z";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::workbook_file_name:
|
case hf_code::workbook_file_name:
|
||||||
current_run.first = current_run.first + "&F";
|
{
|
||||||
break;
|
current_run.first = current_run.first + "&F";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::sheet_tab_name:
|
case hf_code::sheet_tab_name:
|
||||||
current_run.first = current_run.first + "&A";
|
{
|
||||||
break;
|
current_run.first = current_run.first + "&A";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::add_to_page_number:
|
case hf_code::add_to_page_number:
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::subtract_from_page_number:
|
case hf_code::subtract_from_page_number:
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::text_font_name:
|
case hf_code::text_font_name:
|
||||||
{
|
|
||||||
auto comma_index = current_token.value.find(',');
|
|
||||||
auto font_name = current_token.value.substr(0, comma_index);
|
|
||||||
|
|
||||||
if (!current_run.second.is_set())
|
|
||||||
{
|
{
|
||||||
current_run.second = xlnt::font();
|
auto comma_index = current_token.value.find(',');
|
||||||
}
|
auto font_name = current_token.value.substr(0, comma_index);
|
||||||
|
|
||||||
if (font_name != "-")
|
if (!current_run.second.is_set())
|
||||||
{
|
|
||||||
current_run.second.get().name(font_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (comma_index != std::string::npos)
|
|
||||||
{
|
|
||||||
auto font_type = current_token.value.substr(comma_index + 1);
|
|
||||||
|
|
||||||
if (font_type == "Bold")
|
|
||||||
{
|
{
|
||||||
current_run.second.get().bold(true);
|
current_run.second = xlnt::font();
|
||||||
}
|
}
|
||||||
else if (font_type == "Italic")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
else if (font_type == "BoldItalic")
|
|
||||||
{
|
|
||||||
current_run.second.get().bold(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
if (font_name != "-")
|
||||||
|
{
|
||||||
|
current_run.second.get().name(font_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (comma_index != std::string::npos)
|
||||||
|
{
|
||||||
|
auto font_type = current_token.value.substr(comma_index + 1);
|
||||||
|
|
||||||
|
if (font_type == "Bold")
|
||||||
|
{
|
||||||
|
current_run.second.get().bold(true);
|
||||||
|
}
|
||||||
|
else if (font_type == "Italic")
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
else if (font_type == "BoldItalic")
|
||||||
|
{
|
||||||
|
current_run.second.get().bold(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::bold_font_style:
|
case hf_code::bold_font_style:
|
||||||
if (!current_run.second.is_set())
|
|
||||||
{
|
{
|
||||||
current_run.second = xlnt::font();
|
if (!current_run.second.is_set())
|
||||||
|
{
|
||||||
|
current_run.second = xlnt::font();
|
||||||
|
}
|
||||||
|
|
||||||
|
current_run.second.get().bold(true);
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
current_run.second.get().bold(true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case hf_code::italic_font_style:
|
case hf_code::italic_font_style:
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::outline_style:
|
case hf_code::outline_style:
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case hf_code::shadow_style:
|
case hf_code::shadow_style:
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,7 @@ struct value_traits<xlnt::detail::hash_algorithm>
|
||||||
return xlnt::detail::hash_algorithm::ripemd160;
|
return xlnt::detail::hash_algorithm::ripemd160;
|
||||||
else if (hash_algorithm_string == "Whirlpool")
|
else if (hash_algorithm_string == "Whirlpool")
|
||||||
return xlnt::detail::hash_algorithm::whirlpool;
|
return xlnt::detail::hash_algorithm::whirlpool;
|
||||||
|
|
||||||
default_case(xlnt::detail::hash_algorithm::sha1);
|
default_case(xlnt::detail::hash_algorithm::sha1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,8 +161,9 @@ std::vector<std::uint8_t> crypto_helper::decode_base64(const std::string &encode
|
||||||
decoder.Put(reinterpret_cast<const std::uint8_t *>(encoded.data()), encoded.size());
|
decoder.Put(reinterpret_cast<const std::uint8_t *>(encoded.data()), encoded.size());
|
||||||
decoder.MessageEnd();
|
decoder.MessageEnd();
|
||||||
|
|
||||||
std::vector<std::uint8_t> decoded(decoder.MaxRetrievable(), 0);
|
const auto bytes_decoded = std::size_t(decoder.MaxRetrievable());
|
||||||
decoder.Get(decoded.data(), decoded.size());
|
auto decoded = std::vector<std::uint8_t>(bytes_decoded, 0);
|
||||||
|
decoder.Get(decoded.data(), bytes_decoded);
|
||||||
|
|
||||||
return decoded;
|
return decoded;
|
||||||
}
|
}
|
||||||
|
@ -172,8 +174,9 @@ std::string crypto_helper::encode_base64(const std::vector<std::uint8_t> &decode
|
||||||
encoder.Put(reinterpret_cast<const std::uint8_t *>(decoded.data()), decoded.size());
|
encoder.Put(reinterpret_cast<const std::uint8_t *>(decoded.data()), decoded.size());
|
||||||
encoder.MessageEnd();
|
encoder.MessageEnd();
|
||||||
|
|
||||||
std::vector<std::uint8_t> encoded(encoder.MaxRetrievable(), 0);
|
const auto bytes_encoded = std::size_t(encoder.MaxRetrievable());
|
||||||
encoder.Get(encoded.data(), encoded.size());
|
auto encoded = std::vector<std::uint8_t>(bytes_encoded, 0);
|
||||||
|
encoder.Get(encoded.data(), bytes_encoded);
|
||||||
|
|
||||||
return std::string(encoded.begin(), encoded.end());
|
return std::string(encoded.begin(), encoded.end());
|
||||||
}
|
}
|
||||||
|
|
|
@ -193,7 +193,8 @@ void xlsx_producer::write_content_types()
|
||||||
write_end_element(xmlns, "Types");
|
write_end_element(xmlns, "Types");
|
||||||
}
|
}
|
||||||
|
|
||||||
void xlsx_producer::write_property(const std::string &name, const variant &value, const std::string &ns, bool custom, std::size_t pid)
|
void xlsx_producer::write_property(const std::string &name, const variant &value,
|
||||||
|
const std::string &ns, bool custom, std::size_t pid)
|
||||||
{
|
{
|
||||||
if (custom)
|
if (custom)
|
||||||
{
|
{
|
||||||
|
@ -208,115 +209,126 @@ void xlsx_producer::write_property(const std::string &name, const variant &value
|
||||||
switch (value.value_type())
|
switch (value.value_type())
|
||||||
{
|
{
|
||||||
case variant::type::null:
|
case variant::type::null:
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case variant::type::boolean:
|
case variant::type::boolean:
|
||||||
if (custom)
|
|
||||||
{
|
{
|
||||||
write_attribute("fmtid", "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}");
|
if (custom)
|
||||||
write_attribute("pid", pid);
|
{
|
||||||
write_start_element(constants::ns("vt"), "bool");
|
write_attribute("fmtid", "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}");
|
||||||
|
write_attribute("pid", pid);
|
||||||
|
write_start_element(constants::ns("vt"), "bool");
|
||||||
|
}
|
||||||
|
|
||||||
|
write_characters(value.get<bool>() ? "true" : "false");
|
||||||
|
|
||||||
|
if (custom)
|
||||||
|
{
|
||||||
|
write_end_element(constants::ns("vt"), "bool");
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
write_characters(value.get<bool>() ? "true" : "false");
|
|
||||||
|
|
||||||
if (custom)
|
|
||||||
{
|
|
||||||
write_end_element(constants::ns("vt"), "bool");
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case variant::type::i4:
|
case variant::type::i4:
|
||||||
if (custom)
|
|
||||||
{
|
{
|
||||||
write_attribute("fmtid", "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}");
|
if (custom)
|
||||||
write_attribute("pid", pid);
|
{
|
||||||
write_start_element(constants::ns("vt"), "i4");
|
write_attribute("fmtid", "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}");
|
||||||
|
write_attribute("pid", pid);
|
||||||
|
write_start_element(constants::ns("vt"), "i4");
|
||||||
|
}
|
||||||
|
|
||||||
|
write_characters(value.get<std::int32_t>());
|
||||||
|
|
||||||
|
if (custom)
|
||||||
|
{
|
||||||
|
write_end_element(constants::ns("vt"), "i4");
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
write_characters(value.get<std::int32_t>());
|
|
||||||
|
|
||||||
if (custom)
|
|
||||||
{
|
|
||||||
write_end_element(constants::ns("vt"), "i4");
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case variant::type::lpstr:
|
case variant::type::lpstr:
|
||||||
if (custom)
|
|
||||||
{
|
{
|
||||||
write_attribute("fmtid", "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}");
|
if (custom)
|
||||||
write_attribute("pid", pid);
|
{
|
||||||
write_start_element(constants::ns("vt"), "lpwstr");
|
write_attribute("fmtid", "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}");
|
||||||
|
write_attribute("pid", pid);
|
||||||
|
write_start_element(constants::ns("vt"), "lpwstr");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!custom && ns == constants::ns("dcterms") && (name == "created" || name == "modified"))
|
||||||
|
{
|
||||||
|
write_attribute(xml::qname(constants::ns("xsi"), "type"), "dcterms:W3CDTF");
|
||||||
|
}
|
||||||
|
|
||||||
|
write_characters(value.get<std::string>());
|
||||||
|
|
||||||
|
if (custom)
|
||||||
|
{
|
||||||
|
write_end_element(constants::ns("vt"), "lpwstr");
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!custom && ns == constants::ns("dcterms") && (name == "created" || name == "modified"))
|
|
||||||
{
|
|
||||||
write_attribute(xml::qname(constants::ns("xsi"), "type"), "dcterms:W3CDTF");
|
|
||||||
}
|
|
||||||
|
|
||||||
write_characters(value.get<std::string>());
|
|
||||||
|
|
||||||
if (custom)
|
|
||||||
{
|
|
||||||
write_end_element(constants::ns("vt"), "lpwstr");
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case variant::type::date:
|
case variant::type::date:
|
||||||
write_attribute(xml::qname(constants::ns("xsi"), "type"), "dcterms:W3CDTF");
|
{
|
||||||
write_characters(value.get<datetime>().to_iso_string());
|
write_attribute(xml::qname(constants::ns("xsi"), "type"), "dcterms:W3CDTF");
|
||||||
break;
|
write_characters(value.get<datetime>().to_iso_string());
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case variant::type::vector:
|
case variant::type::vector:
|
||||||
{
|
|
||||||
write_start_element(constants::ns("vt"), "vector");
|
|
||||||
|
|
||||||
auto vector = value.get<std::vector<variant>>();
|
|
||||||
std::unordered_set<variant::type> types;
|
|
||||||
|
|
||||||
for (const auto &element : vector)
|
|
||||||
{
|
{
|
||||||
types.insert(element.value_type());
|
write_start_element(constants::ns("vt"), "vector");
|
||||||
|
|
||||||
|
auto vector = value.get<std::vector<variant>>();
|
||||||
|
std::unordered_set<variant::type> types;
|
||||||
|
|
||||||
|
for (const auto &element : vector)
|
||||||
|
{
|
||||||
|
types.insert(element.value_type());
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto is_mixed = types.size() > 1;
|
||||||
|
const auto vector_type = !is_mixed ? to_string(*types.begin()) : "variant";
|
||||||
|
|
||||||
|
write_attribute("size", vector.size());
|
||||||
|
write_attribute("baseType", vector_type);
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < vector.size(); ++i)
|
||||||
|
{
|
||||||
|
const auto &vector_element = vector.at(i);
|
||||||
|
|
||||||
|
if (is_mixed)
|
||||||
|
{
|
||||||
|
write_start_element(constants::ns("vt"), "variant");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vector_element.value_type() == variant::type::lpstr)
|
||||||
|
{
|
||||||
|
write_element(constants::ns("vt"), "lpstr", vector_element.get<std::string>());
|
||||||
|
}
|
||||||
|
else if (vector_element.value_type() == variant::type::i4)
|
||||||
|
{
|
||||||
|
write_element(constants::ns("vt"), "i4", vector_element.get<std::int32_t>());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_mixed)
|
||||||
|
{
|
||||||
|
write_end_element(constants::ns("vt"), "variant");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
write_end_element(constants::ns("vt"), "vector");
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto is_mixed = types.size() > 1;
|
|
||||||
const auto vector_type = !is_mixed ? to_string(*types.begin()) : "variant";
|
|
||||||
|
|
||||||
write_attribute("size", vector.size());
|
|
||||||
write_attribute("baseType", vector_type);
|
|
||||||
|
|
||||||
for (std::size_t i = 0; i < vector.size(); ++i)
|
|
||||||
{
|
|
||||||
const auto &vector_element = vector.at(i);
|
|
||||||
|
|
||||||
if (is_mixed)
|
|
||||||
{
|
|
||||||
write_start_element(constants::ns("vt"), "variant");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vector_element.value_type() == variant::type::lpstr)
|
|
||||||
{
|
|
||||||
write_element(constants::ns("vt"), "lpstr", vector_element.get<std::string>());
|
|
||||||
}
|
|
||||||
else if (vector_element.value_type() == variant::type::i4)
|
|
||||||
{
|
|
||||||
write_element(constants::ns("vt"), "i4", vector_element.get<std::int32_t>());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_mixed)
|
|
||||||
{
|
|
||||||
write_end_element(constants::ns("vt"), "variant");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
write_end_element(constants::ns("vt"), "vector");
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (custom)
|
if (custom)
|
||||||
|
@ -2589,6 +2601,7 @@ void xlsx_producer::write_worksheet(const relationship &rel)
|
||||||
path archive_path(worksheet_part.parent().append(child_rel.target().path()));
|
path archive_path(worksheet_part.parent().append(child_rel.target().path()));
|
||||||
auto split_part_path = archive_path.split();
|
auto split_part_path = archive_path.split();
|
||||||
auto part_path_iter = split_part_path.begin();
|
auto part_path_iter = split_part_path.begin();
|
||||||
|
|
||||||
while (part_path_iter != split_part_path.end())
|
while (part_path_iter != split_part_path.end())
|
||||||
{
|
{
|
||||||
if (*part_path_iter == "..")
|
if (*part_path_iter == "..")
|
||||||
|
@ -2599,85 +2612,19 @@ void xlsx_producer::write_worksheet(const relationship &rel)
|
||||||
|
|
||||||
++part_path_iter;
|
++part_path_iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
archive_path = std::accumulate(split_part_path.begin(), split_part_path.end(), path(""),
|
archive_path = std::accumulate(split_part_path.begin(), split_part_path.end(), path(""),
|
||||||
[](const path &a, const std::string &b) { return a.append(b); });
|
[](const path &a, const std::string &b) { return a.append(b); });
|
||||||
|
|
||||||
begin_part(archive_path);
|
begin_part(archive_path);
|
||||||
|
|
||||||
switch (child_rel.type())
|
if (child_rel.type() == relationship_type::comments)
|
||||||
{
|
{
|
||||||
case relationship_type::comments:
|
|
||||||
write_comments(child_rel, ws, cells_with_comments);
|
write_comments(child_rel, ws, cells_with_comments);
|
||||||
break;
|
}
|
||||||
|
else if (child_rel.type() == relationship_type::vml_drawing)
|
||||||
case relationship_type::vml_drawing:
|
{
|
||||||
write_vml_drawings(child_rel, ws, cells_with_comments);
|
write_vml_drawings(child_rel, ws, cells_with_comments);
|
||||||
break;
|
|
||||||
|
|
||||||
case relationship_type::office_document:
|
|
||||||
break;
|
|
||||||
case relationship_type::thumbnail:
|
|
||||||
break;
|
|
||||||
case relationship_type::calculation_chain:
|
|
||||||
break;
|
|
||||||
case relationship_type::extended_properties:
|
|
||||||
break;
|
|
||||||
case relationship_type::core_properties:
|
|
||||||
break;
|
|
||||||
case relationship_type::worksheet:
|
|
||||||
break;
|
|
||||||
case relationship_type::shared_string_table:
|
|
||||||
break;
|
|
||||||
case relationship_type::stylesheet:
|
|
||||||
break;
|
|
||||||
case relationship_type::theme:
|
|
||||||
break;
|
|
||||||
case relationship_type::hyperlink:
|
|
||||||
break;
|
|
||||||
case relationship_type::chartsheet:
|
|
||||||
break;
|
|
||||||
case relationship_type::unknown:
|
|
||||||
break;
|
|
||||||
case relationship_type::custom_properties:
|
|
||||||
break;
|
|
||||||
case relationship_type::printer_settings:
|
|
||||||
break;
|
|
||||||
case relationship_type::connections:
|
|
||||||
break;
|
|
||||||
case relationship_type::custom_property:
|
|
||||||
break;
|
|
||||||
case relationship_type::custom_xml_mappings:
|
|
||||||
break;
|
|
||||||
case relationship_type::dialogsheet:
|
|
||||||
break;
|
|
||||||
case relationship_type::drawings:
|
|
||||||
break;
|
|
||||||
case relationship_type::external_workbook_references:
|
|
||||||
break;
|
|
||||||
case relationship_type::pivot_table:
|
|
||||||
break;
|
|
||||||
case relationship_type::pivot_table_cache_definition:
|
|
||||||
break;
|
|
||||||
case relationship_type::pivot_table_cache_records:
|
|
||||||
break;
|
|
||||||
case relationship_type::query_table:
|
|
||||||
break;
|
|
||||||
case relationship_type::shared_workbook_revision_headers:
|
|
||||||
break;
|
|
||||||
case relationship_type::shared_workbook:
|
|
||||||
break;
|
|
||||||
case relationship_type::revision_log:
|
|
||||||
break;
|
|
||||||
case relationship_type::shared_workbook_user_data:
|
|
||||||
break;
|
|
||||||
case relationship_type::single_cell_table_definitions:
|
|
||||||
break;
|
|
||||||
case relationship_type::table_definition:
|
|
||||||
break;
|
|
||||||
case relationship_type::volatile_dependencies:
|
|
||||||
break;
|
|
||||||
case relationship_type::image:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -266,14 +266,10 @@ public:
|
||||||
strm.next_in = reinterpret_cast<Bytef *>(in.data());
|
strm.next_in = reinterpret_cast<Bytef *>(in.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret = inflate(&strm, Z_NO_FLUSH); // decompress
|
const auto ret = inflate(&strm, Z_NO_FLUSH); // decompress
|
||||||
|
|
||||||
switch (ret)
|
if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT || ret == Z_DATA_ERROR || ret == Z_MEM_ERROR)
|
||||||
{
|
{
|
||||||
case Z_STREAM_ERROR:
|
|
||||||
case Z_NEED_DICT:
|
|
||||||
case Z_DATA_ERROR:
|
|
||||||
case Z_MEM_ERROR:
|
|
||||||
throw xlnt::exception("couldn't inflate ZIP, possibly corrupted");
|
throw xlnt::exception("couldn't inflate ZIP, possibly corrupted");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -233,7 +233,7 @@ std::string content_type(xlnt::relationship_type type)
|
||||||
case relationship_type::custom_properties:
|
case relationship_type::custom_properties:
|
||||||
return "application/vnd.openxmlformats-officedocument.custom-properties+xml";
|
return "application/vnd.openxmlformats-officedocument.custom-properties+xml";
|
||||||
case relationship_type::custom_property:
|
case relationship_type::custom_property:
|
||||||
return "";
|
throw xlnt::unhandled_switch_case();
|
||||||
case relationship_type::custom_xml_mappings:
|
case relationship_type::custom_xml_mappings:
|
||||||
return "application/xml";
|
return "application/xml";
|
||||||
case relationship_type::dialogsheet:
|
case relationship_type::dialogsheet:
|
||||||
|
@ -245,9 +245,9 @@ std::string content_type(xlnt::relationship_type type)
|
||||||
case relationship_type::external_workbook_references:
|
case relationship_type::external_workbook_references:
|
||||||
return "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml";
|
return "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml";
|
||||||
case relationship_type::hyperlink:
|
case relationship_type::hyperlink:
|
||||||
return "";
|
throw xlnt::unhandled_switch_case();
|
||||||
case relationship_type::image:
|
case relationship_type::image:
|
||||||
return "";
|
throw xlnt::unhandled_switch_case();
|
||||||
case relationship_type::office_document:
|
case relationship_type::office_document:
|
||||||
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";
|
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";
|
||||||
case relationship_type::pivot_table:
|
case relationship_type::pivot_table:
|
||||||
|
@ -265,7 +265,7 @@ std::string content_type(xlnt::relationship_type type)
|
||||||
case relationship_type::shared_string_table:
|
case relationship_type::shared_string_table:
|
||||||
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml";
|
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml";
|
||||||
case relationship_type::shared_workbook:
|
case relationship_type::shared_workbook:
|
||||||
return "";
|
throw xlnt::unhandled_switch_case();
|
||||||
case relationship_type::shared_workbook_revision_headers:
|
case relationship_type::shared_workbook_revision_headers:
|
||||||
return "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml";
|
return "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml";
|
||||||
case relationship_type::shared_workbook_user_data:
|
case relationship_type::shared_workbook_user_data:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user