mirror of
https://github.com/tfussell/xlnt.git
synced 2024-03-22 13:11:17 +08:00
parent
ca692790fa
commit
75e0d9475b
|
@ -362,7 +362,7 @@ public:
|
||||||
|
|
||||||
void save(const std::string &filename, const std::string &password);
|
void save(const std::string &filename, const std::string &password);
|
||||||
void save(const xlnt::path &filename, const std::string &password);
|
void save(const xlnt::path &filename, const std::string &password);
|
||||||
void save(std::istream &stream, const std::string &password);
|
void save(std::ostream &stream, const std::string &password);
|
||||||
void save(const std::vector<std::uint8_t> &data, const std::string &password);
|
void save(const std::vector<std::uint8_t> &data, const std::string &password);
|
||||||
|
|
||||||
void load(const std::vector<std::uint8_t> &data);
|
void load(const std::vector<std::uint8_t> &data);
|
||||||
|
|
|
@ -1883,20 +1883,22 @@ void xlsx_consumer::read_worksheet(const std::string &rel_id)
|
||||||
|
|
||||||
auto min = static_cast<column_t::index_t>(std::stoull(parser().attribute("min")));
|
auto min = static_cast<column_t::index_t>(std::stoull(parser().attribute("min")));
|
||||||
auto max = static_cast<column_t::index_t>(std::stoull(parser().attribute("max")));
|
auto max = static_cast<column_t::index_t>(std::stoull(parser().attribute("max")));
|
||||||
|
|
||||||
auto width = std::stold(parser().attribute("width"));
|
auto width = std::stold(parser().attribute("width"));
|
||||||
bool custom = parser().attribute("customWidth") == std::string("1");
|
auto column_style = parser().attribute_present("style")
|
||||||
auto column_style = static_cast<std::size_t>(parser().attribute_present("style") ? std::stoull(parser().attribute("style")) : 0);
|
? parser().attribute<std::size_t>("style") : static_cast<std::size_t>(0);
|
||||||
|
auto custom = parser().attribute_present("customWidth")
|
||||||
|
? is_true(parser().attribute("customWidth")) : false;
|
||||||
|
|
||||||
for (auto column = min; column <= max; column++)
|
for (auto column = min; column <= max; column++)
|
||||||
{
|
{
|
||||||
if (!ws.has_column_properties(column))
|
column_properties props;
|
||||||
{
|
|
||||||
ws.add_column_properties(column, column_properties());
|
|
||||||
}
|
|
||||||
|
|
||||||
ws.get_column_properties(min).width = width;
|
props.width = width;
|
||||||
ws.get_column_properties(min).style = column_style;
|
props.style = column_style;
|
||||||
ws.get_column_properties(min).custom = custom;
|
props.custom = custom;
|
||||||
|
|
||||||
|
ws.add_column_properties(column, props);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parser().attribute_present("bestFit"))
|
if (parser().attribute_present("bestFit"))
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include <detail/vector_streambuf.hpp>
|
#include <detail/vector_streambuf.hpp>
|
||||||
#include <detail/xlsx_consumer.hpp>
|
#include <detail/xlsx_consumer.hpp>
|
||||||
|
#include <detail/xlsx_producer.hpp>
|
||||||
#include <xlnt/utils/exceptions.hpp>
|
#include <xlnt/utils/exceptions.hpp>
|
||||||
#include <xlnt/workbook/workbook.hpp>
|
#include <xlnt/workbook/workbook.hpp>
|
||||||
|
|
||||||
|
@ -576,6 +577,16 @@ struct crypto_helper
|
||||||
|
|
||||||
return decrypt_xlsx_standard(encryption_info, password, encrypted_package);
|
return decrypt_xlsx_standard(encryption_info, password, encrypted_package);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::vector<std::uint8_t> encrypt_xlsx(const std::vector<std::uint8_t> &bytes, const std::string &password)
|
||||||
|
{
|
||||||
|
if (bytes.empty())
|
||||||
|
{
|
||||||
|
throw xlnt::exception("empty file");
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void xlsx_consumer::read(std::istream &source, const std::string &password)
|
void xlsx_consumer::read(std::istream &source, const std::string &password)
|
||||||
|
@ -588,5 +599,21 @@ void xlsx_consumer::read(std::istream &source, const std::string &password)
|
||||||
read(decrypted_stream);
|
read(decrypted_stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void xlsx_producer::write(std::ostream &destination, const std::string &password)
|
||||||
|
{
|
||||||
|
std::vector<std::uint8_t> decrypted;
|
||||||
|
|
||||||
|
{
|
||||||
|
vector_ostreambuf decrypted_buffer(decrypted);
|
||||||
|
std::ostream decrypted_stream(&decrypted_buffer);
|
||||||
|
write(decrypted_stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto encrypted = crypto_helper::encrypt_xlsx(decrypted, password);
|
||||||
|
vector_istreambuf encrypted_buffer(encrypted);
|
||||||
|
|
||||||
|
destination << &encrypted_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace xlnt
|
} // namespace xlnt
|
||||||
|
|
|
@ -56,6 +56,8 @@ public:
|
||||||
|
|
||||||
void write(std::ostream &destination);
|
void write(std::ostream &destination);
|
||||||
|
|
||||||
|
void write(std::ostream &destination, const std::string &password);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Write all files needed to create a valid XLSX file which represents all
|
/// Write all files needed to create a valid XLSX file which represents all
|
||||||
|
|
|
@ -70,10 +70,10 @@ public:
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
xlnt::workbook wb;
|
xlnt::workbook wb;
|
||||||
wb.load(L"data\\19_unicode_Λ.xlsx");
|
wb.load(L"data\\19_unicode_Λ.xlsx");
|
||||||
#else
|
TS_ASSERT_EQUALS(wb.get_active_sheet().get_cell("A1").get_value<std::string>(), "unicode!");
|
||||||
xlnt::workbook wb;
|
|
||||||
wb.load("data/19_unicode_Λ.xlsx");
|
|
||||||
#endif
|
#endif
|
||||||
TS_ASSERT_EQUALS(wb.get_active_sheet().get_cell("A1").get_value<std::string>(), "unicode!");
|
xlnt::workbook wb2;
|
||||||
|
wb2.load(u8"data/19_unicode_Λ.xlsx");
|
||||||
|
TS_ASSERT_EQUALS(wb2.get_active_sheet().get_cell("A1").get_value<std::string>(), "unicode!");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -21,8 +21,10 @@
|
||||||
//
|
//
|
||||||
// @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 <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <codecvt>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
@ -62,7 +64,7 @@ namespace {
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
std::wstring utf8_to_utf16(const std::string &utf8_string)
|
std::wstring utf8_to_utf16(const std::string &utf8_string)
|
||||||
{
|
{
|
||||||
std::wstring_convert<std::codecvt_utf8<wchar_t> convert;
|
std::wstring_convert<std::codecvt_utf8<wchar_t>> convert;
|
||||||
return convert.from_bytes(utf8_string);
|
return convert.from_bytes(utf8_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,7 +85,7 @@ void open_stream(std::ifstream &stream, const std::string &path)
|
||||||
|
|
||||||
void open_stream(std::ofstream &stream, const std::string &path)
|
void open_stream(std::ofstream &stream, const std::string &path)
|
||||||
{
|
{
|
||||||
stream.open(path, utf8_to_utf16(path));
|
open_stream(stream, utf8_to_utf16(path));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void open_stream(std::ifstream &stream, const std::string &path)
|
void open_stream(std::ifstream &stream, const std::string &path)
|
||||||
|
@ -811,6 +813,12 @@ void workbook::save(std::ostream &stream) const
|
||||||
producer.write(stream);
|
producer.write(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void workbook::save(std::ostream &stream, const std::string &password)
|
||||||
|
{
|
||||||
|
detail::xlsx_producer producer(*this);
|
||||||
|
producer.write(stream, password);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
void workbook::save(const std::wstring &filename)
|
void workbook::save(const std::wstring &filename)
|
||||||
{
|
{
|
||||||
|
@ -837,7 +845,7 @@ void workbook::load(const std::wstring &filename, const std::string &password)
|
||||||
{
|
{
|
||||||
std::ifstream file_stream;
|
std::ifstream file_stream;
|
||||||
open_stream(file_stream, filename);
|
open_stream(file_stream, filename);
|
||||||
load(file_stream);
|
load(file_stream, password);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
2
third-party/botan
vendored
2
third-party/botan
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit 73c2605f50e6192bf6cb560c51d32bc53b4c5597
|
Subproject commit 523b2a4ca48fa5cf04ea371aabe7167ce2e5cd13
|
Loading…
Reference in New Issue
Block a user