我采取了一种稍微不同的方法,它的工作方式足以在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我写的代码类型。我的网络应用程序的正常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")
)
关于老年退休金计划有关具有变量传递发表评论,这里有一些更新的功能DEFS作为一个可能的解决方法。
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)
我认为这是一个解决方案,但它会占用大量的工作,因为这是第一个障碍,我相信我会找到许多别人的时候我会用图表,格式等..我仍然希望有另一种解决方案,而不是创建其他类并重写现有的方法来添加新的方法,也许我将不得不面对严酷的事实,没有别的方法 –