1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
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".
|