187 lines
5.3 KiB
Python
187 lines
5.3 KiB
Python
"""
|
|
pyexcel.renderer
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
Renders pyexcel.Book and pyexcel.Sheet to any format
|
|
|
|
:copyright: (c) 2015-2025 by Onni Software Ltd.
|
|
:license: New BSD License
|
|
"""
|
|
|
|
from pyexcel import _compact as compact
|
|
|
|
|
|
class AbstractRenderer:
|
|
"""
|
|
Close some functions that will not be used
|
|
"""
|
|
|
|
WRITE_FLAG = "w"
|
|
|
|
def __init__(self, file_type):
|
|
self._file_type = file_type
|
|
self._stream = None
|
|
self._write_title = True
|
|
|
|
def get_io(self):
|
|
"""
|
|
If your renderer's output is binary, please override it and
|
|
return BytesIO instead
|
|
"""
|
|
raise NotImplementedError("No io for this renderer")
|
|
|
|
def render_sheet_to_file(self, file_name, sheet, **keywords):
|
|
"""Render a sheet to a physical file
|
|
|
|
:param file_name: the output file name
|
|
:param sheet: pyexcel sheet instance to be rendered
|
|
:param write_title: to write sheet name
|
|
:param keywords: any other keywords to the renderer
|
|
"""
|
|
raise NotImplementedError("We are not writing to file")
|
|
|
|
def render_sheet_to_stream(self, file_stream, sheet, **keywords):
|
|
"""Render a sheet to a file stream
|
|
|
|
:param file_stream: the output file stream
|
|
:param sheet: pyexcel sheet instance to be rendered
|
|
:param write_title: to write sheet name
|
|
:param keywords: any other keywords to the renderer
|
|
"""
|
|
raise NotImplementedError("We are not writing to file")
|
|
|
|
def render_book_to_file(self, file_name, book, **keywords):
|
|
"""Render a book to a physical file
|
|
|
|
:param file_name: the output file name
|
|
:param book: pyexcel book instance to be rendered
|
|
:param write_title: to write sheet names
|
|
:param keywords: any other keywords to the renderer
|
|
"""
|
|
raise NotImplementedError("We are not writing to file")
|
|
|
|
def render_book_to_stream(self, file_stream, book, **keywords):
|
|
"""Render a book to a file stream
|
|
|
|
:param file_stream: the output file stream
|
|
:param book: pyexcel book instance to be rendered
|
|
:param write_title: to write sheet names
|
|
:param keywords: any other keywords to the renderer
|
|
"""
|
|
raise NotImplementedError("We are not writing to file")
|
|
|
|
|
|
class Renderer(AbstractRenderer):
|
|
"""
|
|
Render pyexcel sheet or book into excel format as any formats
|
|
"""
|
|
|
|
def get_io(self):
|
|
return compact.StringIO()
|
|
|
|
def render_sheet_to_file(
|
|
self,
|
|
file_name,
|
|
sheet,
|
|
write_title=True,
|
|
**keywords,
|
|
):
|
|
self.set_write_title(write_title)
|
|
file_name = compact.get_string_file_name(file_name)
|
|
with open(file_name, self.WRITE_FLAG, encoding="utf-8") as outfile:
|
|
self.set_output_stream(outfile)
|
|
self.render_sheet(sheet, **keywords)
|
|
|
|
def render_sheet_to_stream(
|
|
self,
|
|
file_stream,
|
|
sheet,
|
|
write_title=True,
|
|
**keywords,
|
|
):
|
|
self.set_write_title(write_title)
|
|
self.set_output_stream(file_stream)
|
|
self.render_sheet(sheet, **keywords)
|
|
|
|
def render_book_to_file(
|
|
self,
|
|
file_name,
|
|
book,
|
|
write_title=True,
|
|
**keywords,
|
|
):
|
|
self.set_write_title(write_title)
|
|
with open(file_name, self.WRITE_FLAG, encoding="utf-8") as outfile:
|
|
self.set_output_stream(outfile)
|
|
self.render_book(book, **keywords)
|
|
|
|
def render_book_to_stream(
|
|
self,
|
|
file_stream,
|
|
book,
|
|
write_title=True,
|
|
**keywords,
|
|
):
|
|
self.set_write_title(write_title)
|
|
self.set_output_stream(file_stream)
|
|
self.render_book(book, **keywords)
|
|
|
|
def render_sheet(self, sheet, **keywords):
|
|
"""
|
|
If your renderer is kind of text format, you just
|
|
need to implement this function.
|
|
|
|
:param sheet: pyexcel sheet instance to be rendered
|
|
:param keywords: any other keywords to the renderer
|
|
"""
|
|
raise NotImplementedError("Please render sheet")
|
|
|
|
def render_book(self, book, **keywords):
|
|
"""
|
|
Implementation of book rendering
|
|
|
|
:param book: pyexcel book instance to be rendered
|
|
:param keywords: any other keywords to the renderer
|
|
"""
|
|
number_of_sheets = book.number_of_sheets() - 1
|
|
for index, sheet in enumerate(book):
|
|
self.render_sheet(sheet)
|
|
if index < number_of_sheets:
|
|
self._stream.write("\n")
|
|
|
|
def set_output_stream(self, stream):
|
|
"""update internal stream"""
|
|
self._stream = stream
|
|
|
|
def set_write_title(self, flag):
|
|
"""update write title flag"""
|
|
self._write_title = flag
|
|
|
|
|
|
class BinaryRenderer(Renderer):
|
|
"""
|
|
Renderer pyexcel data into a binary object
|
|
"""
|
|
|
|
WRITE_FLAG = "wb"
|
|
|
|
def get_io(self):
|
|
io = compact.BytesIO()
|
|
return io
|
|
|
|
|
|
# pylint: disable=W0223
|
|
class DbRenderer(AbstractRenderer):
|
|
"""
|
|
Close some functions that will not be used
|
|
"""
|
|
|
|
def get_io(self):
|
|
raise Exception("No io for this renderer")
|
|
|
|
def render_sheet_to_file(self, file_name, sheet, **keywords):
|
|
raise Exception("We are not writing to file")
|
|
|
|
def render_book_to_file(self, file_name, book, **keywords):
|
|
raise Exception("We are not writing to file")
|