首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python从数据集中填充单词合并字段

使用Python从数据集中填充单词合并字段
EN

Stack Overflow用户
提问于 2022-11-03 00:32:46
回答 1查看 38关注 0票数 0

我试图在一个页面("guest_1“、.、"guest_10")中填充一个包含10个合并字段的单词模板,其中包含数据集中的一列。模板可以在这里找到:https://file.io/GVO4hyOwBCiv

我能够使用docx-mailmerge包(请参阅下面的代码# This Works会话)用常量数据填充单词模板,但通过循环数据集(参见下面的# This does not work)来复制结果,没有成功。

我首先需要创建dict类型的对象(在下面的代码中,我将它们称为guests_page_1guests_page_2)。这些dict对象中的每一个都应该有最多10个项(例如{'guest_1': 'Name 1', 'guest_2': 'Name 1'})。因此,数据集(在下面的示例中,guests)应该被分割成多个对象(每个对象最多可以创建10个项),然后使用merge_templates函数将填充的模板复制到多个页面上(取决于数据集的大小)。

下面的示例总结如下:我需要将guests (包含18个名称)数据集拆分为两个类型为dict (guests_page_1guests_page_2)的对象。guests_page_1应该包含前10个名称,guests_page_2应该包含其余8个名称。然后,我需要将guests_page_1guests_page_2添加到merge_templates函数中。

代码语言:javascript
复制
# Requirements: python -m pip install docx-mailmerge

# Import packages
from natsort import natsorted
import os

from mailmerge import MailMerge
import pandas as pd


# Set working directory to user's 'Downloads' folder
os.chdir(os.path.join(os.path.expanduser('~'), 'Downloads'))

# Import template
document = MailMerge('Template.docx')

# Get set of Merge Fields
document_guest_fields = document.get_merge_fields()

# Sort Merge Fields
document_guest_fields = natsorted(document_guest_fields)



## This works

guests_page_1 = {}
guests_page_2 = {}

for i in document_guest_fields:
    guests_page_1[i] = 'Name 1'

for i in document_guest_fields:
    guests_page_2[i] = 'Name 2'

document.merge_templates([guests_page_1, guests_page_2], separator='continuous_section')
document.write('Template-Output.docx')

document.close()



## This does not work

# Create dummy dataset with 18 names
guests = [
    ['Tom'],
    ['Jones'],
    ['Krystal'],
    ['Albert'],
    ['Paloma'],
    ['Shania'],
    ['Max'],
    ['Steve'],
    ['Paul'],
    ['Patrick'],
    ['Lucia'],
    ['Rachel'],
    ['Ray'],
    ['Jessica'],
    ['Julianna'],
    ['Lucille'],
    ['Leandro'],
    ['Vincent'],
    ]

guests = pd.DataFrame(guests, columns = ['name'])


guests_page_1 = {}

for index, row in guests.iterrows():
    for i in document_guest_fields:
        guests_page_1[i] = row['name']

document.merge_templates([guests_page_1], separator='continuous_section')
document.write('Template-Output.docx')

document.close()

有人知道如何解决这个问题吗?提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-11-03 18:08:56

我找到了解决办法:

代码语言:javascript
复制
# Import packages
from natsort import natsorted
import os

from mailmerge import MailMerge
import pandas as pd

# Split dataframe into chunks of up to 10 rows - adapted from: https://stackoverflow.com/a/28882020/9195104
def split_dataframe(df, chunk_size=10000):

    chunks = list()
    num_chunks = len(df) // chunk_size+1

    for i in range(num_chunks):
        chunks.append(df[i*chunk_size:(i+1)*chunk_size])

    for i in range(len(chunks)):
        chunks[i].index = pd.RangeIndex(start=1, stop=len(chunks[i])+1, step=1)
        chunks[i].reset_index(inplace=True, level=0)
        chunks[i] = chunks[i].rename(columns={'index': 'merge_field'})
        chunks[i]['merge_field'] = chunks[i]['merge_field'].astype(str)
        chunks[i]['merge_field'] = chunks[i]['merge_field'].str.replace(r'^(.*)$', r'guest_\1', regex=True)

    return chunks



# Set working directory to user's 'Downloads' folder
os.chdir(os.path.join(os.path.expanduser('~'), 'Downloads'))

# Import template
document = MailMerge('Template.docx')

# Get set of Merge Fields
document_guest_fields = document.get_merge_fields()

# Sort Merge Fields
document_guest_fields = natsorted(document_guest_fields)

# Create dummy dataset with 18 names
guests = [
    ['Tom'],
    ['Jones'],
    ['Krystal'],
    ['Albert'],
    ['Paloma'],
    ['Shania'],
    ['Max'],
    ['Steve'],
    ['Paul'],
    ['Patrick'],
    ['Lucia'],
    ['Rachel'],
    ['Ray'],
    ['Jessica'],
    ['Julianna'],
    ['Lucille'],
    ['Leandro'],
    ['Vincent'],
    ]

guests = pd.DataFrame(guests, columns = ['name'])

# Split guests dataframe
guests = split_dataframe(guests, chunk_size=10)

# Create guests dictionary object
guests_list = {}

for i in range(len(guests)):
    guests_list[i] = dict(zip(guests[i]['merge_field'], guests[i]['name']))

# Fill Word Template file
document.merge_templates(list(guests_list.values()), separator='continuous_section')
document.write('Template-Output.docx')
document.close()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74296988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档