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 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 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 max = static_cast<column_t::index_t>(std::stoull(parser().attribute("max")));
|
||||
|
||||
auto width = std::stold(parser().attribute("width"));
|
||||
bool custom = parser().attribute("customWidth") == std::string("1");
|
||||
auto column_style = static_cast<std::size_t>(parser().attribute_present("style") ? std::stoull(parser().attribute("style")) : 0);
|
||||
auto column_style = parser().attribute_present("style")
|
||||
? 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++)
|
||||
{
|
||||
if (!ws.has_column_properties(column))
|
||||
{
|
||||
ws.add_column_properties(column, column_properties());
|
||||
}
|
||||
column_properties props;
|
||||
|
||||
ws.get_column_properties(min).width = width;
|
||||
ws.get_column_properties(min).style = column_style;
|
||||
ws.get_column_properties(min).custom = custom;
|
||||
props.width = width;
|
||||
props.style = column_style;
|
||||
props.custom = custom;
|
||||
|
||||
ws.add_column_properties(column, props);
|
||||
}
|
||||
|
||||
if (parser().attribute_present("bestFit"))
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
#include <detail/vector_streambuf.hpp>
|
||||
#include <detail/xlsx_consumer.hpp>
|
||||
#include <detail/xlsx_producer.hpp>
|
||||
#include <xlnt/utils/exceptions.hpp>
|
||||
#include <xlnt/workbook/workbook.hpp>
|
||||
|
||||
|
@ -576,6 +577,16 @@ struct crypto_helper
|
|||
|
||||
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)
|
||||
|
@ -588,5 +599,21 @@ void xlsx_consumer::read(std::istream &source, const std::string &password)
|
|||
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 xlnt
|
||||
|
|
|
@ -56,6 +56,8 @@ public:
|
|||
|
||||
void write(std::ostream &destination);
|
||||
|
||||
void write(std::ostream &destination, const std::string &password);
|
||||
|
||||
private:
|
||||
/// <summary>
|
||||
/// Write all files needed to create a valid XLSX file which represents all
|
||||
|
|
|
@ -70,10 +70,10 @@ public:
|
|||
#ifdef WIN32
|
||||
xlnt::workbook wb;
|
||||
wb.load(L"data\\19_unicode_Λ.xlsx");
|
||||
#else
|
||||
xlnt::workbook wb;
|
||||
wb.load("data/19_unicode_Λ.xlsx");
|
||||
TS_ASSERT_EQUALS(wb.get_active_sheet().get_cell("A1").get_value<std::string>(), "unicode!");
|
||||
#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
|
||||
// @author: see AUTHORS file
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <codecvt>
|
||||
#include <fstream>
|
||||
#include <functional>
|
||||
#include <set>
|
||||
|
@ -62,7 +64,7 @@ namespace {
|
|||
#ifdef WIN32
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -83,7 +85,7 @@ void open_stream(std::ifstream &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
|
||||
void open_stream(std::ifstream &stream, const std::string &path)
|
||||
|
@ -811,6 +813,12 @@ void workbook::save(std::ostream &stream) const
|
|||
producer.write(stream);
|
||||
}
|
||||
|
||||
void workbook::save(std::ostream &stream, const std::string &password)
|
||||
{
|
||||
detail::xlsx_producer producer(*this);
|
||||
producer.write(stream, password);
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
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;
|
||||
open_stream(file_stream, filename);
|
||||
load(file_stream);
|
||||
load(file_stream, password);
|
||||
}
|
||||
#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