"""
pyexcel.writers
~~~~~~~~~~~~~~~~~~~
Uniform interface for writing different excel file formats
:copyright: (c) 2014 by C. W.
:license: GPL v3
"""
from utils import to_dict
from readers import GenericSeriesReader
[docs]class ODSWriter:
"""
open document spreadsheet writer
"""
def __init__(self, file):
from odf.opendocument import OpenDocumentSpreadsheet
from odf.table import Table
self.doc = OpenDocumentSpreadsheet()
self.table = Table(name="pyexcel_data")
self.file = file
[docs] def write_row(self, array):
"""
write a row into the file
"""
from odf.table import TableRow, TableCell
from odf.text import P
tr = TableRow()
self.table.addElement(tr)
for x in array:
tc = TableCell()
tc.addElement(P(text=x))
tr.addElement(tc)
[docs] def close(self):
"""
This call writes file
"""
self.doc.spreadsheet.addElement(self.table)
self.doc.write(self.file)
[docs]class CSVWriter:
"""
csv file writer
"""
def __init__(self, file):
import csv
self.f = open(file, "wb")
self.writer = csv.writer(self.f)
[docs] def write_row(self, array):
"""
write a row into the file
"""
self.writer.writerow(array)
[docs] def close(self):
"""
This call close the file handle
"""
self.f.close()
[docs]class XLSWriter:
"""
xls, xlsx and xlsm writer
"""
def __init__(self, file):
import xlwt
self.file = file
self.wb = xlwt.Workbook()
self.ws = self.wb.add_sheet("pyexcel_data")
self.current_row = 0
[docs] def write_row(self, array):
"""
write a row into the file
"""
for i in range(0, len(array)):
self.ws.write(self.current_row, i, array[i])
self.current_row += 1
if self.ws.col(0).width < len(array):
self.ws.col(0).width = len(array)
[docs] def close(self):
"""
This call actually save the file
"""
self.wb.save(self.file)
[docs]class Writer:
"""
Uniform excel writer
It provides one interface for writing ods, csv, xls, xlsx and xlsm
"""
def __init__(self, file):
if file.endswith(".xls") or file.endswith(".xlsx") or file.endswith(".xlsm"):
self.writer = XLSWriter(file)
elif file.endswith(".csv"):
self.writer = CSVWriter(file)
elif file.endswith(".ods"):
self.writer = ODSWriter(file)
else:
raise NotImplementedError("Cannot open %s" % file)
[docs] def write_row(self, array):
"""
Write a row
write a row into the file in memory
"""
self.writer.write_row(array)
[docs] def write_array(self, table):
"""
Write a table
table can be two dimensional array or a row iterator
"""
for row in table:
self.writer.write_row(row)
[docs] def write_dict(self, the_dict):
"""
Write a whole dictionary
series and data will be write into one file
"""
keys = sorted(the_dict.keys())
self.writer.write_row(keys)
max_length = -1
for k in keys:
column_length = len(the_dict[k])
if max_length == -1:
max_length = column_length
elif max_length < column_length:
max_length = column_length
for i in range(0, max_length):
row_data = []
for k in keys:
if i < len(the_dict[k]):
row_data.append(the_dict[k][i])
else:
row_data.append('')
self.writer.write_row(row_data)
[docs] def write_reader(self, reader):
"""
Write a pyexcel reader
In this case, you may use FiterableReader or SeriesReader
to do filtering first. Then pass it onto this function
"""
if isinstance(reader, GenericSeriesReader):
self.write_dict(to_dict(reader))
else:
self.write_array(reader.rows())
[docs] def close(self):
"""
Close the writer
Please remember to call close function
"""
self.writer.close()