首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展xlsxwriter.Worksheet()类

扩展xlsxwriter.Worksheet()类
EN

Stack Overflow用户
提问于 2015-09-18 00:48:18
回答 1查看 479关注 0票数 3

我目前覆盖了名为rpt.Workbook的xlsxwriter.Workbook。我想将方法添加到xlsxwriter.Worksheet(),但由于xlsxwriter.Workbook()导入工作表,不确定如何才能在不发生大的震动的情况下完成此操作。目前,我必须将工作表对象作为参数进行传递。

似乎我需要为xlsxwriter.Workbook()编写重写方法来指向xlsxwriter.Worksheet()的自定义类,但是我不知道如何实现。

下面是当前使用的覆盖rpt.Workbook():

代码语言:javascript
复制
####################################################################
class Workbook(xlsxwriter.Workbook):
####################################################################
    """\nSpreadsheet class provides methods to build a spreadsheet.
    """

    ####################################################################
    def __init__(self,filename=None, options={}):
    ####################################################################
        try:
           filename = rpt.fname(filename)
        except FileNotFoundError as err:
            log.error(err)
        return False
        log.info("Initializing excel file " + filename)
        super().__init__(filename,options)
    ####################################################################
    def add_tab(self,name=None,data=None,header=None,
            srow=0,scol=0,autocol=True):
    ####################################################################
        """\nProvides method to add_worksheet and add_table in 1 call.

             Required Attribute args:
             name = TAB name
             header = list of header names
             data = list of lists for spreadsheet contents

             Optional Attribute args:
                 srow = starting row for table, default 0
                 scol = starting col for table, default 0
                 autocol = True/False, auto set the column sizes

             add_tab also adds the worksheet.header attribute to
             allow the set_col_by_name function to work
        """

        if not data:
            log.warning("data=[][] required")
            return None
        if not header:
            log.warning("header=[] required")
            return False
        columns = []
        for field in header:
            columns.append({ 'header' : field })
        worksheet = self.add_worksheet(name)
        worksheet.header = header
        tableinfo= {
            'data' : data,
            'columns' : columns
            }
        lastcol = scol + (len(header) - 1)
        lastrow = srow + (len(data) + 1)
        worksheet.add_table(srow,scol,lastrow,lastcol,tableinfo)
       #if autocol:
           #self.auto_set_columns(worksheet=worksheet,data=data,scol=scol)
       worksheet.freeze_panes(0,1)
       return worksheet
   ####################################################################
   def auto_set_columns(self,worksheet=None,data=None,header=None,scol=0):
   ####################################################################
        """\nDetermines the max length of each column and then set
              that column width.

             Required Attribute args:
                 worksheet = worksheet object
                 data = list of lists data
             Optional Attribute args:
                 scol = Column start
                 header = row of headers for data list of lists.
                          If header not specified, worksheet
                          must have been created with self.add_tab()
        """
        if not header and worksheet.header:
            header = worksheet.header

        ## table = [] list of lists, combine header and data
        table = []
        table.append(header)        for row in data:
            table.append(row)
        ziptable = list(zip (*table))
        colsizes = []
        for idx,val in enumerate(table[0]):
            size = max(len(s) for s in ziptable[idx])
            colnum = idx + scol
            log.debug("Setting column => {} col size => {} =>  {}".format(colnum,val,size))
            worksheet.set_column(colnum,colnum,size)

我想向xlsxwriter.Worksheet()添加一个名为auto_set_columns()的方法。目前,我必须将工作表对象(worksheet=worksheet)作为对象传递才能使其正常工作。我希望改为使用worksheet.auto_set_columns()。目前,auto_set_columns()是rpt.Workbook的一种方法。

我希望auto_set_columns()成为xlsxwriter.Worksheet的扩展方法。

脚本端的利用率目前看起来是这样的,并且工作正常:

代码语言:javascript
复制
excelfile = nashomes + '/nas_homes.xlsx'
spreadsheet = rpt.Workbook(excelfile)
worksheet = spreadsheet.add_tab(name='Nas Homes',data=hrpt.data,header=hrpt.header)
spreadsheet.auto_set_columns(worksheet=worksheet,data=hrpt.data,scol=0)

我想要的是,注意最后一行的变化:

代码语言:javascript
复制
excelfile = nashomes + '/nas_homes.xlsx'
spreadsheet = rpt.Workbook(excelfile)
worksheet = spreadsheet.add_tab(name='Nas Homes',data=hrpt.data,header=hrpt.header)
worksheet.auto_set_columns(data=hrpt.data,scol=0)

这里需要的目标是工作表对象(即xlsxwriter.Worksheet() )可以有一个扩展的"auto_set_columns“方法。但是,由于工作表对象是从xlsxwriter.Workbook()类中的add_worksheet()方法创建的,因此如果没有主要的覆盖方法来扩展xlsxwriter.Worksheet(),我也不知道如何扩展xlsxwriter.Workbook()。当xlsxwriter.Workbook()创建工作表对象时,如何让Workbook.add_worksheet()引用扩展的xlsxwriter.Worksheet()?

EN

回答 1

Stack Overflow用户

发布于 2015-09-18 01:40:06

在从add_tab返回工作表之前,让猴子修补一下工作表怎么样?

首先,在任何类定义之外创建独立函数:

代码语言:javascript
复制
import types

def auto_set_columns(self,data=None,header=None,scol=0):
    if not header and self.header:
        header = self.header

        ## table = [] list of lists, combine header and data
        table = []
        table.append(header)        
        for row in data:
            table.append(row)
        ziptable = list(zip (*table))
        colsizes = []
        for idx,val in enumerate(table[0]):
            size = max(len(s) for s in ziptable[idx])
            colnum = idx + scol
            print "Setting column => {} col size => {} =>  {}".format(colnum,val,size)
            self.set_column(colnum,colnum,size) 

然后在您的Worksheet.add_tab函数中,在返回之前修补该方法:

代码语言:javascript
复制
    ....
    worksheet.freeze_panes(0,1)
    worksheet.auto_set_columns = types.MethodType( auto_set_columns, worksheet )
    return worksheet

现在您应该能够运行以下命令:

代码语言:javascript
复制
worksheet = spreadsheet.add_tab(name='Nas Homes',data=hrpt.data,header=hrpt.header)
worksheet.auto_set_columns(data=hrpt.data,scol=0)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32635770

复制
相关文章

相似问题

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