# Copyright (c) 2010-2021 openpyxl import pytest import datetime from io import BytesIO from lxml.etree import iterparse, fromstring from openpyxl.xml.constants import SHEET_MAIN_NS from openpyxl.utils.indexed_list import IndexedList from openpyxl.packaging.relationship import Relationship, RelationshipList from openpyxl.utils.datetime import CALENDAR_WINDOWS_1900, CALENDAR_MAC_1904 from openpyxl.styles.styleable import StyleArray from openpyxl.styles.borders import DEFAULT_BORDER from openpyxl.styles.differential import DifferentialStyle from openpyxl.formula.translate import Translator from ..worksheet import Worksheet from ..pagebreak import Break, RowBreak, ColBreak from ..scenario import ScenarioList, Scenario, InputCells @pytest.mark.parametrize("value, expected", [ ('4.2', 4.2), ('-42.000', -42), ('0', 0), ('0.9999', 0.9999), ('99E-02', 0.99), ('4', 4), ('-1E3', -1000), ('1E-3', 0.001), ('2e+2', 200.0), ] ) def test_number_convesion(value, expected): from .._reader import _cast_number assert _cast_number(value) == expected @pytest.fixture def Workbook(): class DummyWorkbook: data_only = False _colors = [] encoding = "utf8" epoch = CALENDAR_WINDOWS_1900 def __init__(self): self._differential_styles = [DifferentialStyle()] * 5 self.shared_strings = ['a'] * 30 self._fonts = IndexedList() self._fills = IndexedList() self._number_formats = IndexedList() self._borders = IndexedList([DEFAULT_BORDER] * 30) self._alignments = IndexedList() self._protections = IndexedList() self._cell_styles = IndexedList() self.vba_archive = None for i in range(29): self._cell_styles.add((StyleArray([i]*9))) self._cell_styles.add(StyleArray([0,4,6,0,0,1,0,0,0])) #fillId=4, borderId=6, alignmentId=1)) self.sheetnames = [] self._date_formats = set() self._timedelta_formats = set() def create_sheet(self, title): return Worksheet(self) return DummyWorkbook() @pytest.fixture def WorkSheetParser(): """Setup a parser instance with an empty source""" from .._reader import WorkSheetParser styles = IndexedList() for i in range(29): styles.add((StyleArray([i]*9))) styles.add(StyleArray([0,4,6,14,0,1,0,0,0])) #fillId=4, borderId=6, number_format=14 alignmentId=1)) date_formats = set([1, 29]) timedelta_formats = set([30]) return WorkSheetParser(None, {0:'a'}, date_formats=date_formats, timedelta_formats=timedelta_formats) from warnings import simplefilter simplefilter("always") class TestWorksheetParser: @pytest.mark.parametrize("filename, expected", [ ("dimension.xml", (4, 1, 27, 30)), ("no_dimension.xml", None), ("invalid_dimension.xml", (None, 1, None, 113)), ] ) def test_read_dimension(self, WorkSheetParser, datadir, filename, expected): datadir.chdir() parser = WorkSheetParser parser.source = filename dimension = parser.parse_dimensions() assert dimension == expected def test_col_width(self, datadir, WorkSheetParser): datadir.chdir() parser = WorkSheetParser with open("complex-styles-worksheet.xml", "rb") as src: cols = iterparse(src, tag='{%s}col' % SHEET_MAIN_NS) for _, col in cols: parser.parse_column_dimensions(col) assert set(parser.column_dimensions) == set(['A', 'C', 'E', 'I', 'G']) assert parser.column_dimensions['A'] == {'max': '1', 'min': '1', 'index':'A', 'customWidth': '1', 'width': '31.1640625'} def test_hidden_col(self, WorkSheetParser): parser = WorkSheetParser src = """""" element = fromstring(src) parser.parse_column_dimensions(element) assert 'D' in parser.column_dimensions assert parser.column_dimensions['D'] == {'customWidth': '1', 'width':'0', 'hidden': '1', 'max': '4', 'min': '4', 'index':'D'} def test_styled_col(self, datadir, WorkSheetParser): datadir.chdir() parser = WorkSheetParser with open("complex-styles-worksheet.xml", "rb") as src: cols = iterparse(src, tag='{%s}col' % SHEET_MAIN_NS) for _, col in cols: parser.parse_column_dimensions(col) assert 'I' in parser.column_dimensions cd = parser.column_dimensions['I'] assert cd == {'customWidth': '1', 'max': '9', 'min': '9', 'width': '25', 'index':'I', 'style':'28'} def test_row_dimensions(self, WorkSheetParser): src = """""" element = fromstring(src) parser = WorkSheetParser parser.parse_row(element) assert 2 not in parser.row_dimensions def test_hidden_row(self, WorkSheetParser): parser = WorkSheetParser src = """