mirror of
https://github.com/tfussell/xlnt.git
synced 2024-03-22 13:11:17 +08:00
157 lines
3.0 KiB
C++
157 lines
3.0 KiB
C++
#include <ctime>
|
|
|
|
#include "cell.h"
|
|
#include "worksheet.h"
|
|
|
|
namespace xlnt {
|
|
|
|
struct cell_struct
|
|
{
|
|
cell_struct() : type(cell::type::null)
|
|
{
|
|
|
|
}
|
|
|
|
cell_struct(worksheet *ws, const std::string &column, int row)
|
|
: type(cell::type::null), parent_worksheet(ws),
|
|
column(xlnt::cell::column_index_from_string(column) - 1), row(row)
|
|
{
|
|
|
|
}
|
|
|
|
std::string to_string() const
|
|
{
|
|
switch(type)
|
|
{
|
|
case cell::type::numeric: return std::to_string(numeric_value);
|
|
case cell::type::boolean: return bool_value ? "true" : "false";
|
|
case cell::type::string: return string_value;
|
|
default: throw std::runtime_error("bad enum");
|
|
}
|
|
}
|
|
|
|
cell::type type;
|
|
|
|
union
|
|
{
|
|
long double numeric_value;
|
|
bool bool_value;
|
|
};
|
|
|
|
tm date_value;
|
|
std::string string_value;
|
|
worksheet *parent_worksheet;
|
|
int column;
|
|
int row;
|
|
};
|
|
|
|
cell::cell(const cell ©)
|
|
{
|
|
root_ = copy.root_;
|
|
}
|
|
|
|
coordinate cell::coordinate_from_string(const std::string &address)
|
|
{
|
|
if(address == "A1")
|
|
{
|
|
return {"A", 1};
|
|
}
|
|
|
|
return {"A", 1};
|
|
}
|
|
|
|
int cell::column_index_from_string(const std::string &column_string)
|
|
{
|
|
return column_string[0] - 'A';
|
|
}
|
|
|
|
std::string cell::get_column_letter(int column_index)
|
|
{
|
|
return std::string(1, (char)('A' + column_index - 1));
|
|
}
|
|
|
|
bool cell::is_date() const
|
|
{
|
|
return root_->type == type::date;
|
|
}
|
|
|
|
bool operator==(const char *comparand, const cell &cell)
|
|
{
|
|
return std::string(comparand) == cell;
|
|
}
|
|
|
|
bool operator==(const std::string &comparand, const cell &cell)
|
|
{
|
|
return cell.root_->type == cell::type::string && cell.root_->string_value == comparand;
|
|
}
|
|
|
|
bool operator==(const tm &comparand, const cell &cell)
|
|
{
|
|
return cell.root_->type == cell::type::date && cell.root_->date_value.tm_hour == comparand.tm_hour;
|
|
}
|
|
|
|
std::string cell::absolute_coordinate(const std::string &absolute_address)
|
|
{
|
|
return absolute_address;
|
|
}
|
|
|
|
cell::cell(worksheet &ws, const std::string &column, int row) : root_(new cell_struct(&ws, column, row))
|
|
{
|
|
|
|
}
|
|
|
|
cell::cell(worksheet &ws, const std::string &column, int row, const std::string &value) : root_(new cell_struct(&ws, column, row))
|
|
{
|
|
*this = value;
|
|
}
|
|
|
|
cell::type cell::get_data_type()
|
|
{
|
|
return root_->type;
|
|
}
|
|
|
|
cell &cell::operator=(int value)
|
|
{
|
|
root_->type = type::numeric;
|
|
root_->numeric_value = value;
|
|
return *this;
|
|
}
|
|
|
|
cell &cell::operator=(double value)
|
|
{
|
|
root_->type = type::numeric;
|
|
root_->numeric_value = value;
|
|
return *this;
|
|
}
|
|
|
|
cell &cell::operator=(const std::string &value)
|
|
{
|
|
root_->type = type::string;
|
|
root_->string_value = value;
|
|
return *this;
|
|
}
|
|
|
|
cell &cell::operator=(const char *value)
|
|
{
|
|
return *this = std::string(value);
|
|
}
|
|
|
|
cell &cell::operator=(const tm &value)
|
|
{
|
|
root_->type = type::date;
|
|
root_->date_value = value;
|
|
return *this;
|
|
}
|
|
|
|
cell::~cell()
|
|
{
|
|
delete root_;
|
|
}
|
|
|
|
std::string cell::to_string() const
|
|
{
|
|
return root_->to_string();
|
|
}
|
|
|
|
} // namespace xlnt
|