Python Pandas: вывод в электронную таблицу ".xls" с превосходным качеством, просто перезаписав выбранный лист - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть две таблицы в формате .xls, у обоих два листа (sheet1 и sheet2).Я пытаюсь переписать «sheet2» в book2.xls на «sheet2» из book1.xls.Я пытаюсь использовать подход панд, и вот мой черновой код,

import pandas as pd

# Open the first spreadsheet
df1 = pd.read_excel('Book1.xls', sheet_name='sheet2')

# Specify the writer file
writer = pd.ExcelWriter('Book2.xls')

# Write output
df1.to_excel(writer, 'sheet2', engine='xlswriter', index=False)

writer.save()

После слияния я ожидаю, что будет обновлен только «sheet2» в book2.xls при сохранении «sheet1».Однако это не так, и book2.xls теперь имеет только «sheet2» и удаляет «sheet1».Я просмотрел несколько ответов ( например, ), и они работают для формата '.xlsx', используя openpyxl.Я ищу решение, которое имеет дело с форматом .xls.Спасибо за вашу помощь.

Кроме того, я бы надеялся, pandas.ExcelWrite иметь одну дополнительную опцию для объединения только указанного листа, вздох!

****************************

Другой подход, который я попробовал, здесь, но я получаю ошибку при объединении листа.

import pandas as pd

# Open the first spreadsheet
df1 = pd.read_excel('Book1.xls')

excelBook = pd.ExcelFile(path+'Book2.xls')
writer = pd.ExcelWriter(path+'Book2.xls')
writer.book = excelBook

writer.sheets = dict((ws.title, ws) for ws in excelBook.sheet_names)

# Add new sheets
df1.to_excel(writer, "Sheet2", index=False)

# Save the file
writer.save()

`AttributeError: 'ExcelFile' object has no attribute 'add_sheet'`

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Вот одно решение, которое работает.Хотя лист объединяется, форматирование и ссылки не связаны со столбцами.Если у кого-то из вас есть лучшее решение, пожалуйста, не стесняйтесь поделиться.Спасибо!

# Read excel file and get dict of sheetname(s), dataframe(s))

# File1
dict_1 = pd.read_excel('Book1.xls', sheet_name=None)

# File2
dict_2 = pd.read_excel('Book2.xls', sheet_name=None)

# Change the worksheet as dataframe
select_df1 = dict_1['Sheet2']

# Assign the selected dataframe to second worksheet
dict_2['Sheet2'] = select_df1

# Write all the sheets from dataframe2 that also has the updated sheet from File1
with pd.ExcelWriter('Book2.xls', 
                    engine='xlwt') as writer:
    # Write Sheets from dataframe2
    for ws_name, df_sheet in dict_2.items():
        df_sheet.to_excel(writer, sheet_name=ws_name, index=0)

writer.save()
writer.close()
0 голосов
/ 23 сентября 2019
import pandas as pd

# Open the BOTH spreadsheets
book1sheet1 = pd.read_excel('Book1.xls', sheet_name='sheet2')
book2sheet1 = pd.read_excel('Book2.xls', sheet_name='sheet1')

# Specify the writer file
writer = pd.ExcelWriter('Book2.xls')

# Write output
book2sheet1.to_excel(writer, 'sheet1', engine='xlswriter', index=False)
book1sheet1.to_excel(writer, 'sheet2', engine='xlswriter', index=False)

writer.save()

Я верю, что это сработает.Вы импортируете как в начале, так и переписываете Book2 Sheet 1, когда запускаете команду to_excel.


Чтобы сохранить листы без загрузки в память, я бы попробовал что-то вроде этого:

import pandas as pd
from openpyxl import load_workbook

path = "Book2.xls"

book = load_workbook(path)
writer = pd.ExcelWriter(path, engine = 'openpyxl')
writer.book = book

# this is the original sheet you wanted to add
df_added = pd.read_excel('Book1.xls', sheet_name='sheet2')


df_added.to_excel(writer, sheet_name = 'Book1Sheet1')

writer.save()
writer.close()
...