我刚刚开始使用XlsxWriter,我想编写自己的方法来简化excels的编写,因为我拥有的数据或多或少都具有相同的格式。
我想要完全透明地编写一个继承XlsxWriter的模块,对于那些不需要我的方法的人来说,使用我的模块与直接使用XlsxWriter是相同的,而如果在某个点上需要我的方法,可以使用它,而不需要任何代码更改或添加更多在同一文件/对象中工作的对象。
所以我开始写一个模块:
import xlsxwriter
class XlsxMaster(xlsxwriter.Workbook):
def __init__(self, filename):
super(XlsxMaster, self).__init__(filename)
def write_results(self):
print "write results"然后我可以使用:
from xlsx_Master import XlsxMaster
workbook = XlsxMaster('./Expenses01.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write_results()问题是这不起作用,因为工作表对象是从xlsxwriter.worksheet派生的,而不是从我的模块派生的,它可以通过workbook.write_results()正确调用,但这不是我想要的。如何以这种方式向xlsxwriter.worksheet添加方法?我不知道如何优雅地解决这个问题。也许有一种方法,或者我从一开始就走错了路。
发布于 2016-06-11 00:26:42
我采用了一种稍微不同的方法,它工作得足够好,可以在web应用程序中生成xls输出。
我并没有重写xlswriter的东西,而是开发了一个与我想要做的事情相匹配的Facade对象,然后调用底层的xlswriter资产来完成工作。
import xlsxwriter
class ExcelWriter(object):
def getColFormatInfo(self, fieldname):
#some app-specific stuff...
f = FieldFormat.factory(self.rdb, fieldname)
# width = 30
label = f.SHORTNAME
width = max(f.LENGTH, len(label))
return width, label
def __init__(self, rdb, title):
self.rdb = rdb
self.fnp = "/tmp/%s.xlsx" % (title)
wb = self.workbook = xlsxwriter.Workbook(self.fnp)
#http://xlsxwriter.readthedocs.org/en/latest/format.html#set_bg_color
self.fmt_title = wb.add_format(dict(bold=True))
self.fmt_title.set_bg_color("#F5F5F5")
self.fmt_title.set_border(1)
self.fmt_colheader = wb.add_format(dict(bold=True))
self.fmt_colheader.set_bottom(2)
self.fmt_link = wb.add_format({'color': 'blue', 'underline': 1})
def add_worksheet(self, wsname):
return self.workbook.add_worksheet(wsname)
def write_title(self, ws, row, col, s):
ws.write(row, col, s, self.fmt_title)
def write_colheader(self, ws, row, col, s):
ws.write(row, col, s, self.fmt_colheader)
def write(self, ws, row, col, s):
ws.write(row, col, s)
def write_url(self, ws, row, col, url, s):
ws.write_url(row, col, url, self.fmt_link, s)正如您所看到的,我所做的就是预先计算一些xls格式,并在write_colheader.之类的东西中使用它们
但是,您可以将这种方法推广到创建更用户友好的简单函数,以便在幕后执行复杂的xlswriter操作。
我找不到我用来与它交互的代码,但它工作得足够好。唯一的问题是,这是我写的大量手动将xyz设置为1,13类型的代码。我的web应用程序的普通html端使用django-tables2来生成html,而且代码要少得多。
因此,我的计划是回去重写报告,使其更具声明性,并使用报告前端来处理传递给ExcelWriter的所有细节命令-我仍然希望ExcelWriter具有大致相同的API。
哦,除了基于声明的更改之外,在新实现中我会立即更改的一件事是将格式常量(如背景颜色#F5F5F5 )存储在Json文件中,并在初始化时将其传递给ExcelWriter:
类似于:
self.fmt_title.set_bg_color(
self.j_config.get("fmt_title",{}).get("bg_color", "F5F5F5")
)关于必须传入变量的操作注释,这里有一些更新的函数定义作为可能的解决方法。
def add_worksheet(self, wsname):
ws = self.current_ws = self.workbook.add_worksheet(wsname)
return ws
#you'd also need to have a set_current_ws function
def write_url(self, row, col, url, s, ws=None, fmt=None):
ws = ws or self.current_ws
fmt = fmt or self.fmt_link
ws.write_url(row, col, url, fmt, s)发布于 2016-06-10 22:44:57
write_results是一个工作表的方法,所以你也必须创建一个继承自Worksheet的类。在那里您将能够编写您的write_results。并且您必须重新实现创建工作表的方法。查看代码,它是_add_sheet
不优雅,我很抱歉,但这就是你要问的。
https://stackoverflow.com/questions/37749443
复制相似问题