gpt4 book ai didi

python - XlsxWriter 和 Python 继承

转载 作者:太空狗 更新时间:2023-10-30 02:42:03 25 4
gpt4 key购买 nike

我刚开始使用 XlsxWriter,我想编写自己的方法来简化编写 excel,因为我拥有的数据或多或少总是具有相同的格式。

我想完全透明地编写一个继承 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 添加方法?我不知道如何优雅地解决这个问题。也许有办法,也许我一开始就走错了路。

最佳答案

我采用了一种稍微不同的方法,它运行良好,足以在网络应用程序中生成 xls 输出。

我没有覆盖 xlswriter 的东西,而是开发了一个与我正在尝试做的事情相匹配的 Facade 对象,然后调用底层的 xlswriter Assets 来完成工作。

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。

哦,除了基于声明的更改之外,我会在新实现中立即更改的一件事是在 Json 文件中存储格式常量,如背景颜色#F5F5F5,并在初始化时将其传递给 ExcelWriter:

类似于:

self.fmt_title.set_bg_color(
self.j_config.get("fmt_title",{}).get("bg_color", "F5F5F5")
)

关于 OP 关于必须传入变量的评论,这里有一些更新的函数定义作为可能的解决方法。

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)

关于python - XlsxWriter 和 Python 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37749443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com