def run(self, tableObj): # Import openpyxl "lazy" to prevent global dependency from openpyxl.workbook import Workbook from openpyxl.writer.dump_worksheet import ExcelDumpWriter wb = Workbook(optimized_write=True) ws = wb.create_sheet() ws.append( ([""] if tableObj.rowNamesRequired else []) + map(unicode, list(tableObj.getColumns()))) # write column names for row in tableObj.getRows(): values = [unicode(row)] if tableObj.rowNamesRequired else [] values += [ tableObj.getValue(row, column) for column in tableObj.getColumns() ] ws.append(values) writer = ExcelDumpWriter(wb) # need to do a little bit more work here, since the openpyxl library only supports writing to a filename, while we need a buffer here.. #buffer = StringIO() buffer = io.BytesIO() zf = zipfile.ZipFile(buffer, 'w', zipfile.ZIP_DEFLATED) writer.write_data(zf) zf.close() buffer.flush() return buffer.getvalue()
def to_bytes(self, table, **kargs): # Import openpyxl "lazy" to prevent global dependency def val(x): return x if x is None else unicode(x) from openpyxl.workbook import Workbook from openpyxl.writer.dump_worksheet import ExcelDumpWriter wb = Workbook(optimized_write = True) ws = wb.create_sheet() cols = list(table.getColumns()) ws.append([val(col) for col in cols]) for row in table.getRows(): ws.append([val(table.getValue(row, col)) for col in cols]) writer = ExcelDumpWriter(wb) # need to do a little bit more work here, since the openpyxl library only supports writing to a filename, while we need a buffer here.. # (and we can't stream directly as zipfile needs a seekable buffer) stream = StringIO() zf = zipfile.ZipFile(stream, 'w', zipfile.ZIP_DEFLATED) writer.write_data(zf) zf.close() return stream.getvalue()
def to_bytes(self, table, **kargs): # Import openpyxl "lazy" to prevent global dependency def val(x): return x if x is None else unicode(x) from openpyxl.workbook import Workbook from openpyxl.writer.dump_worksheet import ExcelDumpWriter wb = Workbook(optimized_write=True) ws = wb.create_sheet() cols = list(table.getColumns()) ws.append([val(col) for col in cols]) for row in table.getRows(): ws.append([val(table.getValue(row, col)) for col in cols]) writer = ExcelDumpWriter(wb) # need to do a little bit more work here, since the openpyxl library only supports writing to a filename, while we need a buffer here.. # (and we can't stream directly as zipfile needs a seekable buffer) stream = StringIO() zf = zipfile.ZipFile(stream, "w", zipfile.ZIP_DEFLATED) writer.write_data(zf) zf.close() return stream.getvalue()
def _save_virtual_workbook(self): """ Return an in-memory workbook, suitable for a Django response. NOTE: Fixes openpyxl.writer.excel.save_virtual_workbook() for optimized workbooks. Package function uses ExcelWriter instead of ExcelDumpWriter with no way of specifying it. Had to copy the function and change which Writer it used. """ writer = ExcelDumpWriter(self.workbook) temp_buffer = BytesIO() try: archive = ZipFile(temp_buffer, 'w', ZIP_DEFLATED) writer.write_data(archive) finally: archive.close() virtual_workbook = temp_buffer.getvalue() temp_buffer.close() return virtual_workbook
def to_bytes(self, table, **kargs): wb = Workbook(optimized_write=True) ws = wb.create_sheet() # Determine columns. We may need an extra (first) column which 'names' the row columns = list(map(unicode, list(table.getColumns()))) if table.rowNamesRequired: columns.insert(0, u"") ws.append(columns) # Write rows to worksheet for row in table.getRows(): ws.append(tuple(_get_values(table, row))) writer = ExcelDumpWriter(wb) # Need to do a little bit more work here, since the openpyxl library only # supports writing to a filename, while we need a buffer here.. buffer = io.BytesIO() with zipfile.ZipFile(buffer, 'w', zipfile.ZIP_DEFLATED) as zf: writer.write_data(zf) return buffer.getvalue()
def to_bytes(self, table, **kargs): # Import openpyxl "lazy" to prevent global dependency from openpyxl.workbook import Workbook from openpyxl.writer.dump_worksheet import ExcelDumpWriter wb = Workbook(optimized_write = True) ws = wb.create_sheet() ws.append(([""] if table.rowNamesRequired else []) + map(unicode, list(table.getColumns()))) # write column names for row in table.getRows(): values = [unicode(row)] if table.rowNamesRequired else [] values += [table.getValue(row, column) for column in table.getColumns()] ws.append(values) writer = ExcelDumpWriter(wb) # need to do a little bit more work here, since the openpyxl library only supports writing to a filename, while we need a buffer here.. #buffer = StringIO() buffer = io.BytesIO() zf = zipfile.ZipFile(buffer, 'w', zipfile.ZIP_DEFLATED) writer.write_data(zf) zf.close() buffer.flush() return buffer.getvalue()