如何使用 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
我有一个装满 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