1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
#include <orcus/spreadsheet/document.hpp>
#include <orcus/spreadsheet/factory.hpp>
#include <orcus/orcus_ods.hpp>
#include <ixion/address.hpp>
#include <ixion/model_context.hpp>
#include <ixion/formula_result.hpp>
#include <ixion/cell.hpp>
#include <iostream>
#include <filesystem>
using namespace orcus;
int main()
{
std::filesystem::path input_dir = std::getenv("INPUTDIR");
// Instantiate a document, and wrap it with a factory.
spreadsheet::range_size_t ss{1048576, 16384};
spreadsheet::document doc{ss};
spreadsheet::import_factory factory{doc};
// Pass the factory to the document loader, and read the content from a file
// to populate the document.
orcus_ods loader(&factory);
auto filepath = input_dir / "document.ods";
loader.read_file(filepath.native());
doc.recalc_formula_cells();
// Now that the document is fully populated, access its content.
const ixion::model_context& model = doc.get_model_context();
//!code-start: print-numeric-cells
for (spreadsheet::row_t row = 1; row <= 6; ++row)
{
ixion::abs_address_t pos(0, row, 0);
double value = model.get_numeric_value(pos);
std::cout << "A" << (pos.row+1) << ": " << value << std::endl;
}
//!code-end: print-numeric-cells
//!code-start: print-formula-cells
for (spreadsheet::row_t row = 1; row <=6; ++row)
{
ixion::abs_address_t pos(0, row, 2); // Column C
const ixion::formula_cell* fc = model.get_formula_cell(pos);
assert(fc);
// Get the formula cell results.
const ixion::formula_result& result = fc->get_result_cache(
ixion::formula_result_wait_policy_t::throw_exception);
// We already know the result is a string.
const std::string& s = result.get_string();
std::cout << "C" << (pos.row+1) << ": " << s << std::endl;
}
//!code-end: print-formula-cells
return EXIT_SUCCESS;
}
|