not done yet. I can't beleive how complicated this is

This commit is contained in:
Thomas Fussell 2016-04-30 16:19:45 -04:00
parent 720edc143f
commit 9bd6e92297
33 changed files with 5832 additions and 884 deletions

View File

@ -38,6 +38,7 @@ enum class calendar;
class alignment; class alignment;
class border; class border;
class cell_reference; class cell_reference;
class cell_style;
class comment; class comment;
class fill; class fill;
class font; class font;
@ -194,21 +195,20 @@ public:
bool has_style() const; bool has_style() const;
/// <summary> /// <summary>
/// Return the index of this cell's style in its parent workbook. /// Return a reference to the style applied to this cell.
/// This is also the index of the style in the stylesheet XML, xl/styles.xml.
/// </summary> /// </summary>
std::size_t get_style_id() const; cell_style &get_style();
/// <summary> /// <summary>
/// Set the style index of this cell. This should be an existing style in /// Return a reference to the style applied to this cell.
/// the parent workbook.
/// </summary> /// </summary>
void set_style_id(std::size_t style_id); const cell_style &get_style() const;
/// <summary> /// <summary>
/// Return the number format of this cell. /// Return the number format of this cell.
/// </summary> /// </summary>
const number_format &get_number_format() const; const number_format &get_number_format() const;
void set_number_format(const number_format &format); void set_number_format(const number_format &format);
/// <summary> /// <summary>
@ -246,20 +246,6 @@ public:
void set_protection(const protection &protection_); void set_protection(const protection &protection_);
void set_pivot_button(bool b);
/// <summary>
/// Return true iff pivot button?
/// </summary>
bool pivot_button() const;
void set_quote_prefix(bool b);
/// <summary>
/// Return true iff quote prefix?
/// </summary>
bool quote_prefix() const;
// comment // comment
/// <summary> /// <summary>

View File

@ -34,6 +34,7 @@ namespace xlnt {
class alignment; class alignment;
class border; class border;
class cell_style;
class color; class color;
class conditional_format; class conditional_format;
class fill; class fill;
@ -43,7 +44,6 @@ class named_style;
class number_format; class number_format;
class protection; class protection;
class side; class side;
class style;
class xml_document; class xml_document;
class xml_node; class xml_node;
@ -71,7 +71,7 @@ public:
/// Populate parameter xml with an XML tree representing the styles contained in the workbook /// Populate parameter xml with an XML tree representing the styles contained in the workbook
/// given in the constructor. /// given in the constructor.
/// </summary> /// </summary>
xml_document write_stylesheet() const; xml_document write_stylesheet();
// TODO: These need to be public for unit tests. Could also make test class a friend? // TODO: These need to be public for unit tests. Could also make test class a friend?
// private: // private:
@ -131,58 +131,28 @@ public:
static conditional_format read_conditional_format(const xml_node &conditional_formats_node); static conditional_format read_conditional_format(const xml_node &conditional_formats_node);
/// <summary> /// <summary>
/// Read and return a pair containing a name and corresponding style from named_style_node. /// Read a single format from the given node. In styles.xml, this is an "xf" element.
/// A format has an optional border id, fill id, font id, and number format id where
/// each id is an index in the corresponding list of borders, etc. A style also has
/// optional alignment and protection children. A style also defines whether each of
/// these is "applied". For example, a style with a defined font id, font=# but with
/// "applyFont=0" will not use the font in formatting.
/// </summary> /// </summary>
static std::pair<std::string, style> read_named_style(const xml_node &named_style_node); cell_style read_cell_style(const xml_node &style_node);
//
// Static element writers (i.e. writers that don't use internal state)
//
/// <summary> /// <summary>
/// Build and return an xml tree representing alignment_. /// Read a single named style from the given named_style_node. In styles.xml, this is a
/// (confusingly named) "cellStyle" element. This node defines the name, whether it is
/// built-in and an xfId which is the index of an element in cellStyleXfs which should
/// be provided as the style_node parameter (cellStyleXfs itself, not the child xf node).
/// </summary> /// </summary>
static xml_node write_alignment(const alignment &alignment_); named_style read_named_style(const xml_node &named_style_node, const xml_node &style_parent_node);
/// <summary>
/// Build and return an xml tree representing border_.
/// </summary>
static xml_node write_border(const border &border_);
/// <summary>
/// Build and return an xml tree representing conditional_format_.
/// </summary>
static xml_node write_conditional_format(const conditional_format &conditional_format_);
/// <summary>
/// Build and return an xml tree representing fill_.
/// </summary>
static xml_node write_fill(const fill &fill_);
/// <summary>
/// Build and return an xml tree representing font_.
/// </summary>
static xml_node write_font(const font &font_);
/// <summary>
/// Build and return two xml trees, first=cell style and second=named style, representing named_style_.
/// </summary>
static std::pair<xml_node, xml_node> write_named_style(const named_style &named_style_);
/// <summary>
/// Build an xml tree representing all named styles in workbook into named_styles_node and cell_styles_node.
/// Returns true on success.
/// </summary>
static std::pair<xml_node, xml_node> write_named_styles();
/// <summary>
/// Build and return an xml tree representing number_format_.
/// </summary>
static xml_node write_number_format(const number_format &number_format_);
// //
// Non-static element readers (i.e. readers that modify internal state) // Non-static element readers (i.e. readers that modify internal state)
// //
bool read_number_formats(const xml_node &number_formats_node);
/// <summary> /// <summary>
/// Read all borders from borders_node and add them to workbook. /// Read all borders from borders_node and add them to workbook.
@ -207,38 +177,24 @@ public:
/// Return true on success. /// Return true on success.
/// </summary> /// </summary>
bool read_colors(const xml_node &colors_node); bool read_colors(const xml_node &colors_node);
/// <summary>
/// Read all cell styles from cell_styles_node and add them to workbook.
/// Return true on success.
/// </summary>
bool read_cell_styles(const xml_node &cell_styles_node);
/// <summary> /// <summary>
/// Read all named styles from named_style_node and cell_styles_node and add them to workbook. /// Read all named styles from named_style_node and cell_styles_node and add them to workbook.
/// Return true on success. /// Return true on success.
/// </summary> /// </summary>
bool read_named_styles(const xml_node &named_styles_node); bool read_named_styles(const xml_node &named_styles_node, const xml_node &cell_styles_node);
/// <summary> /// <summary>
/// Read all borders from number_formats_node and add them to workbook. /// Read all borders from number_formats_node and add them to workbook.
/// Return true on success. /// Return true on success.
/// </summary> /// </summary>
bool read_number_formats(const xml_node &number_formats_node); bool read_stylesheet(const xml_node &number_formats_node);
/// <summary>
/// Read a single format from the given node. In styles.xml, this is an "xf" element.
/// A format has an optional border id, fill id, font id, and number format id where
/// each id is an index in the corresponding list of borders, etc. A style also has
/// optional alignment and protection children. A style also defines whether each of
/// these is "applied". For example, a style with a defined font id, font=# but with
/// "applyFont=0" will not use the font in formatting.
/// </summary>
format read_format(const xml_node &format_node);
/// <summary>
/// Read a single style from the given node. In styles.xml, this is an "xf" element.
/// A style has an optional border id, fill id, font id, and number format id where
/// each id is an index in the corresponding list of borders, etc. A style also has
/// optional alignment and protection children. A style also defines whether each of
/// these is "applied". For example, a style with a defined font id, font=# but with
/// "applyFont=0" will not use the font in formatting.
/// </summary>
style read_style(const xml_node &style_node);
// //
// Non-static element writers (i.e. writers that modify internal workbook) // Non-static element writers (i.e. writers that modify internal workbook)
@ -272,19 +228,47 @@ public:
/// Build an xml tree representing all number formats in workbook into number_formats_node. /// Build an xml tree representing all number formats in workbook into number_formats_node.
/// Returns true on success. /// Returns true on success.
/// </summary> /// </summary>
bool write_number_formats(xml_node fonts_node) const; bool write_number_formats(xml_node &number_formats_node) const;
bool write_style_common(const alignment &style_alignment, const border &style_border, const fill &style_fill, const font &style_font, const number_format &style_number_format, const protection &style_protection, xml_node xf_node) const;
/// <summary> /// <summary>
/// Build an xml tree representing the given style into style_node. /// Build an xml tree representing the given style into style_node.
/// Returns true on success. /// Returns true on success.
/// </summary> /// </summary>
bool write_style(const style &style_, xml_node &style_node) const; bool write_cell_style(const cell_style &style, xml_node &style_node) const;
/// <summary>
/// Build an xml tree representing the given style into style_node.
/// Returns true on success.
/// </summary>
bool write_cell_styles(xml_node &styles_node) const;
/// <summary>
/// Build an xml tree representing the given style into cell_styles_node and styles_node.
/// Returns true on success.
/// </summary>
bool write_named_style(const named_style &style, xml_node &cell_styles_node) const;
bool write_named_styles(xml_node &cell_styles_node, xml_node &styles_node) const;
bool write_colors(xml_node &colors_node) const;
private: private:
void initialize_vectors();
/// <summary> /// <summary>
/// Set in the constructor, this workbook is used as the source or target for all writing or reading, respectively. /// Set in the constructor, this workbook is used as the source or target for all writing or reading, respectively.
/// </summary> /// </summary>
workbook &workbook_; workbook &workbook_;
std::vector<color> colors_;
std::vector<border> borders_;
std::vector<fill> fills_;
std::vector<font> fonts_;
std::vector<number_format> number_formats_;
std::vector<cell_style> cell_styles_;
std::vector<named_style> named_styles_;
}; };
} // namespace xlnt } // namespace xlnt

View File

@ -56,11 +56,15 @@ public:
void set_shrink_to_fit(bool shrink_to_fit); void set_shrink_to_fit(bool shrink_to_fit);
bool get_shrink_to_fit() const; bool get_shrink_to_fit() const;
void apply(bool value);
bool apply() const;
protected: protected:
std::string to_hash_string() const override; std::string to_hash_string() const override;
private: private:
bool apply_ = false;
horizontal_alignment horizontal_ = horizontal_alignment::none; horizontal_alignment horizontal_ = horizontal_alignment::none;
vertical_alignment vertical_ = vertical_alignment::none; vertical_alignment vertical_ = vertical_alignment::none;
int text_rotation_ = 0; int text_rotation_ = 0;

View File

@ -60,11 +60,16 @@ public:
const std::experimental::optional<side> &get_vertical() const; const std::experimental::optional<side> &get_vertical() const;
std::experimental::optional<side> &get_horizontal(); std::experimental::optional<side> &get_horizontal();
const std::experimental::optional<side> &get_horizontal() const; const std::experimental::optional<side> &get_horizontal() const;
void apply(bool value);
bool apply() const;
protected: protected:
std::string to_hash_string() const override; std::string to_hash_string() const override;
private: private:
bool apply_ = false;
std::experimental::optional<side> start_; std::experimental::optional<side> start_;
std::experimental::optional<side> end_; std::experimental::optional<side> end_;
std::experimental::optional<side> left_; std::experimental::optional<side> left_;

View File

@ -0,0 +1,55 @@
// Copyright (c) 2014-2016 Thomas Fussell
// Copyright (c) 2010-2015 openpyxl
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, WRISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE
//
// @license: http://www.opensource.org/licenses/mit-license.php
// @author: see AUTHORS file
#pragma once
#include <xlnt/styles/common_style.hpp>
namespace xlnt {
/// <summary>
/// Describes the formatting of a particular cell.
/// </summary>
class XLNT_CLASS cell_style : public common_style
{
public:
cell_style();
cell_style(const cell_style &other);
cell_style &operator=(const cell_style &other);
// Named Style
named_style &get_named_style();
const named_style &get_named_style() const;
void set_named_style(const std::string &style_name);
void set_named_style(const named_style &new_named_style);
void remove_named_style();
protected:
std::string to_hash_string() const override;
private:
detail::workbook_impl *parent_;
std::string named_style_name_;
};
} // namespace xlnt

View File

@ -33,75 +33,67 @@
namespace xlnt { namespace xlnt {
class workbook; class cell;
namespace detail { struct workbook_impl; }
/// <summary> /// <summary>
/// Describes the entirety of the formatting of a particular cell. /// Describes the formatting of a particular cell.
/// </summary> /// </summary>
class XLNT_CLASS format : public hashable class XLNT_CLASS common_style : public hashable
{ {
public: public:
format(); common_style();
format(const format &other); common_style(const common_style &other);
format &operator=(const format &other); common_style &operator=(const common_style &other);
std::size_t hash() const; void reset();
const alignment get_alignment() const;
const border get_border() const;
const fill get_fill() const;
const font get_font() const;
const number_format get_number_format() const;
const protection get_protection() const;
bool pivot_button() const;
bool quote_prefix() const;
std::size_t get_id() const;
std::size_t get_fill_id() const;
std::size_t get_font_id() const;
std::size_t get_border_id() const;
std::size_t get_number_format_id() const;
void apply_alignment(bool apply);
void apply_border(bool apply);
void apply_fill(bool apply);
void apply_font(bool apply);
void apply_number_format(bool apply);
void apply_protection(bool apply);
// Alignment
alignment &get_alignment();
const alignment &get_alignment() const;
void set_alignment(const alignment &new_alignment);
void remove_alignment();
// Border
border &get_border();
const border &get_border() const;
void set_border(const border &new_border);
void remove_border();
// Fill
fill &get_fill();
const fill &get_fill() const;
void set_fill(const fill &new_fill);
void remove_fill();
// Font
font &get_font();
const font &get_font() const;
void set_font(const font &new_font);
void remove_font();
// Number Format
number_format &get_number_format();
const number_format &get_number_format() const;
void set_number_format(const number_format &new_number_format);
void remove_number_format();
// Protection
protection &get_protection();
const protection &get_protection() const;
void set_protection(const protection &new_protection);
void remove_protection();
protected: protected:
std::string to_hash_string() const override; std::string to_hash_string() const override;
private: private:
friend class style_serializer;
friend class workbook;
std::size_t id_;
bool alignment_apply_;
alignment alignment_; alignment alignment_;
bool border_apply_;
std::size_t border_id_;
border border_; border border_;
bool fill_apply_;
std::size_t fill_id_;
fill fill_; fill fill_;
bool font_apply_;
std::size_t font_id_;
font font_; font font_;
bool number_format_apply_;
std::size_t number_format_id_;
number_format number_format_; number_format number_format_;
bool protection_apply_;
protection protection_; protection protection_;
bool pivot_button_;
bool quote_prefix_;
}; };
} // namespace xlnt } // namespace xlnt

View File

@ -117,19 +117,27 @@ public:
double get_gradient_top() const; double get_gradient_top() const;
double get_gradient_bottom() const; double get_gradient_bottom() const;
void apply(bool value);
bool apply() const;
protected: protected:
std::string to_hash_string() const override; std::string to_hash_string() const override;
private: private:
bool apply_ = false;
type type_ = type::none; type type_ = type::none;
pattern_type pattern_type_; pattern_type pattern_type_;
gradient_type gradient_type_; gradient_type gradient_type_;
double rotation_ = 0; double rotation_ = 0;
std::experimental::optional<color> foreground_color_ = color::black(); std::experimental::optional<color> foreground_color_ = color::black();
std::experimental::optional<color> background_color_ = color::white(); std::experimental::optional<color> background_color_ = color::white();
std::experimental::optional<color> start_color_ = color::white(); std::experimental::optional<color> start_color_ = color::white();
std::experimental::optional<color> end_color_ = color::black(); std::experimental::optional<color> end_color_ = color::black();
double gradient_path_left_ = 0; double gradient_path_left_ = 0;
double gradient_path_right_ = 0; double gradient_path_right_ = 0;
double gradient_path_top_ = 0; double gradient_path_top_ = 0;

View File

@ -87,12 +87,17 @@ public:
std::size_t get_family() const; std::size_t get_family() const;
bool has_scheme() const; bool has_scheme() const;
void apply(bool value);
bool apply() const;
protected: protected:
std::string to_hash_string() const override; std::string to_hash_string() const override;
private: private:
friend class style; friend class style;
bool apply_ = false;
std::string name_ = "Calibri"; std::string name_ = "Calibri";
std::size_t size_ = 11; std::size_t size_ = 11;

View File

@ -23,47 +23,39 @@
// @author: see AUTHORS file // @author: see AUTHORS file
#pragma once #pragma once
#include <xlnt/xlnt_config.hpp> #include <xlnt/styles/common_style.hpp>
#include <xlnt/utils/hashable.hpp>
namespace xlnt { namespace xlnt {
class workbook; class workbook;
/// <summary> /// <summary>
/// Describes the entirety of the styling of a particular cell. /// Describes a style which has a name and can be applied to multiple individual
/// cell_styles.
/// </summary> /// </summary>
class XLNT_CLASS style : public hashable class XLNT_CLASS named_style : public common_style
{ {
public: public:
style(); named_style();
style(const style &other); named_style(const named_style &other);
style &operator=(const style &other); named_style &operator=(const named_style &other);
std::size_t hash() const;
std::string get_name() const; std::string get_name() const;
void set_name(const std::string &name); void set_name(const std::string &name);
std::size_t get_format_id() const; bool get_hidden() const;
void set_format_id(std::size_t format_id); void set_hidden(bool value);
std::size_t get_builtin_id() const; std::size_t get_builtin_id() const;
void set_builtin_id(std::size_t builtin_id); void set_builtin_id(std::size_t builtin_id);
void set_hidden(bool hidden);
bool get_hidden() const;
protected: protected:
std::string to_hash_string() const override; std::string to_hash_string() const override;
private: private:
friend class workbook;
std::size_t id_;
std::string name_; std::string name_;
std::size_t format_id_;
std::size_t builtin_id_;
bool hidden_; bool hidden_;
std::size_t builtin_id;
}; };
} // namespace xlnt } // namespace xlnt

View File

@ -23,6 +23,7 @@
// @author: see AUTHORS file // @author: see AUTHORS file
#pragma once #pragma once
#include <cstdint>
#include <string> #include <string>
#include <xlnt/xlnt_config.hpp> #include <xlnt/xlnt_config.hpp>
@ -94,11 +95,15 @@ public:
std::string format(long double number, calendar base_date) const; std::string format(long double number, calendar base_date) const;
bool is_date_format() const; bool is_date_format() const;
void apply(bool value);
bool apply() const;
protected: protected:
std::string to_hash_string() const override; std::string to_hash_string() const override;
private: private:
bool apply_ = false;
bool id_set_; bool id_set_;
std::size_t id_; std::size_t id_;
std::string format_string_; std::string format_string_;

View File

@ -48,11 +48,15 @@ public:
void set_locked(type locked_type); void set_locked(type locked_type);
void set_hidden(type hidden_type); void set_hidden(type hidden_type);
void apply(bool value);
bool apply() const;
protected: protected:
std::string to_hash_string() const override; std::string to_hash_string() const override;
private: private:
bool apply_ = false;
type locked_; type locked_;
type hidden_; type hidden_;
}; };

View File

@ -39,4 +39,17 @@ protected:
virtual std::string to_hash_string() const = 0; virtual std::string to_hash_string() const = 0;
}; };
} // namespace } // namespace xlnt
namespace std {
template<>
struct hash<xlnt::hashable>
{
size_t operator()(const xlnt::hashable &k) const
{
return k.hash();
}
};
} // namepsace std

View File

@ -37,7 +37,7 @@ namespace xlnt {
class alignment; class alignment;
class app_properties; class app_properties;
class border; class border;
class format; class cell_style;
class color; class color;
class const_worksheet_iterator; class const_worksheet_iterator;
class document_properties; class document_properties;
@ -53,7 +53,7 @@ class protection;
class range; class range;
class range_reference; class range_reference;
class relationship; class relationship;
class style; class named_style;
class theme; class theme;
class worksheet; class worksheet;
class worksheet_iterator; class worksheet_iterator;
@ -176,57 +176,16 @@ public:
relationship get_relationship(const std::string &id) const; relationship get_relationship(const std::string &id) const;
const std::vector<relationship> &get_relationships() const; const std::vector<relationship> &get_relationships() const;
void add_alignment(const alignment &a);
void add_border(const border &b);
void add_fill(const fill &f);
void add_font(const font &f);
void add_color(const color &c);
void add_number_format(const number_format &format);
void add_protection(const protection &p);
const std::vector<format> &get_cell_style_formats() const;
const std::vector<format> &get_cell_formats() const;
const std::vector<style> &get_styles() const;
const std::vector<color> &get_colors() const;
const std::vector<border> &get_borders() const;
const std::vector<fill> &get_fills() const;
const std::vector<font> &get_fonts() const;
const std::vector<number_format> &get_number_formats() const;
color add_indexed_color(const color &rgb_color);
color get_indexed_color(const color &indexed_color) const;
format &add_default_cell_format();
const number_format &get_number_format(std::size_t style_id) const;
std::size_t set_number_format(const number_format &format, std::size_t style_id);
const font &get_font(std::size_t style_id) const;
std::size_t set_font(const font &font_, std::size_t style_id);
const fill &get_fill(std::size_t style_id) const;
std::size_t set_fill(const fill &fill_, std::size_t style_id);
const border &get_border(std::size_t style_id) const;
std::size_t set_border(const border &border_, std::size_t style_id);
const alignment &get_alignment(std::size_t style_id) const;
std::size_t set_alignment(const alignment &alignment_, std::size_t style_id);
const protection &get_protection(std::size_t style_id) const;
std::size_t set_protection(const protection &protection_, std::size_t style_id);
bool get_pivot_button(std::size_t style_id) const;
bool get_quote_prefix(std::size_t style_id) const;
void set_code_name(const std::string &code_name); void set_code_name(const std::string &code_name);
bool has_loaded_theme() const; bool has_loaded_theme() const;
const theme &get_loaded_theme() const; const theme &get_loaded_theme() const;
const format &get_cell_style_format(std::size_t format_id) const;
std::size_t add_cell_style_format(const format &format_);
const format &get_cell_format(std::size_t format_id) const; // Named Styles
std::size_t add_cell_format(const format &format_); bool has_named_style(const std::string &name);
named_style &get_named_style(const std::string &name);
const style &get_style(std::size_t style_id) const; const named_style &get_named_style(const std::string &name) const;
std::size_t add_style(const style &style_); named_style &create_named_style(const std::string &name);
manifest &get_manifest(); manifest &get_manifest();
const manifest &get_manifest() const; const manifest &get_manifest() const;
@ -242,7 +201,7 @@ public:
private: private:
friend class worksheet; friend class worksheet;
std::shared_ptr<detail::workbook_impl> d_; std::unique_ptr<detail::workbook_impl> d_;
}; };
} // namespace xlnt } // namespace xlnt

View File

@ -30,8 +30,8 @@
#include <xlnt/packaging/document_properties.hpp> #include <xlnt/packaging/document_properties.hpp>
#include <xlnt/packaging/relationship.hpp> #include <xlnt/packaging/relationship.hpp>
#include <xlnt/serialization/encoding.hpp> #include <xlnt/serialization/encoding.hpp>
#include <xlnt/styles/cell_style.hpp>
#include <xlnt/styles/color.hpp> #include <xlnt/styles/color.hpp>
#include <xlnt/styles/format.hpp>
#include <xlnt/utils/date.hpp> #include <xlnt/utils/date.hpp>
#include <xlnt/utils/datetime.hpp> #include <xlnt/utils/datetime.hpp>
#include <xlnt/utils/time.hpp> #include <xlnt/utils/time.hpp>

View File

@ -73,12 +73,6 @@ struct workbook_impl
guess_types_ = other.guess_types_; guess_types_ = other.guess_types_;
data_only_ = other.data_only_; data_only_ = other.data_only_;
read_only_ = other.read_only_; read_only_ = other.read_only_;
styles_ = other.styles_;
borders_ = other.borders_;
fills_ = other.fills_;
fonts_ = other.fonts_;
number_formats_ = other.number_formats_;
colors_ = other.colors_;
manifest_ = other.manifest_; manifest_ = other.manifest_;
return *this; return *this;
@ -98,24 +92,12 @@ struct workbook_impl
bool data_only_; bool data_only_;
bool read_only_; bool read_only_;
std::vector<format> cell_style_formats_;
std::vector<format> cell_formats_;
std::vector<style> styles_; std::vector<style> styles_;
std::size_t next_custom_format_id_; std::size_t next_custom_format_id_;
std::vector<color> colors_;
std::vector<border> borders_;
std::vector<fill> fills_;
std::vector<font> fonts_;
std::vector<number_format> number_formats_;
manifest manifest_;
theme theme_;
encoding encoding_;
manifest manifest_;
theme theme_;
encoding encoding_;
std::vector<std::uint8_t> thumbnail_; std::vector<std::uint8_t> thumbnail_;
}; };

View File

@ -22,18 +22,24 @@
// @license: http://www.opensource.org/licenses/mit-license.php // @license: http://www.opensource.org/licenses/mit-license.php
// @author: see AUTHORS file // @author: see AUTHORS file
#include <cctype> // for std::tolower #include <cctype> // for std::tolower
#include <unordered_set>
#include <xlnt/serialization/style_serializer.hpp> #include <xlnt/serialization/style_serializer.hpp>
#include <xlnt/cell/cell.hpp>
#include <xlnt/serialization/xml_document.hpp> #include <xlnt/serialization/xml_document.hpp>
#include <xlnt/serialization/xml_node.hpp> #include <xlnt/serialization/xml_node.hpp>
#include <xlnt/styles/alignment.hpp> #include <xlnt/styles/alignment.hpp>
#include <xlnt/styles/border.hpp> #include <xlnt/styles/border.hpp>
#include <xlnt/styles/cell_style.hpp>
#include <xlnt/styles/fill.hpp> #include <xlnt/styles/fill.hpp>
#include <xlnt/styles/font.hpp> #include <xlnt/styles/font.hpp>
#include <xlnt/styles/format.hpp>
#include <xlnt/styles/number_format.hpp> #include <xlnt/styles/number_format.hpp>
#include <xlnt/styles/protection.hpp> #include <xlnt/styles/protection.hpp>
#include <xlnt/styles/style.hpp> #include <xlnt/workbook/worksheet_iterator.hpp>
#include <xlnt/worksheet/cell_iterator.hpp>
#include <xlnt/worksheet/cell_vector.hpp>
#include <xlnt/worksheet/worksheet.hpp>
#include <xlnt/worksheet/range_iterator.hpp>
namespace { namespace {
@ -266,20 +272,45 @@ alignment style_serializer::read_alignment(const xml_node &alignment_node)
return align; return align;
} }
format style_serializer::read_format(const xml_node &format_node) cell_style style_serializer::read_cell_style(const xml_node &style_node)
{ {
format f; cell_style s;
// Alignment
s.get_alignment().apply(style_node.has_child("alignment") || is_true(style_node.get_attribute("applyAlignment")));
f.apply_number_format(is_true(format_node.get_attribute("applyNumberFormat"))); if (s.get_alignment().apply())
f.number_format_id_ = std::stoull(format_node.get_attribute("numFmtId")); {
auto inline_alignment = read_alignment(style_node.get_child("alignment"));
s.set_alignment(inline_alignment);
}
// Border
s.get_border().apply(is_true(style_node.get_attribute("applyBorder")));
auto border_index = style_node.has_attribute("borderId") ? std::stoull(style_node.get_attribute("borderId")) : 0;
s.set_border(borders_.at(border_index));
// Fill
s.get_fill().apply(is_true(style_node.get_attribute("applyFill")));
auto fill_index = style_node.has_attribute("fillId") ? std::stoull(style_node.get_attribute("fillId")) : 0;
s.set_fill(fills_.at(fill_index));
// Font
s.get_font().apply(is_true(style_node.get_attribute("applyFont")));
auto font_index = style_node.has_attribute("fontId") ? std::stoull(style_node.get_attribute("fontId")) : 0;
s.set_font(fonts_.at(font_index));
// Number Format
s.get_number_format().apply(is_true(style_node.get_attribute("applyNumberFormat")));
auto number_format_id = std::stoull(style_node.get_attribute("numFmtId"));
bool builtin_format = true; bool builtin_format = true;
for (auto num_fmt : workbook_.get_number_formats()) for (const auto &num_fmt : number_formats_)
{ {
if (static_cast<std::size_t>(num_fmt.get_id()) == f.get_number_format_id()) if (static_cast<std::size_t>(num_fmt.get_id()) == number_format_id)
{ {
f.number_format_ = num_fmt; s.set_number_format(num_fmt);
builtin_format = false; builtin_format = false;
break; break;
} }
@ -287,49 +318,40 @@ format style_serializer::read_format(const xml_node &format_node)
if (builtin_format) if (builtin_format)
{ {
f.number_format_ = number_format::from_builtin_id(f.get_number_format_id()); s.set_number_format(number_format::from_builtin_id(number_format_id));
} }
f.apply_font(is_true(format_node.get_attribute("applyFont"))); // Protection
f.font_id_ = format_node.has_attribute("fontId") ? std::stoull(format_node.get_attribute("fontId")) : 0; s.get_protection().apply(style_node.has_attribute("protection") || is_true(style_node.get_attribute("applyProtection")));
f.font_ = workbook_.get_font(f.font_id_);
f.apply_fill(is_true(format_node.get_attribute("applyFill"))); if (s.get_protection().apply())
f.fill_id_ = format_node.has_attribute("fillId") ? std::stoull(format_node.get_attribute("fillId")) : 0;
f.fill_ = workbook_.get_fill(f.fill_id_);
f.apply_border(is_true(format_node.get_attribute("applyBorder")));
f.border_id_ = format_node.has_attribute("borderId") ? std::stoull(format_node.get_attribute("borderId")) : 0;
f.border_ = workbook_.get_border(f.border_id_);
f.apply_protection(format_node.has_attribute("protection"));
if (f.protection_apply_)
{ {
auto inline_protection = read_protection(format_node.get_child("protection")); auto inline_protection = read_protection(style_node.get_child("protection"));
f.protection_ = inline_protection; s.set_protection(inline_protection);
} }
f.apply_alignment(format_node.has_child("alignment")); return s;
if (f.alignment_apply_)
{
auto inline_alignment = read_alignment(format_node.get_child("alignment"));
f.alignment_ = inline_alignment;
}
return f;
} }
style style_serializer::read_style(const xml_node &style_node) named_style style_serializer::read_named_style(const xml_node &named_style_node, const xml_node &style_parent_node)
{ {
style s; named_style s;
s.set_name(style_node.get_attribute("name")); s.set_name(named_style_node.get_attribute("name"));
s.set_format_id(std::stoull(style_node.get_attribute("xfId"))); s.set_hidden(named_style_node.has_attribute("hidden") && is_true(named_style_node.get_attribute("hidden")));
s.set_hidden(style_node.has_attribute("hidden") && is_true(style_node.get_attribute("hidden"))); s.set_builtin_id(std::stoull(named_style_node.get_attribute("builtinId")));
s.set_builtin_id(std::stoull(style_node.get_attribute("builtinId")));
auto base_style_id = std::stoull(named_style_node.get_attribute("xfId"));
auto base_style_node = style_parent_node.get_children().at(base_style_id);
auto base_style = read_cell_style(base_style_node);
s.set_alignment(base_style.get_alignment());
s.set_border(base_style.get_border());
s.set_fill(base_style.get_fill());
s.set_font(base_style.get_font());
s.set_number_format(base_style.get_number_format());
s.set_protection(base_style.get_protection());
return s; return s;
} }
@ -342,43 +364,30 @@ bool style_serializer::read_stylesheet(const xml_document &xml)
read_fonts(stylesheet_node.get_child("fonts")); read_fonts(stylesheet_node.get_child("fonts"));
read_number_formats(stylesheet_node.get_child("numFmts")); read_number_formats(stylesheet_node.get_child("numFmts"));
read_colors(stylesheet_node.get_child("colors")); read_colors(stylesheet_node.get_child("colors"));
read_named_styles(stylesheet_node.get_child("cellStyles"), stylesheet_node.get_child("cellStyleXfs"));
read_cell_styles(stylesheet_node.get_child("cellXfs"));
auto cell_style_formats_node = stylesheet_node.get_child("cellStyleXfs"); return true;
}
for (auto format_node : cell_style_formats_node.get_children()) bool style_serializer::read_cell_styles(const xlnt::xml_node &cell_styles_node)
{
for (auto style_node : cell_styles_node.get_children())
{ {
if (format_node.get_name() != "xf") if (style_node.get_name() != "xf")
{ {
continue; continue;
} }
workbook_.add_cell_style_format(read_format(format_node)); auto style = read_cell_style(style_node);
if(style_node.has_attribute("xfId"))
{
auto named_style_index = std::stoull(style_node.get_attribute("xfId"));
auto named_style = named_styles_.at(named_style_index);
}
} }
auto cell_formats_node = stylesheet_node.get_child("cellXfs");
for (auto format_node : cell_formats_node.get_children())
{
if (format_node.get_name() != "xf")
{
continue;
}
workbook_.add_cell_format(read_format(format_node));
}
auto cell_styles_node = stylesheet_node.get_child("cellStyles");
for (auto cell_style_node : cell_styles_node.get_children())
{
if (cell_style_node.get_name() != "cellStyle")
{
continue;
}
workbook_.add_style(read_style(cell_style_node));
}
return true; return true;
} }
@ -403,7 +412,7 @@ bool style_serializer::read_number_formats(const xml_node &number_formats_node)
nf.set_format_string(format_string); nf.set_format_string(format_string);
nf.set_id(std::stoull(num_fmt_node.get_attribute("numFmtId"))); nf.set_id(std::stoull(num_fmt_node.get_attribute("numFmtId")));
workbook_.add_number_format(nf); number_formats_.push_back(nf);
} }
return true; return true;
@ -413,7 +422,7 @@ bool style_serializer::read_fonts(const xml_node &fonts_node)
{ {
for (auto font_node : fonts_node.get_children()) for (auto font_node : fonts_node.get_children())
{ {
workbook_.add_font(read_font(font_node)); fonts_.push_back(read_font(font_node));
} }
return true; return true;
@ -501,7 +510,7 @@ bool style_serializer::read_colors(const xml_node &colors_node)
for (const auto &indexed_color : indexed_colors) for (const auto &indexed_color : indexed_colors)
{ {
workbook_.add_color(indexed_color); colors_.push_back(indexed_color);
} }
} }
@ -512,7 +521,7 @@ bool style_serializer::read_fills(const xml_node &fills_node)
{ {
for (auto fill_node : fills_node.get_children()) for (auto fill_node : fills_node.get_children())
{ {
workbook_.add_fill(read_fill(fill_node)); fills_.push_back(read_fill(fill_node));
} }
return true; return true;
@ -564,7 +573,7 @@ bool style_serializer::read_borders(const xml_node &borders_node)
{ {
for (auto border_node : borders_node.get_children()) for (auto border_node : borders_node.get_children())
{ {
workbook_.add_border(read_border(border_node)); borders_.push_back(read_border(border_node));
} }
return true; return true;
@ -656,40 +665,67 @@ color style_serializer::read_color(const xml_node &color_node)
throw std::runtime_error("bad color"); throw std::runtime_error("bad color");
} }
xml_document style_serializer::write_stylesheet() const void style_serializer::initialize_vectors()
{ {
xml_document xml; std::unordered_set<cell_style, std::hash<hashable>> cell_styles_set;
auto style_sheet_node = xml.add_child("styleSheet"); for (auto ws : workbook_)
xml.add_namespace("", "http://schemas.openxmlformats.org/spreadsheetml/2006/main");
xml.add_namespace("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
style_sheet_node.add_attribute("mc:Ignorable", "x14ac");
xml.add_namespace("x14ac", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac");
auto num_fmts_node = style_sheet_node.add_child("numFmts");
auto num_fmts = workbook_.get_number_formats();
num_fmts_node.add_attribute("count", std::to_string(num_fmts.size()));
for (const auto &num_fmt : num_fmts)
{ {
auto num_fmt_node = num_fmts_node.add_child("numFmt"); for (auto row : ws)
num_fmt_node.add_attribute("numFmtId", std::to_string(num_fmt.get_id())); {
num_fmt_node.add_attribute("formatCode", num_fmt.get_format_string()); for (auto c : row)
{
if (c.has_style())
{
cell_styles_set.insert(c.get_style());
}
}
}
} }
auto fonts_node = style_sheet_node.add_child("fonts"); cell_styles_.assign(cell_styles_set.begin(), cell_styles_set.end());
auto fonts = workbook_.get_fonts(); colors_.clear();
borders_.clear();
if (fonts.empty()) fills_.clear();
fonts_.clear();
number_formats_.clear();
for (auto &style : cell_styles_)
{ {
fonts.push_back(font()); if (std::find(borders_.begin(), borders_.end(), style.get_border()) == borders_.end())
{
borders_.push_back(style.get_border());
}
if (std::find(fills_.begin(), fills_.end(), style.get_fill()) == fills_.end())
{
fills_.push_back(style.get_fill());
}
if (std::find(fonts_.begin(), fonts_.end(), style.get_font()) == fonts_.end())
{
fonts_.push_back(style.get_font());
}
if (std::find(number_formats_.begin(), number_formats_.end(), style.get_number_format()) == number_formats_.end())
{
number_formats_.push_back(style.get_number_format());
}
} }
if (fonts_.empty())
{
fonts_.push_back(font());
}
}
fonts_node.add_attribute("count", std::to_string(fonts.size())); bool style_serializer::write_fonts(xlnt::xml_node &fonts_node) const
{
fonts_node.add_attribute("count", std::to_string(fonts_.size()));
// TODO: what does this do? // TODO: what does this do?
// fonts_node.add_attribute("x14ac:knownFonts", "1"); // fonts_node.add_attribute("x14ac:knownFonts", "1");
for (auto &f : fonts) for (auto &f : fonts_)
{ {
auto font_node = fonts_node.add_child("font"); auto font_node = fonts_node.add_child("font");
@ -762,12 +798,15 @@ xml_document style_serializer::write_stylesheet() const
scheme_node.add_attribute("val", "minor"); scheme_node.add_attribute("val", "minor");
} }
} }
return true;
}
auto fills_node = style_sheet_node.add_child("fills"); bool style_serializer::write_fills(xlnt::xml_node &fills_node) const
const auto &fills = workbook_.get_fills(); {
fills_node.add_attribute("count", std::to_string(fills.size())); fills_node.add_attribute("count", std::to_string(fills_.size()));
for (auto &fill_ : fills) for (auto &fill_ : fills_)
{ {
auto fill_node = fills_node.add_child("fill"); auto fill_node = fills_node.add_child("fill");
@ -854,11 +893,14 @@ xml_document style_serializer::write_stylesheet() const
} }
} }
auto borders_node = style_sheet_node.add_child("borders"); return true;
const auto &borders = workbook_.get_borders(); }
borders_node.add_attribute("count", std::to_string(borders.size()));
for (const auto &border_ : borders) bool style_serializer::write_borders(xlnt::xml_node &borders_node) const
{
borders_node.add_attribute("count", std::to_string(borders_.size()));
for (const auto &border_ : borders_)
{ {
auto border_node = borders_node.add_child("border"); auto border_node = borders_node.add_child("border");
@ -963,233 +1005,244 @@ xml_document style_serializer::write_stylesheet() const
} }
} }
auto cell_style_xfs_node = style_sheet_node.add_child("cellStyleXfs"); return true;
auto &cell_style_formats = workbook_.get_cell_style_formats(); }
cell_style_xfs_node.add_attribute("count", std::to_string(cell_style_formats.size()));
for(auto &format : cell_style_formats) bool style_serializer::write_style_common(const alignment &style_alignment, const border &style_border, const fill &style_fill, const font &style_font, const number_format &style_number_format, const protection &style_protection, xml_node xf_node) const
{
xf_node.add_attribute("numFmtId", std::to_string(style_number_format.get_id()));
auto font_id = std::distance(fonts_.begin(), std::find(fonts_.begin(), fonts_.end(), style_font));
xf_node.add_attribute("fontId", std::to_string(font_id));
if (style_fill.apply())
{ {
auto xf_node = cell_style_xfs_node.add_child("xf"); auto fill_id = std::distance(fills_.begin(), std::find(fills_.begin(), fills_.end(), style_fill));
xf_node.add_attribute("fillId", std::to_string(fill_id));
xf_node.add_attribute("numFmtId", std::to_string(format.get_number_format().get_id()));
xf_node.add_attribute("fontId", std::to_string(format.get_font_id()));
xf_node.add_attribute("fillId", std::to_string(format.get_fill_id()));
xf_node.add_attribute("borderId", std::to_string(format.get_border_id()));
xf_node.add_attribute("applyNumberFormat", format.number_format_apply_ ? "1" : "0");
xf_node.add_attribute("applyFill", format.fill_apply_ ? "1" : "0");
xf_node.add_attribute("applyFont", format.font_apply_ ? "1" : "0");
xf_node.add_attribute("applyBorder", format.border_apply_ ? "1" : "0");
xf_node.add_attribute("applyAlignment", format.alignment_apply_ ? "1" : "0");
xf_node.add_attribute("applyProtection", format.protection_apply_ ? "1" : "0");
if (format.alignment_apply_)
{
auto alignment_node = xf_node.add_child("alignment");
if (format.alignment_.has_vertical())
{
switch (format.alignment_.get_vertical())
{
case vertical_alignment::bottom:
alignment_node.add_attribute("vertical", "bottom");
break;
case vertical_alignment::center:
alignment_node.add_attribute("vertical", "center");
break;
case vertical_alignment::justify:
alignment_node.add_attribute("vertical", "justify");
break;
case vertical_alignment::top:
alignment_node.add_attribute("vertical", "top");
break;
default:
throw std::runtime_error("invalid alignment");
}
}
if (format.alignment_.has_horizontal())
{
switch (format.alignment_.get_horizontal())
{
case horizontal_alignment::center:
alignment_node.add_attribute("horizontal", "center");
break;
case horizontal_alignment::center_continuous:
alignment_node.add_attribute("horizontal", "center_continuous");
break;
case horizontal_alignment::general:
alignment_node.add_attribute("horizontal", "general");
break;
case horizontal_alignment::justify:
alignment_node.add_attribute("horizontal", "justify");
break;
case horizontal_alignment::left:
alignment_node.add_attribute("horizontal", "left");
break;
case horizontal_alignment::right:
alignment_node.add_attribute("horizontal", "right");
break;
default:
throw std::runtime_error("invalid alignment");
}
}
if (format.alignment_.get_wrap_text())
{
alignment_node.add_attribute("wrapText", "1");
}
if (format.alignment_.get_shrink_to_fit())
{
alignment_node.add_attribute("shrinkToFit", "1");
}
}
} }
auto cell_xfs_node = style_sheet_node.add_child("cellXfs"); if (style_border.apply())
const auto &formats = workbook_.get_cell_formats();
cell_xfs_node.add_attribute("count", std::to_string(formats.size()));
for (auto &format : formats)
{ {
auto xf_node = cell_xfs_node.add_child("xf"); auto border_id = std::distance(borders_.begin(), std::find(borders_.begin(), borders_.end(), style_border));
xf_node.add_attribute("numFmtId", std::to_string(format.get_number_format_id())); xf_node.add_attribute("borderId", std::to_string(border_id));
xf_node.add_attribute("fontId", std::to_string(format.get_font_id()));
if (format.fill_apply_)
{
xf_node.add_attribute("fillId", std::to_string(format.get_fill_id()));
}
if (format.border_apply_)
{
xf_node.add_attribute("borderId", std::to_string(format.get_border_id()));
}
xf_node.add_attribute("xfId", "0");
xf_node.add_attribute("applyNumberFormat", format.number_format_apply_ ? "1" : "0");
xf_node.add_attribute("applyFont", format.font_apply_ ? "1" : "0");
xf_node.add_attribute("applyFill", format.fill_apply_ ? "1" : "0");
xf_node.add_attribute("applyBorder", format.border_apply_ ? "1" : "0");
xf_node.add_attribute("applyAlignment", format.alignment_apply_ ? "1" : "0");
xf_node.add_attribute("applyProtection", format.protection_apply_ ? "1" : "0");
if (format.alignment_apply_)
{
auto alignment_node = xf_node.add_child("alignment");
if (format.alignment_.has_vertical())
{
switch (format.alignment_.get_vertical())
{
case vertical_alignment::bottom:
alignment_node.add_attribute("vertical", "bottom");
break;
case vertical_alignment::center:
alignment_node.add_attribute("vertical", "center");
break;
case vertical_alignment::justify:
alignment_node.add_attribute("vertical", "justify");
break;
case vertical_alignment::top:
alignment_node.add_attribute("vertical", "top");
break;
default:
throw std::runtime_error("invalid alignment");
}
}
if (format.alignment_.has_horizontal())
{
switch (format.alignment_.get_horizontal())
{
case horizontal_alignment::center:
alignment_node.add_attribute("horizontal", "center");
break;
case horizontal_alignment::center_continuous:
alignment_node.add_attribute("horizontal", "center_continuous");
break;
case horizontal_alignment::general:
alignment_node.add_attribute("horizontal", "general");
break;
case horizontal_alignment::justify:
alignment_node.add_attribute("horizontal", "justify");
break;
case horizontal_alignment::left:
alignment_node.add_attribute("horizontal", "left");
break;
case horizontal_alignment::right:
alignment_node.add_attribute("horizontal", "right");
break;
default:
throw std::runtime_error("invalid alignment");
}
}
if (format.alignment_.get_wrap_text())
{
alignment_node.add_attribute("wrapText", "1");
}
if (format.alignment_.get_shrink_to_fit())
{
alignment_node.add_attribute("shrinkToFit", "1");
}
}
} }
auto cell_styles_node = style_sheet_node.add_child("cellStyles"); xf_node.add_attribute("applyNumberFormat", style_number_format.apply() ? "1" : "0");
auto &styles = workbook_.get_styles(); xf_node.add_attribute("applyFill", style_fill.apply() ? "1" : "0");
cell_styles_node.add_attribute("count", std::to_string(styles.size())); xf_node.add_attribute("applyFont", style_font.apply() ? "1" : "0");
xf_node.add_attribute("applyBorder", style_border.apply() ? "1" : "0");
xf_node.add_attribute("applyAlignment", style_alignment.apply() ? "1" : "0");
xf_node.add_attribute("applyProtection", style_protection.apply() ? "1" : "0");
for(auto &cell_style : styles) if (style_alignment.apply())
{
auto alignment_node = xf_node.add_child("alignment");
if (style_alignment.has_vertical())
{
switch (style_alignment.get_vertical())
{
case vertical_alignment::bottom:
alignment_node.add_attribute("vertical", "bottom");
break;
case vertical_alignment::center:
alignment_node.add_attribute("vertical", "center");
break;
case vertical_alignment::justify:
alignment_node.add_attribute("vertical", "justify");
break;
case vertical_alignment::top:
alignment_node.add_attribute("vertical", "top");
break;
default:
throw std::runtime_error("invalid alignment");
}
}
if (style_alignment.has_horizontal())
{
switch (style_alignment.get_horizontal())
{
case horizontal_alignment::center:
alignment_node.add_attribute("horizontal", "center");
break;
case horizontal_alignment::center_continuous:
alignment_node.add_attribute("horizontal", "center_continuous");
break;
case horizontal_alignment::general:
alignment_node.add_attribute("horizontal", "general");
break;
case horizontal_alignment::justify:
alignment_node.add_attribute("horizontal", "justify");
break;
case horizontal_alignment::left:
alignment_node.add_attribute("horizontal", "left");
break;
case horizontal_alignment::right:
alignment_node.add_attribute("horizontal", "right");
break;
default:
throw std::runtime_error("invalid alignment");
}
}
if (style_alignment.get_wrap_text())
{
alignment_node.add_attribute("wrapText", "1");
}
if (style_alignment.get_shrink_to_fit())
{
alignment_node.add_attribute("shrinkToFit", "1");
}
}
return true;
}
bool style_serializer::write_cell_style(const cell_style &style, xml_node &xf_node) const
{
return write_style_common(style.get_alignment(), style.get_border(), style.get_fill(), style.get_font(), style.get_number_format(), style.get_protection(), xf_node);
}
bool style_serializer::write_named_style(const named_style &style, xml_node &xf_node) const
{
return write_style_common(style.get_alignment(), style.get_border(), style.get_fill(), style.get_font(), style.get_number_format(), style.get_protection(), xf_node);
}
bool style_serializer::write_named_styles(xml_node &cell_styles_node, xml_node &styles_node) const
{
styles_node.add_attribute("count", std::to_string(named_styles_.size()));
for(auto &style : named_styles_)
{
auto xf_node = styles_node.add_child("xf");
write_named_style(style, xf_node);
}
cell_styles_node.add_attribute("count", std::to_string(named_styles_.size()));
for(auto &style : named_styles_)
{ {
auto cell_style_node = cell_styles_node.add_child("cellStyle"); auto cell_style_node = cell_styles_node.add_child("cellStyle");
cell_style_node.add_attribute("name", cell_style.get_name()); cell_style_node.add_attribute("name", style.get_name());
cell_style_node.add_attribute("xfId", std::to_string(cell_style.get_format_id())); // cell_style_node.add_attribute("xfId", std::to_string(style.get_format_id()));
cell_style_node.add_attribute("builtinId", std::to_string(cell_style.get_builtin_id())); cell_style_node.add_attribute("builtinId", std::to_string(style.get_builtin_id()));
if (cell_style.get_hidden()) if (style.get_hidden())
{ {
cell_style_node.add_attribute("hidden", "1"); cell_style_node.add_attribute("hidden", "1");
} }
} }
style_sheet_node.add_child("dxfs").add_attribute("count", "0"); return true;
}
auto table_styles_node = style_sheet_node.add_child("tableStyles"); bool style_serializer::write_cell_styles(xml_node &cell_styles_node) const
{
cell_styles_node.add_attribute("count", std::to_string(cell_styles_.size()));
for(auto &style : cell_styles_)
{
auto xf_node = cell_styles_node.add_child("xf");
write_cell_style(style, xf_node);
xf_node.add_attribute("xfId", "0"); //TODO point to named style here
}
return true;
}
bool write_dxfs(xlnt::xml_node &dxfs_node)
{
dxfs_node.add_attribute("count", "0");
return true;
}
bool write_table_styles(xlnt::xml_node &table_styles_node)
{
table_styles_node.add_attribute("count", "0"); table_styles_node.add_attribute("count", "0");
table_styles_node.add_attribute("defaultTableStyle", "TableStyleMedium2"); table_styles_node.add_attribute("defaultTableStyle", "TableStyleMedium2");
table_styles_node.add_attribute("defaultPivotStyle", "PivotStyleMedium9"); table_styles_node.add_attribute("defaultPivotStyle", "PivotStyleMedium9");
return true;
}
if(!workbook_.get_colors().empty()) bool style_serializer::write_colors(xlnt::xml_node &colors_node) const
{
auto indexed_colors_node = colors_node.add_child("indexedColors");
for (auto &c : colors_)
{ {
auto colors_node = style_sheet_node.add_child("colors"); indexed_colors_node.add_child("rgbColor").add_attribute("rgb", c.get_rgb_string());
auto indexed_colors_node = colors_node.add_child("indexedColors");
for (auto &c : workbook_.get_colors())
{
indexed_colors_node.add_child("rgbColor").add_attribute("rgb", c.get_rgb_string());
}
} }
auto ext_list_node = style_sheet_node.add_child("extLst"); return true;
}
bool write_colors(xlnt::xml_node &ext_list_node)
{
auto ext_node = ext_list_node.add_child("ext"); auto ext_node = ext_list_node.add_child("ext");
ext_node.add_attribute("uri", "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}"); ext_node.add_attribute("uri", "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}");
ext_node.add_attribute("xmlns:x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); ext_node.add_attribute("xmlns:x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
ext_node.add_child("x14:slicerStyles").add_attribute("defaultSlicerStyle", "SlicerStyleLight1"); ext_node.add_child("x14:slicerStyles").add_attribute("defaultSlicerStyle", "SlicerStyleLight1");
return xml; return true;
} }
bool style_serializer::write_number_formats(xml_node number_formats_node) const xml_document style_serializer::write_stylesheet()
{ {
number_formats_node.add_attribute("count", std::to_string(workbook_.get_number_formats().size())); initialize_vectors();
xml_document doc;
auto root_node = doc.add_child("styleSheet");
doc.add_namespace("", "http://schemas.openxmlformats.org/spreadsheetml/2006/main");
doc.add_namespace("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
root_node.add_attribute("mc:Ignorable", "x14ac");
doc.add_namespace("x14ac", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac");
for (const auto &num_fmt : workbook_.get_number_formats()) auto number_formats_node = root_node.add_child("numFmts");
write_number_formats(number_formats_node);
auto fonts_node = root_node.add_child("fonts");
write_fonts(fonts_node);
auto fills_node = root_node.add_child("fills");
write_fills(fills_node);
auto borders_node = root_node.add_child("borders");
write_borders(borders_node);
auto cell_style_xfs_node = root_node.add_child("cellStyleXfs");
auto cell_styles_node = root_node.add_child("cellStyles");
write_named_styles(root_node, cell_style_xfs_node);
auto cell_xfs_node = root_node.add_child("cellXfs");
write_cell_styles(cell_styles_node);
auto dxfs_node = root_node.add_child("dxfs");
write_dxfs(dxfs_node);
auto table_styles_node = root_node.add_child("tableStyles");
write_table_styles(table_styles_node);
if(!colors_.empty())
{
auto colors_node = root_node.add_child("colors");
write_colors(colors_node);
}
auto ext_list_node = root_node.add_child("extLst");
write_ext_list(ext_list_node);
return doc;
}
bool style_serializer::write_number_formats(xml_node &number_formats_node) const
{
number_formats_node.add_attribute("count", std::to_string(number_formats_.size()));
for (const auto &num_fmt : number_formats_)
{ {
auto num_fmt_node = number_formats_node.add_child("numFmt"); auto num_fmt_node = number_formats_node.add_child("numFmt");
num_fmt_node.add_attribute("numFmtId", std::to_string(num_fmt.get_id())); num_fmt_node.add_attribute("numFmtId", std::to_string(num_fmt.get_id()));

View File

@ -0,0 +1,117 @@
// Copyright (c) 2014-2016 Thomas Fussell
// Copyright (c) 2010-2015 openpyxl
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, WRISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE
//
// @license: http://www.opensource.org/licenses/mit-license.php
// @author: see AUTHORS file
#include <xlnt/cell/cell.hpp>
#include <xlnt/styles/cell_style.hpp>
#include <xlnt/styles/font.hpp>
#include <xlnt/styles/number_format.hpp>
#include <xlnt/styles/protection.hpp>
#include <xlnt/utils/hash_combine.hpp>
namespace xlnt {
cell_style::cell_style(cell parent) : parent_(parent)
{
}
cell_style::cell_style(const cell_style &other)
: alignment_(other.alignment_),
border_(other.border_),
fill_(other.fill_),
font_(other.font_),
number_format_(other.number_format_),
protection_(other.protection_)
{
}
cell_style &cell_style::operator=(const cell_style &other)
{
parent_ = other.parent_;
named_style_name_ = other.named_style_name_;
alignment_ = other.alignment_;
border_ = other.border_;
fill_ = other.fill_;
font_ = other.font_;
number_format_ = other.number_format_;
protection_ = other.protection_;
return *this;
}
const alignment &cell_style::get_alignment() const
{
return alignment_;
}
const number_format &cell_style::get_number_format() const
{
return number_format_;
}
const border &cell_style::get_border() const
{
return border_;
}
const fill &cell_style::get_fill() const
{
return fill_;
}
const font &cell_style::get_font() const
{
return font_;
}
const protection &cell_style::get_protection() const
{
return protection_;
}
std::string cell_style::to_hash_string() const
{
std::string hash_string("style");
hash_string.append(std::to_string(alignment_.apply()));
hash_string.append(alignment_.apply() ? std::to_string(alignment_.hash()) : " ");
hash_string.append(std::to_string(border_.apply()));
hash_string.append(border_.apply() ? std::to_string(border_.hash()) : " ");
hash_string.append(std::to_string(font_.apply()));
hash_string.append(font_.apply() ? std::to_string(font_.hash()) : " ");
hash_string.append(std::to_string(fill_.apply()));
hash_string.append(fill_.apply() ? std::to_string(fill_.hash()) : " ");
hash_string.append(std::to_string(number_format_.apply()));
hash_string.append(number_format_.apply() ? std::to_string(number_format_.hash()) : " ");
hash_string.append(std::to_string(protection_.apply()));
hash_string.append(protection_.apply() ? std::to_string(protection_.hash()) : " ");
return hash_string;
}
} // namespace xlnt

View File

@ -27,6 +27,16 @@
namespace xlnt { namespace xlnt {
const color color::black()
{
return color(color::type::rgb, "ff000000");
}
const color color::white()
{
return color(color::type::rgb, "ffffffff");
}
color::color() color::color()
{ {
} }

View File

@ -1,237 +0,0 @@
// Copyright (c) 2014-2016 Thomas Fussell
// Copyright (c) 2010-2015 openpyxl
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, WRISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE
//
// @license: http://www.opensource.org/licenses/mit-license.php
// @author: see AUTHORS file
#include <xlnt/cell/cell.hpp>
#include <xlnt/styles/font.hpp>
#include <xlnt/styles/number_format.hpp>
#include <xlnt/styles/protection.hpp>
#include <xlnt/styles/format.hpp>
namespace {
template <class T>
void hash_combine(std::size_t &seed, const T &v)
{
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
}
namespace xlnt {
const color color::black()
{
return color(color::type::rgb, "ff000000");
}
const color color::white()
{
return color(color::type::rgb, "ffffffff");
}
format::format()
: id_(0),
alignment_apply_(false),
border_apply_(false),
border_id_(0),
fill_apply_(false),
fill_id_(0),
font_apply_(false),
font_id_(0),
number_format_apply_(false),
number_format_id_(0),
protection_apply_(false),
pivot_button_(false),
quote_prefix_(false)
{
}
format::format(const format &other)
: id_(other.id_),
alignment_apply_(other.alignment_apply_),
alignment_(other.alignment_),
border_apply_(other.border_apply_),
border_id_(other.border_id_),
border_(other.border_),
fill_apply_(other.fill_apply_),
fill_id_(other.fill_id_),
fill_(other.fill_),
font_apply_(other.font_apply_),
font_id_(other.font_id_),
font_(other.font_),
number_format_apply_(other.number_format_apply_),
number_format_id_(other.number_format_id_),
number_format_(other.number_format_),
protection_apply_(other.protection_apply_),
protection_(other.protection_),
pivot_button_(other.pivot_button_),
quote_prefix_(other.quote_prefix_)
{
}
format &format::operator=(const format &other)
{
id_ = other.id_;
alignment_ = other.alignment_;
alignment_apply_ = other.alignment_apply_;
border_ = other.border_;
border_apply_ = other.border_apply_;
border_id_ = other.border_id_;
fill_ = other.fill_;
fill_apply_ = other.fill_apply_;
fill_id_ = other.fill_id_;
font_ = other.font_;
font_apply_ = other.font_apply_;
font_id_ = other.font_id_;
number_format_ = other.number_format_;
number_format_apply_ = other.number_format_apply_;
number_format_id_ = other.number_format_id_;
protection_ = other.protection_;
protection_apply_ = other.protection_apply_;
pivot_button_ = other.pivot_button_;
quote_prefix_ = other.quote_prefix_;
return *this;
}
std::string format::to_hash_string() const
{
std::string hash_string("format");
hash_string.append(std::to_string(alignment_apply_));
hash_string.append(alignment_apply_ ? std::to_string(alignment_.hash()) : " ");
hash_string.append(std::to_string(border_apply_));
hash_string.append(border_apply_ ? std::to_string(border_id_) : " ");
hash_string.append(std::to_string(font_apply_));
hash_string.append(font_apply_ ? std::to_string(font_id_) : " ");
hash_string.append(std::to_string(fill_apply_));
hash_string.append(fill_apply_ ? std::to_string(fill_id_) : " ");
hash_string.append(std::to_string(number_format_apply_));
hash_string.append(number_format_apply_ ? std::to_string(number_format_id_) : " ");
hash_string.append(std::to_string(protection_apply_));
hash_string.append(protection_apply_ ? std::to_string(protection_.hash()) : " ");
return hash_string;
}
const number_format format::get_number_format() const
{
return number_format_;
}
const border format::get_border() const
{
return border_;
}
const alignment format::get_alignment() const
{
return alignment_;
}
const fill format::get_fill() const
{
return fill_;
}
const font format::get_font() const
{
return font_;
}
const protection format::get_protection() const
{
return protection_;
}
bool format::pivot_button() const
{
return pivot_button_;
}
bool format::quote_prefix() const
{
return quote_prefix_;
}
std::size_t format::get_id() const
{
return id_;
}
std::size_t format::get_fill_id() const
{
return fill_id_;
}
std::size_t format::get_font_id() const
{
return font_id_;
}
std::size_t format::get_border_id() const
{
return border_id_;
}
std::size_t format::get_number_format_id() const
{
return number_format_id_;
}
void format::apply_alignment(bool apply)
{
alignment_apply_ = apply;
}
void format::apply_border(bool apply)
{
border_apply_ = apply;
}
void format::apply_fill(bool apply)
{
fill_apply_ = apply;
}
void format::apply_font(bool apply)
{
font_apply_ = apply;
}
void format::apply_number_format(bool apply)
{
number_format_apply_ = apply;
}
void format::apply_protection(bool apply)
{
protection_apply_ = apply;
}
} // namespace xlnt

View File

@ -1,108 +0,0 @@
// Copyright (c) 2014-2016 Thomas Fussell
// Copyright (c) 2010-2015 openpyxl
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, WRISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE
//
// @license: http://www.opensource.org/licenses/mit-license.php
// @author: see AUTHORS file
#include <xlnt/styles/style.hpp>
namespace {
template <class T>
void hash_combine(std::size_t &seed, const T &v)
{
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
}
namespace xlnt {
std::string style::to_hash_string() const
{
std::string hash_string("style");
hash_string.append(name_);
hash_string.append(std::to_string(format_id_));
hash_string.append(std::to_string(builtin_id_));
hash_string.append(std::to_string(hidden_ ? 0 : 1));
return hash_string;
}
style::style() : name_("style"), format_id_(0), builtin_id_(0), hidden_(false)
{
}
style::style(const style &other) : name_(other.name_), format_id_(other.format_id_), builtin_id_(other.builtin_id_), hidden_(other.hidden_)
{
}
style &style::operator=(const xlnt::style &other)
{
name_ = other.name_;
builtin_id_ = other.builtin_id_;
format_id_ = other.format_id_;
hidden_ = other.hidden_;
return *this;
}
std::string style::get_name() const
{
return name_;
}
void style::set_name(const std::string &name)
{
name_ = name;
}
std::size_t style::get_format_id() const
{
return format_id_;
}
void style::set_format_id(std::size_t format_id)
{
format_id_ = format_id;
}
std::size_t style::get_builtin_id() const
{
return builtin_id_;
}
void style::set_builtin_id(std::size_t builtin_id)
{
builtin_id_ = builtin_id;
}
void style::set_hidden(bool hidden)
{
hidden_ = hidden;
}
bool style::get_hidden() const
{
return hidden_;
}
} // namespace xlnt

View File

@ -0,0 +1,330 @@
#pragma once
#include <iostream>
#include <cxxtest/TestSuite.h>
#include "pugixml.hpp"
#include <xlnt/xlnt.hpp>
#include <xlnt/packaging/zip_file.hpp>
#include <helpers/helper.hpp>
#include <helpers/path_helper.hpp>
class test_number_style : public CxxTest::TestSuite
{
public:
void test_ctor()
{
xlnt::workbook wb;
xlnt::style_serializer style_serializer(wb);
xlnt::zip_file archive;
auto stylesheet_xml = style_serializer.write_stylesheet().to_string();
const std::string expected =
"<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" mc:Ignorable=\"x14ac\" xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\">"
" <numFmts count=\"1\">"
" <numFmt numFmtId=\"0\" formatCode=\"General\" />"
" </numFmts>"
" <fonts count=\"1\">"
" <font>"
" <sz val=\"11\" />"
" <color indexed=\"0\" />"
" <name val=\"Calibri\" />"
" </font>"
" </fonts>"
" <fills count=\"0\" />"
" <borders count=\"0\" />"
" <cellStyleXfs count=\"0\" />"
" <cellXfs count=\"0\" />"
" <cellStyles count=\"0\" />"
" <dxfs count=\"0\" />"
" <tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleMedium9\" />"
" <extLst>"
" <ext uri=\"{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}\" xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\">"
" <x14:slicerStyles defaultSlicerStyle=\"SlicerStyleLight1\" />"
" </ext>"
" </extLst>"
"</styleSheet>";
TS_ASSERT(Helper::compare_xml(expected, stylesheet_xml));
}
void test_from_simple()
{
xlnt::xml_document doc;
auto xml = PathHelper::read_file(PathHelper::GetDataDirectory("/reader/styles/simple-styles.xml"));
doc.from_string(xml);
xlnt::workbook wb;
xlnt::style_serializer s(wb);
TS_ASSERT(s.read_stylesheet(doc));
TS_ASSERT_EQUALS(wb.get_number_formats().size(), 1);
}
void test_from_complex()
{
xlnt::xml_document doc;
auto xml = PathHelper::read_file(PathHelper::GetDataDirectory("/reader/styles/complex-styles.xml"));
doc.from_string(xml);
xlnt::workbook wb;
xlnt::style_serializer s(wb);
TS_ASSERT(s.read_stylesheet(doc));
TS_ASSERT_EQUALS(wb.get_borders().size(), 7);
TS_ASSERT_EQUALS(wb.get_fills().size(), 6);
TS_ASSERT_EQUALS(wb.get_fonts().size(), 8);
TS_ASSERT_EQUALS(wb.get_number_formats().size(), 1);
}
void test_merge_named_styles()
{
xlnt::xml_document doc;
auto xml = PathHelper::read_file(PathHelper::GetDataDirectory("/reader/styles/complex-styles.xml"));
doc.from_string(xml);
xlnt::workbook wb;
xlnt::style_serializer s(wb);
TS_ASSERT(s.read_stylesheet(doc));
TS_ASSERT_EQUALS(wb.get_named_styles().size(), 3);
}
/*
void _test_unprotected_cell()
{
datadir.chdir();
src = open ("worksheet_unprotected_style.xml");
xml = src.read();
node = fromstring(xml);
stylesheet = Stylesheet.from_tree(node);
styles = stylesheet.cell_styles;
assert len(styles) == 3;
// default is cells are locked
assert styles[1] == StyleArray([4,0,0,0,0,0,0,0,0]);
assert styles[2] == StyleArray([3,0,0,0,1,0,0,0,0]);
}
void _test_read_cell_style()
{
datadir.chdir();
src = open("empty-workbook-styles.xml");
xml = src.read();
node = fromstring(xml);
stylesheet = Stylesheet.from_tree(node);
styles = stylesheet.cell_styles;
assert len(styles) == 2;
assert styles[1] == StyleArray([0,0,0,9,0,0,0,0,1];
}
void _test_read_xf_no_number_format()
{
datadir.chdir();
src = open("no_number_format.xml");
xml = src.read();
node = fromstring(xml);
stylesheet = Stylesheet.from_tree(node);
styles = stylesheet.cell_styles;
assert len(styles) == 3;
assert styles[1] == StyleArray([1,0,1,0,0,0,0,0,0]);
assert styles[2] == StyleArray([0,0,0,14,0,0,0,0,0]);
}
void _test_none_values()
{
datadir.chdir();
src = open("none_value_styles.xml");
xml = src.read();
node = fromstring(xml);
stylesheet = Stylesheet.from_tree(node);
fonts = stylesheet.fonts;
assert fonts[0].scheme is None;
assert fonts[0].vertAlign is None;
assert fonts[1].u is None;
}
void _test_alignment()
{
datadir.chdir();
src = open("alignment_styles.xml");
xml = src.read();
node = fromstring(xml);
stylesheet = Stylesheet.from_tree(node);
styles = stylesheet.cell_styles;
assert len(styles) == 3;
assert styles[2] == StyleArray([0,0,0,0,0,2,0,0,0]);
assert stylesheet.alignments == [
Alignment(),
Alignment(textRotation=180),
Alignment(vertical='top', textRotation=255),
];
}
void _test_rgb_colors()
{
datadir.chdir();
src = open("rgb_colors.xml");
xml = src.read();
node = fromstring(xml);
stylesheet = Stylesheet.from_tree(node);
assert len(stylesheet.colors.index) == 64;
assert stylesheet.colors.index[0] == "00000000";
assert stylesheet.colors.index[-1] == "00333333";
}
void _test_custom_number_formats()
{
datadir.chdir();
src = open("styles_number_formats.xml", "rb");
xml = src.read();
node = fromstring(xml);
stylesheet = Stylesheet.from_tree(node);
assert stylesheet.number_formats == [
'_ * #,##0.00_ ;_ * \-#,##0.00_ ;_ * "-"??_ ;_ @_ ',
"#,##0.00_ ",
"yyyy/m/d;@",
"0.00000_ "
];
}
void _test_assign_number_formats()
{
node = fromstring(
"<styleSheet>"
"<numFmts count=\"1\">"
" <numFmt numFmtId=\"43\" formatCode=\"_ * #,##0.00_ ;_ * \-#,##0.00_ ;_ * \"-\"??_ ;_ @_ \" />"
"</numFmts>"
"<cellXfs count=\"0\">"
"<xf numFmtId=\"43\" fontId=\"2\" fillId=\"0\" borderId=\"0\""
" applyFont=\"0\" applyFill=\"0\" applyBorder=\"0\" applyAlignment=\"0\" applyProtection=\"0\">"
" <alignment vertical=\"center\"/>"
"</xf>"
"</cellXfs>"
"</styleSheet>");
stylesheet = Stylesheet.from_tree(node);
styles = stylesheet.cell_styles;
assert styles[0] == StyleArray([2, 0, 0, 164, 0, 1, 0, 0, 0]);
}
void _test_named_styles()
{
datadir.chdir();
src = open("complex-styles.xml");
xml = src.read();
node = fromstring(xml);
stylesheet = Stylesheet.from_tree(node);
followed = stylesheet.named_styles['Followed Hyperlink'];
assert followed.name == "Followed Hyperlink";
assert followed.font == stylesheet.fonts[2];
assert followed.fill == DEFAULT_EMPTY_FILL;
assert followed.border == Border();
link = stylesheet.named_styles['Hyperlink'];
assert link.name == "Hyperlink";
assert link.font == stylesheet.fonts[1];
assert link.fill == DEFAULT_EMPTY_FILL;
assert link.border == Border();
normal = stylesheet.named_styles['Normal'];
assert normal.name == "Normal";
assert normal.font == stylesheet.fonts[0];
assert normal.fill == DEFAULT_EMPTY_FILL;
assert normal.border == Border();
}
void _test_no_styles()
{
wb1 = wb2 = Workbook();
archive = ZipFile(BytesIO(), "a");
apply_stylesheet(archive, wb1);
assert wb1._cell_styles == wb2._cell_styles;
assert wb2._named_styles == wb2._named_styles;
}
void _test_write_worksheet()
{
wb = Workbook()
node = write_stylesheet(wb);
xml = tostring(node);
const std::string expected =
"<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">"
" <numFmts count=\"0\" />"
" <fonts count=\"1\">"
" <font>"
" <name val=\"Calibri\"></name>"
" <family val=\"2\"></family>"
" <color theme=\"1\"></color>"
" <sz val=\"11\"></sz>"
" <scheme val=\"minor\"></scheme>"
" </font>"
" </fonts>"
" <fills count=\"2\">"
" <fill>"
" <patternFill></patternFill>"
" </fill>"
" <fill>"
" <patternFill patternType=\"gray125\"></patternFill>"
" </fill>"
" </fills>"
" <borders count=\"1\">"
" <border>"
" <left></left>"
" <right></right>"
" <top></top>"
" <bottom></bottom>"
" <diagonal></diagonal>"
" </border>"
" </borders>"
" <cellStyleXfs count=\"1\">"
" <xf borderId=\"0\" fillId=\"0\" fontId=\"0\" numFmtId=\"0\"></xf>"
" </cellStyleXfs>"
" <cellXfs count=\"1\">"
" <xf borderId=\"0\" fillId=\"0\" fontId=\"0\" numFmtId=\"0\" pivotButton=\"0\" quotePrefix=\"0\" xfId=\"0\"></xf>"
" </cellXfs>"
" <cellStyles count=\"1\">"
" <cellStyle builtinId=\"0\" hidden=\"0\" name=\"Normal\" xfId=\"0\"></cellStyle>"
" </cellStyles>"
"<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium9\" defaultPivotStyle=\"PivotStyleLight16\"/>"
"</styleSheet>";
diff = compare_xml(xml, expected);
assert diff is None, diff;
}
void _test_simple_styles() {
wb = Workbook();
wb.guess_types = True;
ws = wb.active;
now = datetime.date.today();
for idx, v in enumerate(['12.34%', now, 'This is a test', '31.31415', None], 1)
{
ws.append([v]);
_ = ws.cell(column=1, row=idx).style_id;
}
// set explicit formats
ws['D9'].number_format = numbers.FORMAT_NUMBER_00;
ws['D9'].protection = Protection(locked=True);
ws['D9'].style_id;
ws['E1'].protection = Protection(hidden=True);
ws['E1'].style_id;
assert len(wb._cell_styles) == 5;
stylesheet = write_stylesheet(wb);
datadir.chdir();
reference_file = open('simple-styles.xml');
expected = reference_file.read();
xml = tostring(stylesheet);
diff = compare_xml(xml, expected);
assert diff is None, diff;
}
*/
};

View File

@ -664,6 +664,12 @@ std::size_t workbook::add_style(const xlnt::style &style_)
return d_->styles_.back().id_; return d_->styles_.back().id_;
} }
const std::vector<style> &workbook::get_named_styles() const
{
static std::vector<style> named_styles;
return named_styles;
}
color workbook::add_indexed_color(const color &rgb_color) color workbook::add_indexed_color(const color &rgb_color)
{ {
std::size_t index = 0; std::size_t index = 0;

Binary file not shown.

View File

@ -0,0 +1,47 @@
<?xml version="1.0"?>
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<numFmts count="0"/>
<fonts count="1">
<font>
<sz val="11"/>
<color theme="1"/>
<name val="Calibri"/>
<family val="2"/>
<scheme val="minor"/>
</font>
</fonts>
<fills count="2">
<fill>
<patternFill patternType="none"/>
</fill>
<fill>
<patternFill patternType="gray125"/>
</fill>
</fills>
<borders count="1">
<border>
<left/>
<right/>
<top/>
<bottom/>
<diagonal/>
</border>
</borders>
<cellStyleXfs count="1">
<xf borderId="0" fillId="0" fontId="0" numFmtId="0"/>
</cellStyleXfs>
<cellXfs count="4">
<xf borderId="0" fillId="0" fontId="0" numFmtId="0" xfId="0"/>
<xf applyAlignment="1" borderId="0" fillId="0" fontId="0" numFmtId="0" xfId="0">
<alignment textRotation="180"/>
</xf>
<xf applyAlignment="1" borderId="0" fillId="0" fontId="0" numFmtId="0" xfId="0">
<alignment textRotation="255" vertical="top"/>
</xf>
</cellXfs>
<cellStyles count="1">
<cellStyle builtinId="0" name="Normal" xfId="0"/>
</cellStyles>
<dxfs count="0"/>
<tableStyles count="0" defaultPivotStyle="PivotStyleLight16" defaultTableStyle="TableStyleMedium9"/>
</styleSheet>

View File

@ -0,0 +1,257 @@
<?xml version="1.0" standalone="yes"?>
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" mc:Ignorable="x14ac">
<fonts count="8" x14ac:knownFonts="1">
<font>
<sz val="12"/>
<color theme="1"/>
<name val="Calibri"/>
<family val="2"/>
<scheme val="minor"/>
</font>
<font>
<u/>
<sz val="12"/>
<color theme="10"/>
<name val="Calibri"/>
<family val="2"/>
<scheme val="minor"/>
</font>
<font>
<u/>
<sz val="12"/>
<color theme="11"/>
<name val="Calibri"/>
<family val="2"/>
<scheme val="minor"/>
</font>
<font>
<b/>
<sz val="12"/>
<color theme="1"/>
<name val="Arial"/>
</font>
<font>
<sz val="10"/>
<color theme="1"/>
<name val="Arial"/>
</font>
<font>
<i/>
<sz val="14"/>
<color theme="1"/>
<name val="Arial"/>
</font>
<font>
<sz val="12"/>
<color rgb="FF3300FF"/>
<name val="Calibri"/>
<scheme val="minor"/>
</font>
<font>
<sz val="12"/>
<color theme="9"/>
<name val="Calibri"/>
<scheme val="minor"/>
</font>
</fonts>
<fills count="6">
<fill>
<patternFill patternType="none"/>
</fill>
<fill>
<patternFill patternType="gray125"/>
</fill>
<fill>
<patternFill patternType="solid">
<fgColor theme="8"/>
<bgColor indexed="64"/>
</patternFill>
</fill>
<fill>
<patternFill patternType="solid">
<fgColor rgb="FFFFFF66"/>
<bgColor indexed="64"/>
</patternFill>
</fill>
<fill>
<patternFill patternType="solid">
<fgColor rgb="FFCCCCFF"/>
<bgColor indexed="64"/>
</patternFill>
</fill>
<fill>
<patternFill patternType="solid">
<fgColor rgb="FF006600"/>
<bgColor indexed="64"/>
</patternFill>
</fill>
</fills>
<borders count="7">
<border>
<left/>
<right/>
<top/>
<bottom/>
<diagonal/>
</border>
<border>
<left style="thin">
<color rgb="FF006600"/>
</left>
<right style="thin">
<color rgb="FF006600"/>
</right>
<top style="thin">
<color rgb="FF006600"/>
</top>
<bottom style="thin">
<color rgb="FF006600"/>
</bottom>
<diagonal/>
</border>
<border>
<left style="double">
<color theme="7"/>
</left>
<right style="double">
<color theme="7"/>
</right>
<top style="double">
<color theme="7"/>
</top>
<bottom style="double">
<color theme="7"/>
</bottom>
<diagonal/>
</border>
<border>
<left style="mediumDashed">
<color theme="6"/>
</left>
<right/>
<top style="mediumDashed">
<color theme="6"/>
</top>
<bottom/>
<diagonal/>
</border>
<border>
<left/>
<right style="mediumDashed">
<color theme="6"/>
</right>
<top style="mediumDashed">
<color theme="6"/>
</top>
<bottom/>
<diagonal/>
</border>
<border>
<left style="mediumDashed">
<color theme="6"/>
</left>
<right/>
<top/>
<bottom style="mediumDashed">
<color theme="6"/>
</bottom>
<diagonal/>
</border>
<border>
<left/>
<right style="mediumDashed">
<color theme="6"/>
</right>
<top/>
<bottom style="mediumDashed">
<color theme="6"/>
</bottom>
<diagonal/>
</border>
</borders>
<cellStyleXfs count="11">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
<xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
<xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
<xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
<xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
<xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
<xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
<xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
<xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
<xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
<xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
</cellStyleXfs>
<cellXfs count="29">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
<xf numFmtId="0" fontId="3" fillId="0" borderId="0" xfId="0" applyFont="1"/>
<xf numFmtId="0" fontId="4" fillId="0" borderId="0" xfId="0" applyFont="1"/>
<xf numFmtId="0" fontId="5" fillId="0" borderId="0" xfId="0" applyFont="1"/>
<xf numFmtId="0" fontId="6" fillId="0" borderId="0" xfId="0" applyFont="1"/>
<xf numFmtId="0" fontId="7" fillId="0" borderId="0" xfId="0" applyFont="1"/>
<xf numFmtId="0" fontId="0" fillId="2" borderId="0" xfId="0" applyFill="1"/>
<xf numFmtId="0" fontId="0" fillId="3" borderId="0" xfId="0" applyFill="1"/>
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyAlignment="1">
<alignment horizontal="left"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyAlignment="1">
<alignment horizontal="right"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyAlignment="1">
<alignment horizontal="center"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyAlignment="1">
<alignment vertical="top"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyAlignment="1">
<alignment vertical="center"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyAlignment="1"/>
<xf numFmtId="2" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
<xf numFmtId="14" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
<xf numFmtId="10" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyAlignment="1">
<alignment horizontal="center"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="0" borderId="1" xfId="0" applyBorder="1"/>
<xf numFmtId="0" fontId="0" fillId="0" borderId="2" xfId="0" applyBorder="1"/>
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyAlignment="1">
<alignment wrapText="1"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyAlignment="1">
<alignment shrinkToFit="1"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyFill="1" applyBorder="1"/>
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyAlignment="1">
<alignment horizontal="center"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="4" borderId="3" xfId="0" applyFill="1" applyBorder="1" applyAlignment="1">
<alignment horizontal="center" vertical="center"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="4" borderId="4" xfId="0" applyFill="1" applyBorder="1" applyAlignment="1">
<alignment horizontal="center" vertical="center"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="4" borderId="5" xfId="0" applyFill="1" applyBorder="1" applyAlignment="1">
<alignment horizontal="center" vertical="center"/>
</xf>
<xf numFmtId="0" fontId="0" fillId="4" borderId="6" xfId="0" applyFill="1" applyBorder="1" applyAlignment="1">
<alignment horizontal="center" vertical="center"/>
</xf>
<xf numFmtId="0" fontId="6" fillId="5" borderId="0" xfId="0" applyFont="1" applyFill="1"/>
</cellXfs>
<cellStyles count="11">
<cellStyle name="Followed Hyperlink" xfId="2" builtinId="9" hidden="1"/>
<cellStyle name="Followed Hyperlink" xfId="4" builtinId="9" hidden="1"/>
<cellStyle name="Followed Hyperlink" xfId="6" builtinId="9" hidden="1"/>
<cellStyle name="Followed Hyperlink" xfId="8" builtinId="9" hidden="1"/>
<cellStyle name="Followed Hyperlink" xfId="10" builtinId="9" hidden="1"/>
<cellStyle name="Hyperlink" xfId="1" builtinId="8" hidden="1"/>
<cellStyle name="Hyperlink" xfId="3" builtinId="8" hidden="1"/>
<cellStyle name="Hyperlink" xfId="5" builtinId="8" hidden="1"/>
<cellStyle name="Hyperlink" xfId="7" builtinId="8" hidden="1"/>
<cellStyle name="Hyperlink" xfId="9" builtinId="8" hidden="1"/>
<cellStyle name="Normal" xfId="0" builtinId="0"/>
</cellStyles>
<dxfs count="0"/>
<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>
</styleSheet>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,53 @@
<?xml version="1.0" ?>
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<fonts count="2">
<font>
<sz val="11" />
<color theme="1" />
<name val="Calibri" />
<family val="2" />
<scheme val="minor" />
</font>
<font>
<sz val="11" />
<color theme="1" />
<name val="Calibri" />
<family val="2" />
<scheme val="minor" />
</font>
</fonts>
<fills count="2">
<fill>
<patternFill patternType="none" />
</fill>
<fill>
<patternFill patternType="gray125" />
</fill>
</fills>
<borders count="1">
<border>
<left />
<right />
<top />
<bottom />
<diagonal />
</border>
</borders>
<cellStyleXfs count="2">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" />
<xf numFmtId="9" fontId="1" fillId="0" borderId="0" applyFont="0"
applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0" />
</cellStyleXfs>
<cellXfs count="2">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
<xf numFmtId="9" fontId="0" fillId="0" borderId="0" xfId="1"
applyFont="1" />
</cellXfs>
<cellStyles count="2">
<cellStyle name="Normal" xfId="0" builtinId="0" />
<cellStyle name="Percent" xfId="1" builtinId="5" />
</cellStyles>
<dxfs count="0" />
<tableStyles count="0" defaultTableStyle="TableStyleMedium9"
defaultPivotStyle="PivotStyleLight16" />
</styleSheet>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" ?>
<x:styleSheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:fonts>
<x:font>
<x:sz val="11"/>
<x:color rgb="00000000"/>
<x:name val="Calibri"/>
</x:font>
<x:font>
<x:b/>
<x:sz val="15"/>
<x:color rgb="001F497D"/>
<x:name val="Calibri"/>
</x:font>
</x:fonts>
<x:fills>
<x:fill>
<x:patternFill patternType="none"/>
</x:fill>
<x:fill>
<x:patternFill patternType="gray125"/>
</x:fill>
</x:fills>
<x:borders>
<x:border>
<x:left/>
<x:right/>
<x:top/>
<x:bottom/>
<x:diagonal/>
</x:border>
<x:border>
<x:left/>
<x:right/>
<x:top/>
<x:bottom>
<x:color rgb="001F497D"/>
</x:bottom>
<x:diagonal/>
</x:border>
</x:borders>
<x:cellXfs>
<x:xf fontId="0" fillId="0" borderId="0"/>
<x:xf fontId="1" fillId="0" borderId="1" applyFont="1"/>
<x:xf numFmtId="14" fontId="0" fillId="0" borderId="0" applyNumberFormat="1"/>
</x:cellXfs>
</x:styleSheet>

View File

@ -0,0 +1,50 @@
<?xml version="1.0" standalone="yes"?>
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" mc:Ignorable="x14ac">
<fonts count="2" x14ac:knownFonts="1">
<font>
<sz val="12"/>
<color theme="1"/>
<name val="Calibri"/>
<family val="2"/>
<charset val="136"/>
<scheme val="none"/>
<vertAlign val="none" />
</font>
<font>
<u val="none"/>
<sz val="12"/>
<color theme="1"/>
<name val="Calibri"/>
<scheme val="none"/>
</font>
</fonts>
<fills count="2">
<fill>
<patternFill patternType="none"/>
</fill>
<fill>
<patternFill patternType="gray125"/>
</fill>
</fills>
<borders count="1">
<border>
<left/>
<right/>
<top/>
<bottom/>
<diagonal/>
</border>
</borders>
<cellStyleXfs count="1">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
</cellStyleXfs>
<cellXfs count="2">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
<xf numFmtId="0" fontId="1" fillId="0" borderId="0" xfId="0" applyFont="1"/>
</cellXfs>
<cellStyles count="1">
<cellStyle name="Standard" xfId="0" builtinId="0"/>
</cellStyles>
<dxfs count="0"/>
<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>
</styleSheet>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,48 @@
<?xml version="1.0" ?>
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<numFmts count="1">
<numFmt numFmtId="164" formatCode="yyyy-mm-dd"/>
</numFmts>
<fonts count="1">
<font>
<name val="Calibri"/>
<family val="2"/>
<color theme="1"/>
<sz val="11"/>
<scheme val="minor"/>
</font>
</fonts>
<fills count="2">
<fill>
<patternFill/>
</fill>
<fill>
<patternFill patternType="gray125"/>
</fill>
</fills>
<borders count="1">
<border>
<left/>
<right/>
<top/>
<bottom/>
<diagonal/>
</border>
</borders>
<cellStyleXfs count="1">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
</cellStyleXfs>
<cellXfs count="5">
<xf borderId="0" fillId="0" fontId="0" numFmtId="0" quotePrefix="0" pivotButton="0" xfId="0"/>
<xf borderId="0" fillId="0" fontId="0" numFmtId="9" quotePrefix="0" pivotButton="0" xfId="0"/>
<xf borderId="0" fillId="0" fontId="0" numFmtId="164" quotePrefix="0" pivotButton="0" xfId="0"/>
<xf borderId="0" fillId="0" fontId="0" numFmtId="2" quotePrefix="0" pivotButton="0" xfId="0"/>
<xf applyProtection="1" borderId="0" fillId="0" fontId="0" quotePrefix="0" pivotButton="0" numFmtId="0" xfId="0">
<protection hidden="1" locked="1"/>
</xf>
</cellXfs>
<cellStyles count="1">
<cellStyle name="Normal" hidden="0" xfId="0" builtinId="0"/>
</cellStyles>
<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleLight16"/>
</styleSheet>

View File

@ -0,0 +1,112 @@
<?xml version="1.0" standalone="yes"?>
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" mc:Ignorable="x14ac">
<numFmts count="4">
<numFmt numFmtId="43" formatCode="_ * #,##0.00_ ;_ * \-#,##0.00_ ;_ * &quot;-&quot;??_ ;_ @_ "/>
<numFmt numFmtId="176" formatCode="#,##0.00_ "/>
<numFmt numFmtId="180" formatCode="yyyy/m/d;@"/>
<numFmt numFmtId="181" formatCode="0.00000_ "/>
</numFmts>
<fonts count="4">
<font>
<sz val="11"/>
<color theme="1"/>
<name val="宋体"/>
<family val="2"/>
<charset val="134"/>
<scheme val="minor"/>
</font>
<font>
<sz val="9"/>
<name val="宋体"/>
<family val="2"/>
<charset val="134"/>
<scheme val="minor"/>
</font>
<font>
<sz val="11"/>
<color theme="1"/>
<name val="宋体"/>
<family val="2"/>
<charset val="134"/>
<scheme val="minor"/>
</font>
<font>
<sz val="9"/>
<color indexed="8"/>
<name val="仿宋_GB2312"/>
<family val="3"/>
<charset val="134"/>
</font>
</fonts>
<fills count="2">
<fill>
<patternFill patternType="none"/>
</fill>
<fill>
<patternFill patternType="gray125"/>
</fill>
</fills>
<borders count="2">
<border>
<left/>
<right/>
<top/>
<bottom/>
<diagonal/>
</border>
<border>
<left style="thin">
<color indexed="64"/>
</left>
<right style="thin">
<color indexed="64"/>
</right>
<top style="thin">
<color indexed="64"/>
</top>
<bottom style="thin">
<color indexed="64"/>
</bottom>
<diagonal/>
</border>
</borders>
<cellStyleXfs count="2">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0">
<alignment vertical="center"/>
</xf>
<xf numFmtId="43" fontId="2" fillId="0" borderId="0" applyFont="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0">
<alignment vertical="center"/>
</xf>
</cellStyleXfs>
<cellXfs count="5">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0">
<alignment vertical="center"/>
</xf>
<xf numFmtId="176" fontId="3" fillId="0" borderId="1" xfId="0" applyNumberFormat="1" applyFont="1" applyBorder="1" applyAlignment="1">
<alignment horizontal="right" vertical="center"/>
</xf>
<xf numFmtId="43" fontId="3" fillId="0" borderId="1" xfId="1" applyFont="1" applyBorder="1">
<alignment vertical="center"/>
</xf>
<xf numFmtId="180" fontId="3" fillId="0" borderId="1" xfId="0" applyNumberFormat="1" applyFont="1" applyBorder="1" applyAlignment="1">
<alignment horizontal="center" vertical="center"/>
</xf>
<xf numFmtId="181" fontId="3" fillId="0" borderId="1" xfId="0" applyNumberFormat="1" applyFont="1" applyBorder="1">
<alignment vertical="center"/>
</xf>
</cellXfs>
<cellStyles count="2">
<cellStyle name="常规" xfId="0" builtinId="0"/>
<cellStyle name="千位分隔" xfId="1" builtinId="3"/>
</cellStyles>
<dxfs count="0"/>
<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleLight16"/>
<extLst>
<ext xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" uri="{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}">
<x14:slicerStyles defaultSlicerStyle="SlicerStyleLight1"/>
</ext>
<ext xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main" uri="{9260A510-F301-46a8-8635-F512D64BE5F5}">
<x15:timelineStyles defaultTimelineStyle="TimeSlicerStyleLight1"/>
</ext>
</extLst>
</styleSheet>

View File

@ -0,0 +1,76 @@
<?xml version="1.0" standalone="yes" ?>
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
<fonts count="5" x14ac:knownFonts="1">
<font>
<sz val="12"/>
<color theme="1"/>
<name val="Calibri"/>
<family val="2"/>
<scheme val="minor"/>
</font>
<font>
<u/>
<sz val="12"/>
<color theme="10"/>
<name val="Calibri"/>
<family val="2"/>
<scheme val="minor"/>
</font>
<font>
<u/>
<sz val="12"/>
<color theme="11"/>
<name val="Calibri"/>
<family val="2"/>
<scheme val="minor"/>
</font>
<font>
<sz val="12"/>
<color theme="6"/>
<name val="Calibri"/>
<scheme val="minor"/>
</font>
<font>
<sz val="12"/>
<color theme="5"/>
<name val="Calibri"/>
<scheme val="minor"/>
</font>
</fonts>
<fills count="2">
<fill>
<patternFill patternType="none"/>
</fill>
<fill>
<patternFill patternType="gray125"/>
</fill>
</fills>
<borders count="1">
<border>
<left/>
<right/>
<top/>
<bottom/>
<diagonal/>
</border>
</borders>
<cellStyleXfs count="3">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
<xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
<xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyNumberFormat="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"/>
</cellStyleXfs>
<cellXfs count="3">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
<xf numFmtId="0" fontId="4" fillId="0" borderId="0" xfId="0" applyFont="1"/>
<xf numFmtId="0" fontId="3" fillId="0" borderId="0" xfId="0" applyFont="1" applyProtection="1">
<protection locked="0"/>
</xf>
</cellXfs>
<cellStyles count="3">
<cellStyle name="Followed Hyperlink" xfId="2" builtinId="9" hidden="1"/>
<cellStyle name="Hyperlink" xfId="1" builtinId="8" hidden="1"/>
<cellStyle name="Normal" xfId="0" builtinId="0"/>
</cellStyles>
<dxfs count="0"/>
<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>
</styleSheet>