migrated pyexcel-xls to pyexcel-io 0.2.0

This commit is contained in:
chfw 2016-03-17 09:07:54 +00:00
parent ac18f8edf5
commit e93a79e7b8
4 changed files with 79 additions and 69 deletions

View File

@ -13,14 +13,17 @@ import xlrd
from xlwt import Workbook, XFStyle
from pyexcel_io import (
SheetReader,
BookReader,
SheetWriter,
BookWriter,
isstream,
get_data as read_data,
store_data as write_data
)
from pyexcel_io.base import NewBookReader, NewWriter
PY2 = sys.version_info[0] == 2
if PY2 and sys.version_info[1] < 7:
from ordereddict import OrderedDict
else:
from collections import OrderedDict
DEFAULT_DATE_FORMAT = "DD/MM/YY"
@ -102,51 +105,62 @@ class XLSheet(SheetReader):
return value
class XLBook(BookReader):
class XLSBook(NewBookReader):
"""
XLSBook reader
It reads xls, xlsm, xlsx work book
"""
def __init__(self, filename, file_content=None,
sheetname=None, **keywords):
BookReader.__init__(self, filename,
file_content=file_content,
sheetname=sheetname, **keywords)
self.native_book.release_resources()
def __init__(self):
NewBookReader.__init__(self, 'xls')
self.file_stream = None
self.file_name = None
self.book = None
def sheet_iterator(self):
"""Return iterable sheet array"""
def close(self):
if self.book:
self.book.release_resources()
if self.sheet_name is not None:
try:
sheet = self.native_book.sheet_by_name(self.sheet_name)
return [sheet]
except xlrd.XLRDError:
raise ValueError("%s cannot be found" % self.sheet_name)
elif self.sheet_index is not None:
return [self.native_book.sheet_by_index(self.sheet_index)]
def load_from_stream(self, file_stream):
self.file_stream = file_stream
def load_from_file(self, file_name):
self.file_name = file_name
def read_sheet_by_index(self, sheet_index):
self.book = self._get_book(on_demand=True)
sheet = self.book.sheet_by_index(sheet_index)
xlsheet = XLSheet(sheet)
return {sheet.name: xlsheet.to_array()}
def read_sheet_by_name(self, sheet_name):
self.book = self._get_book(on_demand=True)
try:
sheet = self.book.sheet_by_name(sheet_name)
except xlrd.XLRDError as e:
print(e)
raise ValueError("%s cannot be found" % sheet_name)
xlsheet = XLSheet(sheet)
return {sheet.name: xlsheet.to_array()}
def read_all(self):
result = OrderedDict()
self.book = self._get_book()
for sheet in self.book.sheets():
xlsheet = XLSheet(sheet)
result[sheet.name] = xlsheet.to_array()
return result
def _get_book(self, on_demand=False):
if self.file_name:
xls_book = xlrd.open_workbook(self.file_name, on_demand=on_demand)
else:
return self.native_book.sheets()
def get_sheet(self, native_sheet):
"""Create a xls sheet"""
return XLSheet(native_sheet)
def load_from_memory(self, file_content, **keywords):
"""Provide the way to load xls from memory"""
on_demand = False
if self.sheet_name is not None or self.sheet_index is not None:
on_demand = True
return xlrd.open_workbook(None, file_contents=file_content.getvalue(),
on_demand=on_demand)
def load_from_file(self, filename, **keywords):
"""Provide the way to load xls from a file"""
on_demand = False
if self.sheet_name is not None or self.sheet_index is not None:
on_demand = True
return xlrd.open_workbook(filename, on_demand=on_demand)
xls_book = xlrd.open_workbook(
None,
file_contents=self.file_stream.getvalue(),
on_demand=on_demand
)
return xls_book
class XLSheetWriter(SheetWriter):
@ -192,34 +206,28 @@ class XLSheetWriter(SheetWriter):
self.current_row += 1
class XLWriter(BookWriter):
class XLSWriter(NewWriter):
"""
xls, xlsx and xlsm writer
"""
def __init__(self, file, encoding='ascii',
style_compression=2, **keywords):
"""Initialize a xlwt work book
def __init__(self):
NewWriter.__init__(self, 'xls')
self.work_book = None
:param encoding: content encoding, defaults to 'ascii'
:param style_compression: undocumented, but 2 is magically
better
reference: `style_compression <https://groups.google.com/
forum/#!topic/python-excel/tUZkMRi8ITw>`_
"""
BookWriter.__init__(self, file, **keywords)
self.wb = Workbook(style_compression=style_compression,
def open(self, file_name,
encoding='ascii', style_compression=2, **keywords):
NewWriter.open(self, file_name, **keywords)
self.work_book = Workbook(style_compression=style_compression,
encoding=encoding)
def create_sheet(self, name):
"""Create a xlwt writer"""
return XLSheetWriter(self.wb, None, name)
return XLSheetWriter(self.work_book, None, name)
def close(self):
"""
This call actually save the file
"""
self.wb.save(self.file)
self.work_book.save(self.file_alike_object)
def get_data(afile, file_type=None, **keywords):
@ -235,7 +243,7 @@ def save_data(afile, data, file_type=None, **keywords):
def extend_pyexcel(ReaderFactory, WriterFactory):
ReaderFactory.add_factory("xls", XLBook)
ReaderFactory.add_factory("xlsm", XLBook)
ReaderFactory.add_factory("xlsx", XLBook)
WriterFactory.add_factory("xls", XLWriter)
ReaderFactory.add_factory("xls", XLSBook)
ReaderFactory.add_factory("xlsm", XLSBook)
ReaderFactory.add_factory("xlsx", XLSBook)
WriterFactory.add_factory("xls", XLSWriter)

View File

@ -1,7 +1,6 @@
from base import PyexcelMultipleSheetBase
import pyexcel
import os
from pyexcel.ext import xls
from nose.tools import raises
import sys
@ -50,10 +49,11 @@ class TestAddBooks:
self._write_test_file(self.testfile2)
def test_load_a_single_sheet(self):
b1 = pyexcel.load_book(self.testfile, sheet_name="Sheet1")
b1 = pyexcel.get_book(file_name=self.testfile, sheet_name="Sheet1")
assert len(b1.sheet_names()) == 1
assert b1['Sheet1'].to_array() == self.content['Sheet1']
def test_load_a_single_sheet2(self):
b1 = pyexcel.load_book(self.testfile, sheet_index=2)
assert len(b1.sheet_names()) == 1
@ -61,11 +61,11 @@ class TestAddBooks:
@raises(IndexError)
def test_load_a_single_sheet3(self):
pyexcel.load_book(self.testfile, sheet_index=10000)
pyexcel.get_book(file_name=self.testfile, sheet_index=10000)
@raises(ValueError)
def test_load_a_single_sheet4(self):
pyexcel.load_book(self.testfile, sheet_name="Not exist")
pyexcel.get_book(file_name=self.testfile, sheet_name="Not exist")
def test_delete_sheets(self):
b1 = pyexcel.load_book(self.testfile)

View File

@ -1,7 +1,6 @@
import os
import sys
import pyexcel
from pyexcel.ext import xls
if sys.version_info[0] < 3:
from StringIO import StringIO
else:
@ -11,7 +10,7 @@ from base import create_sample_file1
class TestStringIO:
def test_ods_stringio(self):
def test_xlss_stringio(self):
odsfile = "cute.xls"
create_sample_file1(odsfile)
with open(odsfile, "rb") as f:

View File

@ -1,5 +1,5 @@
import os
from pyexcel.ext import xls
from pyexcel_xls import XLSWriter, XLSBook
from base import PyexcelWriterBase, PyexcelHatWriterBase
@ -11,11 +11,14 @@ class TestNativeXLWriter:
"Sheet3": [[u'X', u'Y', u'Z'], [1, 4, 7], [2, 5, 8], [3, 6, 9]]
}
self.testfile = "xlwriter.xls"
writer = xls.XLWriter(self.testfile)
writer = XLSWriter()
writer.open(self.testfile)
writer.write(self.content)
writer.close()
reader = xls.XLBook(self.testfile)
content = reader.sheets()
reader = XLSBook()
reader.open(self.testfile)
content = reader.read_all()
reader.close()
for key in content.keys():
content[key] = list(content[key])
assert content == self.content