8
8
:license: New BSD License
9
9
"""
10
10
import sys
11
- import openpyxl
12
-
13
11
from pyexcel_io .book import BookReader , BookWriter
14
12
from pyexcel_io .sheet import SheetReader , SheetWriter
13
+ import openpyxl
15
14
16
- PY2 = sys .version_info [0 ] == 2
17
- if PY2 and sys . version_info [ 1 ] < 7 :
15
+ PY27_BELOW = sys .version_info [0 ] == 2 and sys . version_info [ 1 ] < 7
16
+ if PY27_BELOW :
18
17
from ordereddict import OrderedDict
19
18
else :
20
- from collections import OrderedDict
19
+ from collections import OrderedDict
21
20
22
21
23
22
COLUMNS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
24
23
COLUMN_LENGTH = 26
25
24
26
25
27
26
def get_columns (index ):
27
+ """
28
+ Convert column index to column name
29
+ """
28
30
if index < COLUMN_LENGTH :
29
31
return COLUMNS [index ]
30
32
else :
31
- return (get_columns (int (index // COLUMN_LENGTH ) - 1 ) + COLUMNS [index % COLUMN_LENGTH ])
33
+ return (get_columns (int (index // COLUMN_LENGTH ) - 1 ) +
34
+ COLUMNS [index % COLUMN_LENGTH ])
32
35
33
36
34
37
class XLSXSheet (SheetReader ):
@@ -37,6 +40,7 @@ class XLSXSheet(SheetReader):
37
40
"""
38
41
@property
39
42
def name (self ):
43
+ """sheet name"""
40
44
return self .native_sheet .title
41
45
42
46
def number_of_rows (self ):
@@ -60,16 +64,16 @@ def cell_value(self, row, column):
60
64
return self .native_sheet .cell (cell_location ).value
61
65
62
66
def to_array (self ):
63
- for r in range (0 , self .number_of_rows ()):
64
- row = []
67
+ for row in range (0 , self .number_of_rows ()):
68
+ return_row = []
65
69
tmp_row = []
66
- for c in range (0 , self .number_of_columns ()):
67
- cell_value = self .cell_value (r , c )
70
+ for column in range (0 , self .number_of_columns ()):
71
+ cell_value = self .cell_value (row , column )
68
72
tmp_row .append (cell_value )
69
73
if cell_value is not None and cell_value != '' :
70
- row += tmp_row
74
+ return_row += tmp_row
71
75
tmp_row = []
72
- yield row
76
+ yield return_row
73
77
74
78
75
79
class XLSXBook (BookReader ):
@@ -78,10 +82,6 @@ class XLSXBook(BookReader):
78
82
79
83
It reads xls, xlsm, xlsx work book
80
84
"""
81
- def __init__ (self ):
82
- BookReader .__init__ (self )
83
- self .book = None
84
-
85
85
def open (self , file_name , ** keywords ):
86
86
BookReader .open (self , file_name , ** keywords )
87
87
self ._load_from_file ()
@@ -91,37 +91,40 @@ def open_stream(self, file_stream, **keywords):
91
91
self ._load_from_memory ()
92
92
93
93
def read_sheet_by_name (self , sheet_name ):
94
- sheet = self .book .get_sheet_by_name (sheet_name )
94
+ sheet = self .native_book .get_sheet_by_name (sheet_name )
95
95
if sheet is None :
96
96
raise ValueError ("%s cannot be found" % sheet_name )
97
97
else :
98
- sheet = XLSXSheet (sheet )
99
- return {sheet_name : sheet .to_array ()}
98
+ return self .read_sheet (sheet )
100
99
101
100
def read_sheet_by_index (self , sheet_index ):
102
- names = self .book .sheetnames
101
+ names = self .native_book .sheetnames
103
102
length = len (names )
104
103
if sheet_index < length :
105
104
return self .read_sheet_by_name (names [sheet_index ])
106
105
else :
107
- raise IndexError ("Index %d of out bound %d" % (
106
+ raise IndexError ("Index %d of out bound %d" % (
108
107
sheet_index ,
109
108
length ))
110
109
111
110
def read_all (self ):
112
111
result = OrderedDict ()
113
- for sheet in self .book :
114
- sheet = XLSXSheet (sheet )
115
- result [ sheet . name ] = sheet . to_array ( )
112
+ for sheet in self .native_book :
113
+ data_dict = self . read_sheet (sheet )
114
+ result . update ( data_dict )
116
115
return result
117
-
116
+
117
+ def read_sheet (self , native_sheet ):
118
+ sheet = XLSXSheet (native_sheet , ** self .keywords )
119
+ return {sheet .name : sheet .to_array ()}
120
+
118
121
def _load_from_memory (self ):
119
- self .book = openpyxl .load_workbook (filename = self .file_stream ,
120
- data_only = True )
122
+ self .native_book = openpyxl .load_workbook (filename = self .file_stream ,
123
+ data_only = True )
121
124
122
125
def _load_from_file (self ):
123
- self .book = openpyxl .load_workbook (filename = self .file_name ,
124
- data_only = True )
126
+ self .native_book = openpyxl .load_workbook (filename = self .file_name ,
127
+ data_only = True )
125
128
126
129
127
130
class XLSXSheetWriter (SheetWriter ):
@@ -177,7 +180,7 @@ def close(self):
177
180
"writer" : XLSXWriter ,
178
181
"stream_type" : "binary" ,
179
182
"mime_type" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ,
180
- "library" : "openpyxl "
183
+ "library" : "pyexcel-xlsx "
181
184
}
182
185
183
186
_xlsm_registry = {
@@ -186,7 +189,7 @@ def close(self):
186
189
"writer" : XLSXWriter ,
187
190
"stream_type" : "binary" ,
188
191
"mime_type" : "application/vnd.ms-excel.sheet.macroenabled.12" ,
189
- "library" : "openpyxl "
192
+ "library" : "pyexcel-xlsx "
190
193
}
191
194
192
- exports = (_xlsx_registry , _xlsm_registry )
195
+ exports = (_xlsx_registry , _xlsm_registry )
0 commit comments