| From 6c2c1057d2780c079218fe988d1d5243eefec159 Mon Sep 17 00:00:00 2001 |
| From: Konstantin Lopuhin <kostia.lopuhin@gmail.com> |
| Date: Wed, 18 Jun 2014 12:43:04 +0400 |
| Subject: [PATCH] fix parsing of bad dimensions |
| |
| --- |
| xlrd/xlsx.py | 24 ++++++++++++++++++------ |
| 1 file changed, 18 insertions(+), 6 deletions(-) |
| |
| diff --git a/xlrd/xlsx.py b/xlrd/xlsx.py |
| index 53fbb89..763df0c 100644 |
| --- a/xlrd/xlsx.py |
| +++ b/xlrd/xlsx.py |
| @@ -73,7 +73,8 @@ def augment_keys(adict, uri): |
| _UPPERCASE_1_REL_INDEX[_x] = 0
|
| del _x
|
|
|
| -def cell_name_to_rowx_colx(cell_name, letter_value=_UPPERCASE_1_REL_INDEX):
|
| +def cell_name_to_rowx_colx(cell_name, letter_value=_UPPERCASE_1_REL_INDEX,
|
| + allow_no_col=False):
|
| # Extract column index from cell name
|
| # A<row number> => 0, Z =>25, AA => 26, XFD => 16383
|
| colx = 0
|
| @@ -85,9 +86,18 @@ def cell_name_to_rowx_colx(cell_name, letter_value=_UPPERCASE_1_REL_INDEX): |
| if lv:
|
| colx = colx * 26 + lv
|
| else: # start of row number; can't be '0'
|
| - colx = colx - 1
|
| - assert 0 <= colx < X12_MAX_COLS
|
| - break
|
| + if charx == 0:
|
| + # there was no col marker
|
| + if allow_no_col:
|
| + colx = None
|
| + break
|
| + else:
|
| + raise Exception(
|
| + 'Missing col in cell name %r', cell_name)
|
| + else:
|
| + colx = colx - 1
|
| + assert 0 <= colx < X12_MAX_COLS
|
| + break
|
| except KeyError:
|
| raise Exception('Unexpected character %r in cell name %r' % (c, cell_name))
|
| rowx = int(cell_name[charx:]) - 1
|
| @@ -562,9 +572,11 @@ def do_dimension(self, elem): |
| if ref:
|
| # print >> self.logfile, "dimension: ref=%r" % ref
|
| last_cell_ref = ref.split(':')[-1] # example: "Z99"
|
| - rowx, colx = cell_name_to_rowx_colx(last_cell_ref)
|
| + rowx, colx = cell_name_to_rowx_colx(
|
| + last_cell_ref, allow_no_col=True)
|
| self.sheet._dimnrows = rowx + 1
|
| - self.sheet._dimncols = colx + 1
|
| + if colx is not None:
|
| + self.sheet._dimncols = colx + 1
|
|
|
| def do_merge_cell(self, elem):
|
| # The ref attribute should be a cell range like "B1:D5".
|