bool worksheet::has_cell(const cell_reference &reference) const { const auto row = d_->cell_map_.find(reference.row()); if (row == d_->cell_map_.cend()) return false; const auto col = row->second.find(reference.column_index()); if (col == row->second.cend()) return false; return true; }
cell worksheet::cell(const cell_reference &reference) { auto &row = d_->cell_map_[reference.row()]; auto match = row.find(reference.column_index()); if (match == row.end()) { match = row.emplace(reference.column_index(), detail::cell_impl()).first; auto &impl = match->second; impl.parent_ = d_; impl.column_ = reference.column_index(); impl.row_ = reference.row(); } return xlnt::cell(&match->second); }
cell worksheet::get_cell(const cell_reference &reference) { if (d_->cell_map_.find(reference.get_row()) == d_->cell_map_.end()) { d_->cell_map_[reference.get_row()] = std::unordered_map<column_t, detail::cell_impl>(); } auto &row = d_->cell_map_[reference.get_row()]; if (row.find(reference.get_column_index()) == row.end()) { row[reference.get_column_index()] = detail::cell_impl(d_, reference.get_column_index(), reference.get_row()); } return cell(&row[reference.get_column_index()]); }
void worksheet::freeze_panes(const cell_reference &ref) { if (ref == "A1") { unfreeze_panes(); return; } if (!has_view()) { d_->views_.push_back(sheet_view()); } auto &primary_view = d_->views_.front(); if (!primary_view.has_pane()) { primary_view.pane(pane()); } primary_view.pane().top_left_cell = ref; primary_view.pane().state = pane_state::frozen; primary_view.clear_selections(); if (ref.column() == "A") // no column is frozen { primary_view.add_selection(selection(pane_corner::bottom_left, ref)); primary_view.pane().active_pane = pane_corner::bottom_left; primary_view.pane().y_split = ref.row() - 1; } else if (ref.row() == 1) // no row is frozen { primary_view.add_selection(selection(pane_corner::top_right, ref)); primary_view.pane().active_pane = pane_corner::top_right; primary_view.pane().x_split = ref.column_index() - 1; } else // column and row is frozen { primary_view.add_selection(selection(pane_corner::top_right, cell_reference(ref.column(), 1))); primary_view.add_selection(selection(pane_corner::bottom_left, cell_reference(1, ref.row()))); primary_view.add_selection(selection(pane_corner::bottom_right, ref)); primary_view.pane().active_pane = pane_corner::bottom_right; primary_view.pane().x_split = ref.column_index() - 1; primary_view.pane().y_split = ref.row() - 1; } }
std::size_t cell_reference_hash::operator()(const cell_reference &k) const { return k.get_row_index() * constants::MaxColumn + k.get_column_index(); }
const cell worksheet::get_cell(const cell_reference &reference) const { return cell(&d_->cell_map_.at(reference.get_row()).at(reference.get_column_index())); }
void worksheet::clear_cell(const cell_reference &ref) { d_->cell_map_.at(ref.row()).erase(ref.column()); // TODO: garbage collect newly unreferenced resources such as styles? }
const cell worksheet::cell(const cell_reference &reference) const { return xlnt::cell(&d_->cell_map_.at(reference.row()).at(reference.column_index())); }
std::size_t cell_reference_hash::operator()(const cell_reference &k) const { return k.row() * constants::max_column().index + k.column_index(); }