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

2024-05-28 20:05:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件夹,里面装满了我用ApacheTika解析的PDF,还有一个模板excel文件,我用它从这些PDF中收集特定信息,并用openpyxl存储

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

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

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

但是,如果有多个PDF,每增加一个PDF,索引就会增加20,并存储在同一个excel文件中,因此有两个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,这样它就不会像现在这样覆盖相同的内容


Tags: 文件pathtextimport文件夹inputoutputpdf
1条回答
网友
1楼 · 发布于 2024-05-28 20:05:59

编辑:我不能测试这个,但也许它会起作用。我不是在等于pdfCounter的范围内循环,而是在input_file中的文件上循环,以便在当前迭代中访问当前文件。“值”变量应根据当前迭代文件的信息进行更新,然后写入工作表

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字符串轻松创建excel单元格标识符:为列字母组件创建一个变量,为行号组件创建一个变量,然后组合到f字符串中,如下所示。对于行号组件,可以将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

相关问题 更多 >

    热门问题