diff --git a/doorstop/core/importer.py b/doorstop/core/importer.py index 74db7cf1e..54757ceb0 100644 --- a/doorstop/core/importer.py +++ b/doorstop/core/importer.py @@ -189,7 +189,7 @@ def _file_xlsx(path, document, mapping=None): # Parse the file log.debug("reading rows in {}...".format(path)) - workbook = openpyxl.load_workbook(path) + workbook = openpyxl.load_workbook(path, data_only=True) worksheet = workbook.active index = 0 diff --git a/doorstop/core/tests/files/formula.xlsx b/doorstop/core/tests/files/formula.xlsx new file mode 100644 index 000000000..07b77e618 Binary files /dev/null and b/doorstop/core/tests/files/formula.xlsx differ diff --git a/doorstop/core/tests/test_importer.py b/doorstop/core/tests/test_importer.py index b5cde0e49..a92ffcd3e 100644 --- a/doorstop/core/tests/test_importer.py +++ b/doorstop/core/tests/test_importer.py @@ -349,6 +349,39 @@ def test_file_xlsx(self, mock_itemize): self.assertEqual(expected_data, data) self.assertIs(mock_document, document) + @patch('doorstop.core.importer._itemize') + def test_file_xlsx_formula(self, mock_itemize): + """Verify a XLSX file with formula can be imported.""" + path = os.path.join(FILES, 'formula.xlsx') + mock_document = Mock() + # Act + with catch_warnings(): + importer._file_xlsx(path, mock_document) + # Assert + args, kwargs = mock_itemize.call_args + logging.debug("args: {}".format(args)) + logging.debug("kwargs: {}".format(kwargs)) + header, data, document = args + expected_header = [ + 'uid', + 'level', + 'text', + 'ref', + 'links', + 'active', + 'derived', + 'header', + 'normative', + 'reviewed', + ] + self.assertEqual(expected_header, header) + expected_data = [ + ['REQ001', '1.2.3', 'active', None, None, 1, 0, None, 1, None], + ['REQ002', '1.2.4', 'inactive', None, None, 0, 0, None, 1, None], + ] + self.assertEqual(expected_data, data) + self.assertIs(mock_document, document) + @patch('doorstop.core.importer.add_item') def test_itemize(self, mock_add_item): """Verify item data can be converted to items."""