mirror of
https://github.com/tfussell/xlnt.git
synced 2024-03-22 13:11:17 +08:00
Basic pageSetup persistence
-- NOTE: The struct page_setup doesn't currently reflect the attributes of the pageSetup element
This commit is contained in:
parent
7820ac548f
commit
93323f334d
|
@ -25,6 +25,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <xlnt/xlnt_config.hpp>
|
||||
#include <xlnt/utils/optional.hpp>
|
||||
|
||||
namespace xlnt {
|
||||
|
||||
|
@ -33,6 +34,7 @@ namespace xlnt {
|
|||
/// </summary>
|
||||
enum class XLNT_API orientation
|
||||
{
|
||||
default,
|
||||
portrait,
|
||||
landscape
|
||||
};
|
||||
|
@ -117,16 +119,6 @@ public:
|
|||
/// </summary>
|
||||
void paper_size(xlnt::paper_size paper_size);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the orientation of the worksheet using this page setup.
|
||||
/// </summary>
|
||||
xlnt::orientation orientation() const;
|
||||
|
||||
/// <summary>
|
||||
/// Sets the orientation of the page.
|
||||
/// </summary>
|
||||
void orientation(xlnt::orientation orientation);
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if this worksheet should be scaled to fit on a single page during printing.
|
||||
/// </summary>
|
||||
|
@ -189,6 +181,19 @@ public:
|
|||
/// </summary>
|
||||
double scale() const;
|
||||
|
||||
/// <summary>
|
||||
/// The orientation
|
||||
/// </summary>
|
||||
xlnt::optional<xlnt::orientation> orientation_;
|
||||
/// <summary>
|
||||
/// The horizontal dpi
|
||||
/// </summary>
|
||||
xlnt::optional<std::size_t> horizontal_dpi_;
|
||||
/// <summary>
|
||||
/// The vertical dpi
|
||||
/// </summary>
|
||||
xlnt::optional<std::size_t> vertical_dpi_;
|
||||
|
||||
private:
|
||||
/// <summary>
|
||||
/// The break
|
||||
|
@ -205,11 +210,6 @@ private:
|
|||
/// </summary>
|
||||
xlnt::paper_size paper_size_;
|
||||
|
||||
/// <summary>
|
||||
/// The orientation
|
||||
/// </summary>
|
||||
xlnt::orientation orientation_;
|
||||
|
||||
/// <summary>
|
||||
/// Whether or not to fit to page
|
||||
/// </summary>
|
||||
|
|
|
@ -343,5 +343,19 @@ std::string to_string(pane_state state)
|
|||
default_case("frozen");
|
||||
}
|
||||
|
||||
std::string to_string(orientation orientation)
|
||||
{
|
||||
switch (orientation)
|
||||
{
|
||||
case orientation::default:
|
||||
return "default";
|
||||
case orientation::landscape:
|
||||
return "landscape";
|
||||
case orientation::portrait:
|
||||
return "portrait";
|
||||
}
|
||||
default_case("default");
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
} // namespace xlnt
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include <xlnt/utils/exceptions.hpp>
|
||||
#include <xlnt/utils/variant.hpp>
|
||||
#include <xlnt/worksheet/pane.hpp>
|
||||
#include <xlnt/worksheet/page_setup.hpp>
|
||||
#include <xlnt/workbook/metadata_property.hpp>
|
||||
|
||||
namespace xlnt {
|
||||
|
@ -76,6 +77,8 @@ std::string to_string(target_mode mode);
|
|||
|
||||
std::string to_string(pane_state state);
|
||||
|
||||
std::string to_string(orientation state);
|
||||
|
||||
template<typename T>
|
||||
static T from_string(const std::string &string_value);
|
||||
|
||||
|
@ -394,6 +397,15 @@ pane_corner from_string(const std::string &string)
|
|||
default_case(pane_corner::bottom_left);
|
||||
}
|
||||
|
||||
template <>
|
||||
orientation from_string(const std::string &string)
|
||||
{
|
||||
if (string == "default") return orientation::default;
|
||||
else if (string == "landscape") return orientation::landscape;
|
||||
else if (string == "portrait") return orientation::portrait;
|
||||
default_case(orientation::default);
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
} // namespace xlnt
|
||||
|
||||
|
@ -582,6 +594,20 @@ struct value_traits<xlnt::extended_property>
|
|||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct value_traits<xlnt::orientation>
|
||||
{
|
||||
static xlnt::orientation parse(std::string string, const parser &)
|
||||
{
|
||||
return xlnt::detail::from_string<xlnt::orientation>(string);
|
||||
}
|
||||
|
||||
static std::string serialize(xlnt::orientation orientation, const serializer &)
|
||||
{
|
||||
return xlnt::detail::to_string(orientation);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace xml
|
||||
|
||||
|
||||
|
|
|
@ -926,6 +926,7 @@ worksheet xlsx_consumer::read_worksheet_end(const std::string &rel_id)
|
|||
}
|
||||
else if (current_worksheet_element == qn("spreadsheetml", "printOptions")) // CT_PrintOptions 0-1
|
||||
{
|
||||
|
||||
skip_remaining_content(current_worksheet_element);
|
||||
}
|
||||
else if (current_worksheet_element == qn("spreadsheetml", "pageMargins")) // CT_PageMargins 0-1
|
||||
|
@ -943,6 +944,20 @@ worksheet xlsx_consumer::read_worksheet_end(const std::string &rel_id)
|
|||
}
|
||||
else if (current_worksheet_element == qn("spreadsheetml", "pageSetup")) // CT_PageSetup 0-1
|
||||
{
|
||||
page_setup setup;
|
||||
if (parser().attribute_present("orientation"))
|
||||
{
|
||||
setup.orientation_.set(parser().attribute<orientation>("orientation"));
|
||||
}
|
||||
if (parser().attribute_present("horizontalDpi"))
|
||||
{
|
||||
setup.horizontal_dpi_.set(parser().attribute<std::size_t>("horizontalDpi"));
|
||||
}
|
||||
if (parser().attribute_present("verticalDpi"))
|
||||
{
|
||||
setup.vertical_dpi_.set(parser().attribute<std::size_t>("verticalDpi"));
|
||||
}
|
||||
ws.page_setup(setup);
|
||||
skip_remaining_content(current_worksheet_element);
|
||||
}
|
||||
else if (current_worksheet_element == qn("spreadsheetml", "headerFooter")) // CT_HeaderFooter 0-1
|
||||
|
|
|
@ -2768,11 +2768,21 @@ void xlsx_producer::write_worksheet(const relationship &rel)
|
|||
if (ws.has_page_setup())
|
||||
{
|
||||
write_start_element(xmlns, "pageSetup");
|
||||
write_attribute(
|
||||
"orientation", ws.page_setup().orientation() == xlnt::orientation::landscape ? "landscape" : "portrait");
|
||||
write_attribute("paperSize", static_cast<std::size_t>(ws.page_setup().paper_size()));
|
||||
if (ws.page_setup().orientation_.is_set())
|
||||
{
|
||||
write_attribute("orientation", ws.page_setup().orientation_.get());
|
||||
}
|
||||
if (ws.page_setup().horizontal_dpi_.is_set())
|
||||
{
|
||||
write_attribute("horizontalDpi", ws.page_setup().horizontal_dpi_.get());
|
||||
}
|
||||
if (ws.page_setup().vertical_dpi_.is_set())
|
||||
{
|
||||
write_attribute("verticalDpi", ws.page_setup().vertical_dpi_.get());
|
||||
}
|
||||
/*write_attribute("paperSize", static_cast<std::size_t>(ws.page_setup().paper_size()));
|
||||
write_attribute("fitToHeight", write_bool(ws.page_setup().fit_to_height()));
|
||||
write_attribute("fitToWidth", write_bool(ws.page_setup().fit_to_width()));
|
||||
write_attribute("fitToWidth", write_bool(ws.page_setup().fit_to_width()));*/
|
||||
write_end_element(xmlns, "pageSetup");
|
||||
}
|
||||
|
||||
|
|
|
@ -29,7 +29,6 @@ page_setup::page_setup()
|
|||
: break_(xlnt::page_break::none),
|
||||
sheet_state_(xlnt::sheet_state::visible),
|
||||
paper_size_(xlnt::paper_size::letter),
|
||||
orientation_(xlnt::orientation::portrait),
|
||||
fit_to_page_(false),
|
||||
fit_to_height_(false),
|
||||
fit_to_width_(false),
|
||||
|
@ -69,16 +68,6 @@ void page_setup::paper_size(xlnt::paper_size paper_size)
|
|||
paper_size_ = paper_size;
|
||||
}
|
||||
|
||||
orientation page_setup::orientation() const
|
||||
{
|
||||
return orientation_;
|
||||
}
|
||||
|
||||
void page_setup::orientation(xlnt::orientation orientation)
|
||||
{
|
||||
orientation_ = orientation;
|
||||
}
|
||||
|
||||
bool page_setup::fit_to_page() const
|
||||
{
|
||||
return fit_to_page_;
|
||||
|
|
|
@ -44,9 +44,9 @@ public:
|
|||
ps.paper_size(xlnt::paper_size::executive);
|
||||
xlnt_assert_equals(ps.paper_size(), xlnt::paper_size::executive);
|
||||
|
||||
xlnt_assert_equals(ps.orientation(), xlnt::orientation::portrait);
|
||||
ps.orientation(xlnt::orientation::landscape);
|
||||
xlnt_assert_equals(ps.orientation(), xlnt::orientation::landscape);
|
||||
xlnt_assert(!ps.orientation_.is_set());
|
||||
ps.orientation_.set(xlnt::orientation::landscape);
|
||||
xlnt_assert_equals(ps.orientation_.get(), xlnt::orientation::landscape);
|
||||
|
||||
xlnt_assert(!ps.fit_to_page());
|
||||
ps.fit_to_page(true);
|
||||
|
|
Loading…
Reference in New Issue
Block a user