首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XlsxWriter和Python继承

XlsxWriter和Python继承
EN

Stack Overflow用户
提问于 2016-06-10 21:24:28
回答 2查看 437关注 0票数 4

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

我想要完全透明地编写一个继承XlsxWriter的模块,对于那些不需要我的方法的人来说,使用我的模块与直接使用XlsxWriter是相同的,而如果在某个点上需要我的方法,可以使用它,而不需要任何代码更改或添加更多在同一文件/对象中工作的对象。

所以我开始写一个模块:

代码语言:javascript
复制
import xlsxwriter

class XlsxMaster(xlsxwriter.Workbook):

    def __init__(self, filename):
        super(XlsxMaster, self).__init__(filename)

    def write_results(self):
        print "write results"

然后我可以使用:

代码语言:javascript
复制
from xlsx_Master import XlsxMaster

workbook = XlsxMaster('./Expenses01.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write_results()

问题是这不起作用,因为工作表对象是从xlsxwriter.worksheet派生的,而不是从我的模块派生的,它可以通过workbook.write_results()正确调用,但这不是我想要的。如何以这种方式向xlsxwriter.worksheet添加方法?我不知道如何优雅地解决这个问题。也许有一种方法,或者我从一开始就走错了路。

EN

回答 2

Stack Overflow用户

发布于 2016-06-11 00:26:42

我采用了一种稍微不同的方法,它工作得足够好,可以在web应用程序中生成xls输出。

我并没有重写xlswriter的东西,而是开发了一个与我想要做的事情相匹配的Facade对象,然后调用底层的xlswriter资产来完成工作。

代码语言:javascript
复制
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:

类似于:

代码语言:javascript
复制
self.fmt_title.set_bg_color(
    self.j_config.get("fmt_title",{}).get("bg_color", "F5F5F5")
    )

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

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2016-06-10 22:44:57

write_results是一个工作表的方法,所以你也必须创建一个继承自Worksheet的类。在那里您将能够编写您的write_results。并且您必须重新实现创建工作表的方法。查看代码,它是_add_sheet

不优雅,我很抱歉,但这就是你要问的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37749443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档