1

在我的工作中,我收到 PDF 文件中的订单,而我需要将它们重写到 Excel 表格中。Excel 文件和 PDF 文件每次都有精确的结构,不会改变,所以我决定自动化这个过程并创建 python 脚本来为我做这件事。

目前,我即将结束,我只需要将最后一个数据写入 excel 文件,但我遇到了严重的问题,非常严重,我可能需要重写/重新设计我的一半代码(大约有 500 行 atm )。

“问题”是,我将代码分成 3 个文件:

  • main(我正在执行的那个)
  • 函数(存储所有复杂的逻辑函数)
  • config(存储常量和配置的地方)

然而,问题是,我在 xlsxwritter 的主文件构造函数中有创建 Excel 文件和工作表。

正是这个:

# Creation of new EXCEL file
xlsx_file = 'Red_vyplaty_' + termin_file + '.xlsx'
print 'Creating excel file "%s"' % xlsx_file
excel_file = xlsxwriter.Workbook(xlsx_file)

# Adding sheet, called "Listky_obce_nad_300"
obce_nad_300_sheet = excel_file.add_worksheet('Listky_obce_nad_300')
print 'Adding data sheet "Listky_obce_nad_300" into "%s"' % (xlsx_file)
obce_nad_300_sheet.set_column(0, 0, 2)
obce_nad_300_sheet.set_column(1, 1, 2)

但是,我需要(或者想要更准确)在函数文件中创建一个函数,该函数将有一个输入,并基于这个输入,它将从 config-constants 文件中获取数据,并将它们写入此工作表(obce_nad_300_sheet )。

问题是,如果我创建如下函数:

def create_footer(suma_cell, starting_row, flag):
    """
    Function to creade footer of listok
    flag = 0 / 1 / 2 (data sheet where to write header)
    """
    obce_nad_300_sheet.write(row, 4, 'Test')

它会(显然)抛出异常,全局变量 obce_nad_300_sheet 不存在,bla bla bla ..我相信你们都知道:)

我知道,我有两种解决方法:

  1. 将整个创建、添加和写入工作表从 main.py 移动到 functions.py
    • 可以,但是,这对我来说工作量太大了,而且这些新函数中的大多数只会调用一个 xlsxwritter 函数,所以有点浪费时间
  2. 在 main.py 文件中创建这些新函数
    • 虽然我不确定它是否会起作用,但我敢肯定,在 function.py 文件中包含一些函数,而在 main.py 文件中包含其他函数,这将是完全丑陋的,并且违反了我的清晰代码规则。

但是我想要第三个选项,我还不知道,并且既简单又“好”???:)

PS:不,xlsxWritter 无法打开/读取 excel 文件,它只能创建一个新文件,所以如果我在函数中定义它,它将重写我之前写入文件的所有内容。

4

1 回答 1

1

我觉得你的代码组织得不是很好。不用太麻烦,我会用obce_nad_300_sheet它作为一个对象来移动它。像这样:

def create_footer(sheet, suma_cell, starting_row, flag):
    """
    Function to creade footer of listok
    flag = 0 / 1 / 2 (data sheet where to write header)
    """
    sheet.write(row, 4, 'Test')

但是我不知道图书馆是如何工作的。write它是否通过调用或之后需要某种 a saveorcommit方法来“提交”更改?


在不太了解您的情况或库的情况下,我可能会创建一个继承自 的对象xlsxwriter.Workbook,将工作表存储在该对象的属性中(可能是 dict {"sheet_name": WorkSheet})并在对象中编写方法。它可能看起来像这样:

class MyWorksheet(xlsxwriter.Workbook):

    def __init__(self, *args, **kwargs):
        [...]
        super(MyWorksheet, self).__init__(*args, **kwargs)
        self.sheets = {}
        [...]

    def add_worksheet(self, name):
        [...]
        self.sheets[name] = super(MyWorksheet, self).add_worksheet(name)
        [...]

    def create_footer(self, sheet_name, suma_cell, starting_row, flag):
        [...]
        self.sheets[sheet_name].write(row, 4, "Test")
        [...]

然后在你所说的main文件中做:

my_sheet = MyWorksheet()
my_sheet.add_worksheet("Listky_obce_nad_300")

my_sheet.create_footer("Listky_obce_nad_300", suma, starting, flag)
于 2014-08-19T21:22:14.867 回答