2015-07-22 1 views
1

В настоящее время я работаю над скриптом, который необходимо записать в файл .docx для целей презентации. Я использую pandas для обработки всех моих вычислений данных в скрипте. Я ищу, чтобы написать рамку данных pandas в таблицу по закладке в файле word.docx, используя PyWIN32. Dataframe состоит из поплавков. Код psuedo - это что-то вроде этого.Написание файла данных pandas на таблицу документов слов через pywin32

frame = DataFrame(np.arange(28).reshape((4,7)), columns=['Text1',...'Text7']) 

С pywin32 ввезенных ...

wordApp = win32.gencache.EnsureDispatch('Word.Application') 
wordApp.Visible = False 
doc = wordApp.Documents.Open(os.getcwd()+'\\template.docx') 
rng = doc.Bookmarks("PUTTABLEHERE").Range 
rng.InsertTable.here 

Теперь я хотел бы создать таблицу на этой закладке. Размеры таблицы должны определяться кадром данных. Мне также хотелось бы, чтобы заголовки столбцов были заголовком в таблице Word.

+1

Хотя это не является прямым ответом на ваш вопрос, вы можете рассмотреть возможность экспорта в электронную таблицу Excel (у pandas DataFrames есть [to_excel()] (http://pandas.pydata.org/pandas-docs /stable/generated/pandas.DataFrame.to_excel.html) и вставка итоговой таблицы в ваш документ. – brenns10

+0

Возможно, вы не сможете автоматизировать весь процесс (я совершенно незнакомый с PyWin32), но это своего рода расход на использование приложений Windows и GUI. – brenns10

+1

Стоит отметить, что при работе с pywin32 это во многих случаях не позволит вам загружать более 2 ГБ данных в память, что иногда является проблемой при использовании pandas. Это связано с тем, что в Windows это 32-битный процесс, и по умолчанию эти процессы часто ограничиваются 2 ГБ. – firelynx

ответ

3

В принципе, все, что вам нужно сделать, это создать таблицу в слове и заполнить значение каждой ячейки из соответствующих значений кадра данных

# data frame 
df= DataFrame(np.arange(28).reshape((4,7)), columns=['Text1',...'Text7']) 

wordApp = win32.gencache.EnsureDispatch('Word.Application') 
wordApp.Visible = False 
doc = wordApp.Documents.Open(os.getcwd()+'\\template.docx') 
rng = doc.Bookmarks("PUTTABLEHERE").Range 

# creating Table 
# add one more row in table at word because you want to add column names as header 
Table=rng.Tables.Add(rng,NumRows=df.shape[0]+1,NumColumns=df.shape[1]) 

for col in range(df.shape[1]):   
    # Writing column names 
    Table.Cell(1,col+1).Range.Text=str(df.columns[col]) 
    for row in range(df.shape[0]): 
     # writing each value of data frame 
     Table.Cell(row+1+1,col+1).Range.Text=str(df.iloc[row,col]) 

Обратите внимание, что Table.Cell(row+1+1,col+1) был добавлены два из них здесь. Причина заключается в том, что таблица в Microsoft Word начинает индексирование с 1. Итак, как строка, так и столбец должны быть добавлены 1, потому что индексирование фрейма данных в pandas начинается с 0.

Еще 1 добавлен в строку, чтобы предоставить пространство для кадра данных столбцы как заголовки. Это должно сделать это!

Смежные вопросы