Копировать лист Excel с одного листа на другой в Python - PullRequest
0 голосов
/ 20 июня 2019

Все, что я хочу сделать, это скопировать лист из книги Excel в другую книгу Excel на Python.

Я хочу сохранить все форматирование (цветные ячейки, таблицы и т. Д.)

У меня есть несколько файлов Excel, и я хочу скопировать первый лист из всех них в одну рабочую книгу. Я также хочу иметь возможность обновить основную рабочую книгу, если будут внесены изменения в какую-либо из отдельных рабочих книг.

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

Я пробовал панд, но они не поддерживают форматирование и таблицы.

Я пробовал openpyxl безрезультатно

Я думал, что код xlwings ниже будет работать:

import xlwings as xw

wb = xw.Book('individual_files\\file1.xlsx')
sht = wb.sheets[0]
new_wb = xw.Book('Master Spreadsheet.xlsx')
new_wb.sheets["Sheet1"] = sht

Но я просто получаю ошибку:

----> 4 new_wb.sheets["Sheet1"] = sht

AttributeError: __setitem__

"file1.xlsx" выше - это первый пример файла Excel.

"Master Spreadsheet.xlsx" - это моя основная электронная таблица со всеми отдельными файлами.

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

В итоге я сделал это:

def copyExcelSheet(sheetName):

read_from = load_workbook(item)
#open(destination, 'wb').write(open(source, 'rb').read())
read_sheet = read_from.active
write_to = load_workbook("Master file.xlsx")
write_sheet = write_to[sheetName]

for row in read_sheet.rows:
    for cell in row:
        new_cell = write_sheet.cell(row=cell.row, column=cell.column,
                value= cell.value)
        write_sheet.column_dimensions[get_column_letter(cell.column)].width = read_sheet.column_dimensions[get_column_letter(cell.column)].width
        if cell.has_style:
            new_cell.font = copy(cell.font)
            new_cell.border = copy(cell.border)
            new_cell.fill = copy(cell.fill)
            new_cell.number_format = copy(cell.number_format)
            new_cell.protection = copy(cell.protection)
            new_cell.alignment = copy(cell.alignment)

write_sheet.merge_cells('C8:G8')
write_sheet.merge_cells('K8:P8')
write_sheet.merge_cells('R8:S8')

write_sheet.add_table(newTable("table1","C10:G76","TableStyleLight8"))
write_sheet.add_table(newTable("table2","K10:P59","TableStyleLight9"))

write_to.save('Master file.xlsx')
read_from.close

С этим, чтобы проверить, если лист уже существует:

#checks if sheet already exists and updates sheet if it does.
def checkExists(sheetName):
    book = load_workbook("Master file.xlsx")   # open an Excel file and return a workbook

    if sheetName in book.sheetnames:
        print ("Removing sheet",sheetName)
        del book[sheetName]
    else:
        print ("No sheet ",sheetName," found, will create sheet")

    book.create_sheet(sheetName)
    book.save('Master file.xlsx')

с этим для создания новых таблиц:

def newTable(tableName,ref,styleName):
    tableName = tableName + ''.join(random.choices(string.ascii_uppercase + string.digits + string.ascii_lowercase, k=15))
    tab = Table(displayName=tableName, ref=ref)
    # Add a default style with striped rows and banded columns
    tab.tableStyleInfo = TableStyleInfo(name=styleName, showFirstColumn=False,showLastColumn=False, showRowStripes=True, showColumnStripes=True)
    return tab
0 голосов
/ 20 июня 2019

Адаптировано из этого решения , но обратите внимание, что в моем (ограниченном) тестировании (и, как отмечалось в других вопросах и ответах), это не поддерживает параметр After метода Copy, толькоBefore.Если вы попытаетесь использовать After, вместо этого будет создана новая рабочая книга.

import xlwings as xw

wb = xw.Book('individual_files\\file1.xlsx')
sht = wb.sheets[0]
new_wb = xw.Book('Master Spreadsheet.xlsx')
# copy this sheet into the new_wb *before* Sheet1:
sht.api.Copy(Before=new_wb.sheets['Sheet1'].api)
# now, remove Sheet1 from new_wb
new_wb.sheets['Sheet1'].delete()
...