Python: Как перебрать DataFrame в поля MailMerge? - PullRequest
0 голосов
/ 28 декабря 2018

Проблема заключается в том, что каждый файл, созданный с использованием метода MailMerge, имеет одинаковые данные поля слияния с первой итерации в цикле i, хотя те же соглашения об индексах, которые называются напечатанными в цикле i [0], будут отображаться правильнотак как я печатаю каждую итерацию, и те же самые индексы используются для именования каждого .docx, как и ожидалось, каждый раз в цикле.

Код:

import pandas as pd
from mailmerge import MailMerge
import numpy as np

df1 = xl.parse('Sheet1')
df2 = pd.DataFrame(df1)
data1 = np.array(df2)
template = "Form_Template.docx"
document = MailMerge(template)   



    for i in data1:
        document.merge(
            Name= i[0],
            Domain= 'fruitcorp.local',
            userid= i[1],
            Password= '*',
            date_ini='{:%d-%b-%Y}_______'.format(date.today()),
            comment='* This is a replacement for a missing original form.            
             Original start date was: ',
            startdate= str(i[3]))
         print(i[0])
         document.write(i[1] + 'Replacement_Account_Acceptance_Form.docx')

Вот отображаемый вывод, которыйЯ получаю:

 In: print(data1):
 Out:[['Apple Jacks' 'ajacks' Timestamp('2015-07-26 18:49:11') '26-Jul-015']
 ['Orange Gladys' 'ogladys' Timestamp('2015-01-05 18:50:38')
  '05-Jan-2015']
 ['Ed Banana' 'ebanana' Timestamp('2017-01-09 18:51:47') '09-Jan-2017']
 ['Kiwi Lime' 'klime' Timestamp('2015-02-09 18:52:42') '09-Feb-2015']
 ['Pie Cheesecake' 'pcheesecake' Timestamp('2011-07-28 14:06:26')
  '28-Jul-2011']]

#iterated properly:

In: for i in data1:
         print(i[0])
Out: Apple Jacks
Orange Gladys
Ed Banana
Kiwi Lime
Pie Cheesecake

Но тот же индексный вызов

i [0]

в поле «Имя» документа.mergeФункция и i [0] аналогично для поля 'userid' приводит к тому, что значение итерации остается в виде метки времени ['Apple Jacks' 'ajacks' ('2015-07-26 18:49:11') '26 -Jul-2015 '] каждая итерация

In: for i in data1:
        document.merge(
           Name= i[0],
           startdate= str(i[3]),
           userid= i[1]))

Out:  Name= Apple Jacks
      startdate= 26-Jul-2015
      userid= ajacks

      Name= Apple Jacks
      startdate= 26-Jul-2015
      userid= ajacks

      Name= Apple Jacks
      startdate= 26-Jul-2015
      userid= ajacks 

      Name= Apple Jacks
      startdate= 26-Jul-2015
      userid= ajacks

      Name= Apple Jacks
      startdate= 26-Jul-2015
      userid= ajacks

Одни и те же данные повторяются каждые (5) раз, а не производят 5 уникальных наборов. Все, о чем я могу думать, - это то, что я неправильно использую индекс DataFrame, когда яМетод MailMerge.

... Вместо этого используйте i [0] [0]?

In: for i in data1:
        document.merge(
           Name= i[0][0],
           startdate= str(i[3][0]),
           userid= i[1][0]))

Out:  Name= A
      startdate= 2
      userid= a

      Name= A
      startdate= 2
      userid= a

      Name= A
      startdate= 2
      userid= a

      Name= A
      startdate= 2
      userid= a

      Name= A
      startdate= 2
      userid= a

(Было бы намного проще получить доступ к моим реляционным данным в виде словаря?) Главный вопрос: как можноЛучше всего, чтобы каждый созданный документ содержал правильные данные поля из каждой итерации цикла, а не каждый из них содержит данные первой строки (все созданные документы содержат: «Apple Jacks, ajacks, 26-Jul-2015» в своих полях слияния)

1 Ответ

0 голосов
/ 29 декабря 2018

Я обнаружил, что проблема заключалась в использовании метода MailMerge перед циклом.Необходимо инициализировать переменную документа каждую итерацию (следовательно, ВНУТРИ) цикла:

from mailmerge import MailMerge
import pandas as pd

df3 = pd.DataFrame(df1, index = range(int(len(df2.index))))
looprange = range(int(len(df3.index)))

for j in looprange:
#The following line was previously before the loop. It MUST be here: 
    document = MailMerge(template)
    document.merge(
        Name= df3.name[j],
        Domain= 'fruitcorp.local',
        userid= df3.SamAccountName[j],
        Password= '*',
        date_ini='{:%d-%b-%Y}_______'.format(date.today()),
        comment='* This is a replacement for a missing original form. 
        Original start date was: ',
        startdate= df3.WhenCreatedFormated[j])
    document.write(df3.SamAccountName[j] + '_Replacement_Account_Acceptance_Form.docx')
...