diff --git a/include/xlnt/worksheet/cell_iterator.hpp b/include/xlnt/worksheet/cell_iterator.hpp index 766e2db1..75f32b4f 100644 --- a/include/xlnt/worksheet/cell_iterator.hpp +++ b/include/xlnt/worksheet/cell_iterator.hpp @@ -136,6 +136,13 @@ public: /// cell_iterator operator++(int); + /// + /// When iterating over a range that doesn't ignore null cells, operator*() + /// will throw when trying to access the cells that are null. This method + /// checks the existence of a cell. + /// + bool has_value() const; + private: /// /// If true, cells that don't exist in the worksheet will be skipped during iteration. @@ -263,6 +270,13 @@ public: /// const_cell_iterator operator++(int); + /// + /// When iterating over a range that doesn't ignore null cells, operator*() + /// will throw when trying to access the cells that are null. This method + /// checks the existence of a cell. + /// + bool has_value() const; + private: /// /// If true, cells that don't exist in the worksheet will be skipped during iteration. diff --git a/source/worksheet/cell_iterator.cpp b/source/worksheet/cell_iterator.cpp index 02faa005..5fa94f57 100644 --- a/source/worksheet/cell_iterator.cpp +++ b/source/worksheet/cell_iterator.cpp @@ -278,4 +278,12 @@ const const_cell_iterator::reference const_cell_iterator::operator*() const { return ws_.cell(cursor_); } + +bool cell_iterator::has_value() const{ + return ws_.has_cell(cursor_); +} + +bool const_cell_iterator::has_value() const{ + return ws_.has_cell(cursor_); +} } // namespace xlnt diff --git a/tests/worksheet/worksheet_test_suite.cpp b/tests/worksheet/worksheet_test_suite.cpp index 0614dbdb..1ca50caa 100644 --- a/tests/worksheet/worksheet_test_suite.cpp +++ b/tests/worksheet/worksheet_test_suite.cpp @@ -76,6 +76,7 @@ public: register_test(test_lowest_row_or_props); register_test(test_highest_row); register_test(test_highest_row_or_props); + register_test(test_iterator_has_value); register_test(test_const_iterators); register_test(test_const_reverse_iterators); register_test(test_column_major_iterators); @@ -586,6 +587,31 @@ public: xlnt_assert_equals(ws.highest_row_or_props(), 11); } + void test_iterator_has_value() + { + xlnt::workbook wb; + auto ws = wb.active_sheet(); + + // make a worksheet with a blank row and column + ws.cell("A1").value("A1"); + ws.cell("A3").value("A3"); + ws.cell("C1").value("C1"); + + xlnt_assert_equals(ws.columns(false)[0].begin().has_value(), true); + xlnt_assert_equals(ws.rows(false)[0].begin().has_value(), true); + + xlnt_assert_equals(ws.columns(false)[1].begin().has_value(), false); + xlnt_assert_equals(ws.rows(false)[1].begin().has_value(), false); + + // also test const interators. + xlnt_assert_equals(ws.columns(false)[0].cbegin().has_value(), true); + xlnt_assert_equals(ws.rows(false)[0].cbegin().has_value(), true); + + xlnt_assert_equals(ws.columns(false)[1].cbegin().has_value(), false); + xlnt_assert_equals(ws.rows(false)[1].cbegin().has_value(), false); + + } + void test_const_iterators() { xlnt::workbook wb;