如何使用 openpyxl 增量添加数据?

How do I go about incrementally adding data using openpyxl?

我有一个装满 PDF 的文件夹,我使用 Apache Tika 对其进行了解析,并且我有一个模板 excel 文件,用于从这些 PDF 中收集特定信息并使用 openpyxl 进行存储。

我遇到的问题是循环使用 openpyxl 行。

例如,如果文件夹中只有一个 PDF,则值进入:

#C3、C4、F3、C13、C15、C17

但如果有多个 PDF,则索引仅针对每个额外的 PDF 递增 20 并存储在同一个 excel 文件中,因此对于 2 个 PDF,它将信息存储在:C23、C24 , F24 等等。

import glob, os, fnmatch
from tika import parser
import openpyxl

input_path = "../Input"
template = "../Project/template.xlsm"
output_dir = "../Output"

pdfCounter = len(fnmatch.filter(os.listdir(input_path),'*.pdf'))
print(pdfCounter)

def extract_text(file):
    parsed = parser.from_file(file)
    parsed_text = parsed['content']
    # print(parsed_text)
    return parsed_text

wb = openpyxl.load_workbook(template, read_only=False, keep_vba=True)
sheet = wb.active

input_file = glob.glob(os.path.join(input_path, '*.pdf'))

for file in input_file:
    do_stuff():


sheet['C3'] = value
sheet['C4'] = value2
sheet['F3'] = value3
sheet['C13'] = value4
sheet['C15'] = value5
sheet['C17'] = value6


output_file = os.path.join(output_dir, "report.xlsm")
wb.save(output_file)

我有一个 pdfCounter 可以计算文件夹中 PDF 的数量,我正在尝试找出一种方法来根据它增加索引,或者是否有更好的方法来做到这一点。

我只是不明白如何根据文件中 pdf 的数量循环并将索引增加 20,这样它就不会覆盖与现在相同的内容。

编辑:我无法对此进行测试,但也许它会起作用。我没有遍历等于 pdfCounter 的范围,而是遍历 input_file 中的文件,因此我可以在当前迭代中访问当前文件。 'value' 变量应使用基于当前迭代文件的信息进行更新,然后写入工作表。

input_file = glob.glob(os.path.join(input_path, '*.pdf'))

def get_values(file):
    do_stuff()
    return value, value2, value3, value4, value5, value6

for x,file in enumerate(input_file):
    C = UPPER[2]
    D = UPPER[3]
    F = UPPER[5]
    first_cell = f'{C}{3 + (20 * x)}'
    second_cell = f'{C}{4 + (20 * x)}'
    third_cell = f'{F}{3 + (20 * x)}'
    fourth_cell = f'{C}{13 + (20 * x)}'
    fifth_cell = f'{C}{15 + (20 * x)}'
    sixth_cell = f'{C}{17 + (20 * x)}'

    value, value2, value3, value4, value5, value6 = get_values(file)

    ws[first_cell] = value
    ws[second_cell] = value2
    ws[third_cell] = value3
    ws[fourth_cell] = value4
    ws[fifth_cell] = value5
    ws[sixth_cell] = value6


output_file = os.path.join(output_dir, "report.xlsm")
wb.save(output_file)

原文:

from openpyxl import load_workbook
import openpyxl
from string import ascii_uppercase as UPPER

# file paths

# results from pdfCounter
pdfCounter = 5

# extract your text

# load your workbook
wb = load_workbook()
ws = wb['Sheet1']

# do stuff

for x in range(pdfCounter):
    C = UPPER[2]
    D = UPPER[3]
    F = UPPER[5]
    first_cell = f'{C}{3 + (20 * x)}'
    second_cell = f'{C}{4 + (20 * x)}'
    third_cell = f'{F}{3 + (20 * x)}'
    fourth_cell = f'{C}{13 + (20 * x)}'
    fifth_cell = f'{C}{15 + (20 * x)}'
    sixth_cell = f'{C}{17 + (20 * x)}'

    ws[first_cell] = value
    ws[second_cell] = value2
    ws[third_cell] = value3
    ws[fourth_cell] = value4
    ws[fifth_cell] = value5
    ws[sixth_cell] = value6

您可以使用 f-strings 轻松制作 excel 单元格标识符:为列字母组件创建一个变量,为行号组件创建一个变量,然后在 f-string 中组合,如下所示.对于行号组件,可以将for循环索引与20的乘积加到起始行号上,实现每次迭代增加+20。

为了使其工作,您需要在 for 循环的每次迭代中进行 value、value2 等计算。像这样:

def get_values():
    return value, value2, value3, value4, value5, value6

value, value2, value3, value4, value5, value6 = get_values()

目标单元格的 pdfCounter = 5 的代码输出是:

C3 C4 F3 C13 C15 C17
C23 C24 F23 C33 C35 C37
C43 C44 F43 C53 C55 C57
C63 C64 F63 C73 C75 C77
C83 C84 F83 C93 C95 C97