summaryrefslogtreecommitdiff
blob: 0a9c2749d87cb6a517921f87fd499f6143596e15 (plain)
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".