使用方法/函数格式化xlsx writer

Aji*_*jit 7 python python-3.x pandas xlsxwriter

我正在尝试动态设置和编写excel文件.这是我的代码

import pandas as pd
import copy

class OutputWriter(object):

    def __init__(self, fmt_func, sheet_name='data'):
        '''
        Initializing...
        '''
        # NOTICE: Initialising with path set None since I do not know path yet
        wrt = pd.ExcelWriter(None, engine='xlsxwriter')
        self._writer = fmt_func(wrt, sheet_name)
        self._sheet_name = sheet_name

    def save(self, df, o_path):
        '''
        Save the file to a path
        '''
        # setting path in writer before saving
        self._writer.path = o_path
        df.to_excel(self._writer, sheet_name=self._sheet_name)
        self._writer.save()

# Change first row color to blue
def fmt_func_blue(wrt, sheet_name):
    # ERROR Cannot clone `wrt` path is not set
    writer = copy.deepcopy(wrt)
    sheet = writer.sheets[sheet_name]
    workbook = writer.book

    # Proceed to color first row blue
    header_fmt = workbook.add_format({
        'text_wrap': True,
        'bg_color': '#191970',
        'font_color': '#FFFFFF',
    })
    header_fmt.set_align('center')
    header_fmt.set_align('vcenter')
    sheet.set_row(0, None, header_fmt)
    return writer

# Change first row color to red 
def fmt_func_red(wrt, sheet_name):
    writer = copy.deepcopy(wrt)
    # I haven't saved the excel file so there are no sheets
    sheet = writer.sheets[sheet_name]
    workbook = writer.book

    # Proceed to color first row red
    header_fmt = workbook.add_format({
        'text_wrap': True,
        'bg_color': '#FF2200',
        'font_color': '#FFFFFF',
    })
    header_fmt.set_align('center')
    header_fmt.set_align('vcenter')
    sheet.set_row(0, None, header_fmt)
    return writer

writer_red = OutputWriter(fmt_func_red, sheet_name='red')
writer_blue = OutputWriter(fmt_func_blue, sheet_name='blue')
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

1)我无法在样式函数中克隆xlwriter对象

2)当我尝试设置excel文件的样式时,我的工作簿中没有工作表.

有什么方法可以让我的工作吗?

kaz*_*aza 2

1)我无法在样式函数中克隆 xlwriter 对象

人们将无法克隆尚不存在的工作簿(或者刚刚创建的工作簿中没有任何价值,这里通过 if 路径扩展检查其价值)。让我们对抛出的错误采取行动,更改:-

def fmt_func_blue(wrt, sheet_name):
    # ERROR Cannot clone `wrt` path is not set
    writer = copy.deepcopy(wrt)
Run Code Online (Sandbox Code Playgroud)

def fmt_func_blue(wrt, sheet_name):
    # ERROR Cannot clone `wrt` path is not set
    writer=wrt
    if writer.book.filename:
      writer = copy.deepcopy(wrt)
    else:
      # Any changes to the new workbook will be reflected on the new 
      # workbook of the writer(created in init) not on a copy.
      # If you want your class init writer untouched, 
      # and want to format a completely new instance of workbook, recreate 
      # a new writer and assign it to the local writer here.
      print('Warning: Working with new workbook')#or use log
Run Code Online (Sandbox Code Playgroud)

这应该可以解决这个问题,请记住,不克隆完全空的工作簿是可以的。但是,如果对于某些设计您需要这样做,那么您自己创建一个克隆,即您自己创建一个完全空的工作簿,就像您在 init 中所做的那样。

2) 当我尝试设置 Excel 文件的样式时,我的工作簿中没有工作表。

那么,人们无法格式化尚不存在的工作表。因此,只需创建一个并稍后将数据框(或任何其他)数据填充到已格式化的工作表中即可。我建议进行如下更改:-

# I haven't saved the excel file so there are no sheets
sheet = writer.sheets[sheet_name]
Run Code Online (Sandbox Code Playgroud)

sheet=None
if sheet_name in writer.sheets:
  sheet = writer.sheets[sheet_name]
else:
  print('Warning: Creating new sheet for formatting <'+sheet_name+'>') # or use log
  sheet= workbook.add_worksheet(sheet_name)
Run Code Online (Sandbox Code Playgroud)

工作代码在这里。当您尝试运行它时,将需要一些时间来安装库。我为故障安全性做了一些更改,并在示例代码中更改了一些方法。

我的示例代码的输出如下:-

Warning: Working with new workbook
Warning: Creating new sheet for formatting <red>
Warning: Working with new workbook
Warning: Creating new sheet for formatting <blue>
Run Code Online (Sandbox Code Playgroud)