Skip to content

Commit be0061d

Browse files
committed
✨ support skip_hidden_row_and_column
1 parent ff3c97d commit be0061d

File tree

4 files changed

+49
-4
lines changed

4 files changed

+49
-4
lines changed

.moban.d/README.rst

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,10 @@
33
{%block description%}
44
**pyexcel-xlsx** is a tiny wrapper library to read, manipulate and write data in xlsx and xlsm fromat using openpyxl. You are likely to use it with `pyexcel <https://github.com/pyexcel/pyexcel>`__.
55

6-
Please note that `auto_detect_int` flag will not take effect because openpyxl detect integer in python 3 by default.
6+
Please note:
7+
8+
1. `auto_detect_int` flag will not take effect because openpyxl detect integer in python 3 by default.
9+
2. `skip_hidden_row_and_column` will slow down the read operation.
10+
11+
712
{%endblock%}

pyexcel_xlsx/xlsxr.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ def row_iterator(self):
2929
3030
http://openpyxl.readthedocs.io/en/default/optimized.html
3131
"""
32-
return self._native_sheet.rows
32+
for row in self._native_sheet.rows:
33+
yield row
3334

3435
def column_iterator(self, row):
3536
"""
@@ -39,6 +40,28 @@ def column_iterator(self, row):
3940
yield cell.value
4041

4142

43+
class SlowSheet(XLSXSheet):
44+
"""
45+
This sheet will be slower because it does not use readonly sheet
46+
"""
47+
def row_iterator(self):
48+
"""
49+
skip hidden rows
50+
"""
51+
for row_index, row in enumerate(self._native_sheet.rows, 1):
52+
if self._native_sheet.row_dimensions[row_index].hidden is False:
53+
yield row
54+
55+
def column_iterator(self, row):
56+
"""
57+
skip hidden columns
58+
"""
59+
for column_index, cell in enumerate(row, 1):
60+
letter = openpyxl.utils.get_column_letter(column_index)
61+
if self._native_sheet.column_dimensions[letter].hidden is False:
62+
yield cell.value
63+
64+
4265
class XLSXBook(BookReader):
4366
"""
4467
Open xlsx as read only mode
@@ -80,13 +103,20 @@ def read_all(self):
80103
return result
81104

82105
def read_sheet(self, native_sheet):
83-
sheet = XLSXSheet(native_sheet, **self._keywords)
106+
if self._keywords.get('skip_hidden_row_and_column', False) is True:
107+
sheet = SlowSheet(native_sheet, **self._keywords)
108+
else:
109+
sheet = XLSXSheet(native_sheet, **self._keywords)
84110
return {sheet.name: sheet.to_array()}
85111

86112
def close(self):
87113
self._native_book.close()
88114
self._native_book = None
89115

90116
def _load_the_excel_file(self, file_alike_object):
117+
read_only_flag = True
118+
if self._keywords.get('skip_hidden_row_and_column', False) is True:
119+
read_only_flag = False
91120
self._native_book = openpyxl.load_workbook(
92-
filename=file_alike_object, data_only=True, read_only=True)
121+
filename=file_alike_object, data_only=True,
122+
read_only=read_only_flag)

tests/fixtures/hidden.xlsx

7.95 KB
Binary file not shown.

tests/test_hidden.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import os
2+
from nose.tools import eq_
3+
from pyexcel_xls import get_data
4+
5+
6+
def test_hidden_row():
7+
data = get_data(os.path.join("tests", "fixtures", "hidden.xlsx"),
8+
skip_hidden_row_and_column=True)
9+
expected = [[1, 2], [7, 9]]
10+
eq_(data['Sheet1'], expected)

0 commit comments

Comments
 (0)