8000 :sparkles: initial skeleton for xlsb reader · pyexcel/pyexcel-xlsbr@4b5b500 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4b5b500

Browse files
committed
✨ initial skeleton for xlsb reader
1 parent ea91f82 commit 4b5b500

File tree

8 files changed

+98
-3
lines changed

8 files changed

+98
-3
lines changed

.moban.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,3 @@ targets:
1818
- .gitignore: gitignore.jj2
1919
- "docs/source/conf.py": "docs/source/conf.py.jj2"
2020
- "pyexcel_xlsbr/_version.py": version.py.jj2
21-
- "tests/base.py": "tests/base.py"

pyexcel-xlsbr.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ current_version: "0.0.1"
66
release: "0.0.1"
77
dependencies:
88
- pyxlsb
9+
- pyexcel-io
910
description: "read Microsoft Excel tm xlsb file"

pyexcel_xlsbr/__init__.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,26 @@
1-
from ._version import __version__, __author__ # flake8: noqa
1+
"""
2+
pyexcel_xlsbr
3+
~~~~~~~~~~~~~~~~~~~
4+
The lower level xlsb file format handler
5+
:copyright: (c) 2018 by Onni Software Ltd & its contributors
6+
:license: New BSD License
7+
"""
8+
from pyexcel_io.plugins import IOPluginInfoChain
9+
from pyexcel_io.io import get_data as read_data, isstream
10+
11+
from ._version import __version__, __author__ # flake8: noqa
12+
13+
14+
__FILE_TYPE__ = 'xlsb'
15+
16+
IOPluginInfoChain(__name__).add_a_reader(
17+
relative_plugin_class_path='xlsbr.XLSBBook',
18+
file_types=[__FILE_TYPE__],
19+
stream_type='binary'
20+
)
21+
22+
def get_data(afile, file_type=None, **keywords):
23+
"""standalone module function for reading module supported file type"""
24+
if isstream(afile) and file_type is None:
25+
file_type = __FILE_TYPE__
26+
return read_data(afile, file_type=file_type, **keywords)

pyexcel_xlsbr/xlsbr.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
"""
2+
pyexcel_xlsbr.xlsbr
3+
~~~~~~~~~~~~~~~~~~~
4+
The lower level xlsb file format handler
5+
:copyright: (c) 2018 by Onni Software Ltd & its contributors
6+
:license: New BSD License
7+
"""
8+
from pyexcel_io._compact import OrderedDict
9+
from pyexcel_io.book import BookReader
10+
from pyexcel_io.sheet import SheetReader
11+
from pyxlsb import open_workbook
12+
13+
14+
class XLSBSheet(SheetReader):
15+
def __init__(self, sheet, auto_detect_int=True,
16+
auto_detect_float=True,
17+
auto_detect_datetime=True,
18+
**keywords):
19+
SheetReader.__init__(self, sheet, **keywords)
20+
self.__auto_detect_int = auto_detect_int
21+
self.__auto_detect_float = auto_detect_float
22+
self.__auto_detect_datetime = auto_detect_datetime
23+
24+
@property
25+
def name(self):
26+
return self._native_sheet.name
27+
28+
def row_iterator(self):
29+
return self._native_sheet.rows()
30+
31+
def column_iterator(self, row):
32+
for cell in row:
33+
yield self.__convert_cell(cell)
34+
35+
def __convert_cell(self, cell):
36+
return cell.v
37+
38+
39+
class XLSBBook(BookReader):
40+
def open(self, file_name, **keywords):
41+
BookReader.open(self, file_name, **keywords)
42+
self._load_from_file()
43+
44+
def read_sheet_by_name(self, sheet_name):
45+
sheet = self._native_book.get_sheet(sheet_name)
46+
sheet.name = sheet_name
47+
return self.read_sheet(sheet)
48+
49+
def read_sheet_by_index(self, sheet_index):
50+
sheet = self._native_book.get_sheet(sheet_index)
51+
sheet.name = self._native_book.sheets[sheet_index]
52+
return self.read_sheet(sheet)
53+
54+
def read_all(self):
55+
result = OrderedDict()
56+
for sheet_name in self._native_book.sheets:
57+
sheet = self._native_book.get_sheet(sheet_name)
58+
sheet.name = sheet_name
59+
xlsb_sheet = XLSBSheet(sheet, **self._keywords)
60+
result[xlsb_sheet.name] = xlsb_sheet.to_array()
61+
return result
62+
63+
def read_sheet(self, native_sheet):
64+
sheet = XLSBSheet(native_sheet, **self._keywords)
65+
return {sheet.name: sheet.to_array()}
66+
67+
def _load_from_file(self):
68+
self._native_book = open_workbook(self._file_name)

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
pyxlsb
2+
pyexcel-io

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
INSTALL_REQUIRES = [
4040
'pyxlsb',
41+
'pyexcel-io',
4142
]
4243
SETUP_COMMANDS = {}
4344

tests/fixtures/delete-me

Whitespace-only changes.

tests/test_reading.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from datetime import datetime, time
33

44
from nose.tools import eq_
5-
from pyexcel_xlsxr import get_data
5+
from pyexcel_xlsbr import get_data
66
from pyexcel_io._compact import OrderedDict
77

88

0 commit comments

Comments
 (0)
0