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;