From 79fd9f2060cf6120abad8f1a29ba3f4ac61ebdef Mon Sep 17 00:00:00 2001 From: ditenberg Date: Sun, 30 Oct 2016 02:14:27 -0400 Subject: [PATCH 1/3] COMPAT: openpyxl #14519 Updated _Openpyxl22Writer.write_cells() to use new coordinate call method wks['coordinate'] instead of wks.cell() in accordance with https://openpyxl.readthedocs.io/en/default/tutorial.html#accessing-one-cell in the newest release of Openpyxl (2.4.0 and later). --- pandas/io/excel.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pandas/io/excel.py b/pandas/io/excel.py index 6662d106ad85d..3814622f4b525 100644 --- a/pandas/io/excel.py +++ b/pandas/io/excel.py @@ -1308,10 +1308,8 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0): self.sheets[sheet_name] = wks for cell in cells: - xcell = wks.cell( - row=startrow + cell.row + 1, - column=startcol + cell.col + 1 - ) + xcell = wks['%s%s' % + (startrow + cell.row + 1, startcol + cell.col + 1)] xcell.value = _conv_value(cell.val) style_kwargs = {} @@ -1349,7 +1347,7 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0): if row == first_row and col == first_col: # Ignore first cell. It is already handled. continue - xcell = wks.cell(column=col, row=row) + xcell = wks['%s%s' % (col, row)] for k, v in style_kwargs.items(): setattr(xcell, k, v) From d6d543715a2e013aaf5e38c5ca4b94bbc89e6132 Mon Sep 17 00:00:00 2001 From: ditenberg Date: Sun, 30 Oct 2016 11:11:19 -0400 Subject: [PATCH 2/3] Update _Openpyxl20Writer(s) Update _Openpyxl20Writer and fixed _Openpyxl22Writer write_cells() methods. Made 20 index cells using numeric row/columns. Made 22 the same way as well (original state in current master) --- pandas/io/excel.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pandas/io/excel.py b/pandas/io/excel.py index 3814622f4b525..c95ff897956ac 100644 --- a/pandas/io/excel.py +++ b/pandas/io/excel.py @@ -902,7 +902,7 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0): for cell in cells: colletter = get_column_letter(startcol + cell.col + 1) - xcell = wks.cell("%s%s" % (colletter, startrow + cell.row + 1)) + xcell = wks.cell(row=startrow + cell.row + 1, column=colletter) xcell.value = _conv_value(cell.val) style_kwargs = {} @@ -943,7 +943,7 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0): # Ignore first cell. It is already handled. continue colletter = get_column_letter(col) - xcell = wks.cell("%s%s" % (colletter, row)) + xcell = wks.cell(row=row, column=colletter) xcell.style = xcell.style.copy(**style_kwargs) @classmethod @@ -1308,8 +1308,7 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0): self.sheets[sheet_name] = wks for cell in cells: - xcell = wks['%s%s' % - (startrow + cell.row + 1, startcol + cell.col + 1)] + xcell = wks.cell(row=startrow + cell.row + 1, column=startcol + cell.col + 1) xcell.value = _conv_value(cell.val) style_kwargs = {} @@ -1347,7 +1346,7 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0): if row == first_row and col == first_col: # Ignore first cell. It is already handled. continue - xcell = wks['%s%s' % (col, row)] + xcell = wks.cell(row=row, column=col) for k, v in style_kwargs.items(): setattr(xcell, k, v) From f0b201bb20d120bbdf4d84225a745c72fadc1bee Mon Sep 17 00:00:00 2001 From: ditenberg Date: Sun, 30 Oct 2016 11:47:52 -0400 Subject: [PATCH 3/3] Add exceptions to Openpyxl tests Updated syntax to latest release openpyxl for retrieving cell values --- pandas/io/tests/test_excel.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/pandas/io/tests/test_excel.py b/pandas/io/tests/test_excel.py index 998e71076b7c0..bc7af684974df 100644 --- a/pandas/io/tests/test_excel.py +++ b/pandas/io/tests/test_excel.py @@ -1940,6 +1940,7 @@ def test_to_excel_styleconverter(self): self.assertEqual(kw['protection'], protection) def test_write_cells_merge_styled(self): + import warnings from pandas.formats.format import ExcelCell from openpyxl import styles @@ -1962,13 +1963,14 @@ def test_write_cells_merge_styled(self): ] with ensure_clean('.xlsx') as path: + warnings.simplefilter('error', UserWarning) writer = _Openpyxl20Writer(path) writer.write_cells(initial_cells, sheet_name=sheet_name) writer.write_cells(merge_cells, sheet_name=sheet_name) wks = writer.sheets[sheet_name] - xcell_b1 = wks.cell('B1') - xcell_a2 = wks.cell('A2') + xcell_b1 = wks['B1'] + xcell_a2 = wks['A2'] self.assertEqual(xcell_b1.style, openpyxl_sty_merged) self.assertEqual(xcell_a2.style, openpyxl_sty_merged) @@ -2052,7 +2054,8 @@ def test_to_excel_styleconverter(self): def test_write_cells_merge_styled(self): if not openpyxl_compat.is_compat(major_ver=2): raise nose.SkipTest('incompatiable openpyxl version') - + + import warnings from pandas.formats.format import ExcelCell sheet_name = 'merge_styled' @@ -2074,13 +2077,14 @@ def test_write_cells_merge_styled(self): ] with ensure_clean('.xlsx') as path: + warnings.simplefilter('error', UserWarning) writer = _Openpyxl22Writer(path) writer.write_cells(initial_cells, sheet_name=sheet_name) writer.write_cells(merge_cells, sheet_name=sheet_name) wks = writer.sheets[sheet_name] - xcell_b1 = wks.cell('B1') - xcell_a2 = wks.cell('A2') + xcell_b1 = wks['B1'] + xcell_a2 = wks['A2'] self.assertEqual(xcell_b1.font, openpyxl_sty_merged) self.assertEqual(xcell_a2.font, openpyxl_sty_merged) @@ -2176,9 +2180,9 @@ def test_column_format(self): read_workbook = openpyxl.load_workbook(path) read_worksheet = read_workbook.get_sheet_by_name(name='Sheet1') - # Get the number format from the cell. This method is backward - # compatible with older versions of openpyxl. - cell = read_worksheet.cell('B2') + # Get the number format from the cell. This method is current + # with openpyxl latest release. + cell = read_worksheet['B2'] try: read_num_format = cell.number_format