Сохранить Pandas dataframe в "умную" таблицу Excel без преобразования типов данных

История кода началась с того, что у меня есть "умная" таблица. При запуску скрипта, он должен удалять все имеющиеся строки в этой таблице и заменять на сформированный Pandas Dataframe. Я пыталась это сделать с помощью openpyxl, но файл либо ломался, либо таблица не продлевалась на все строки.

def df_to_excel(df, ws, header=True, index=False, startrow=1, startcol=0):

    rows = dataframe_to_rows(df, header=header, index=index)
    for r_idx, row in enumerate(rows, startrow + 1):
        for c_idx, value in enumerate(row, startcol + 1):
            ws.cell(row=r_idx, column=c_idx).value = value

wb = openpyxl.load_workbook(filename)
ws = wb[sheetname]
ws.delete_rows(2, ws.max_row)
df_to_excel(my_df, ws)
wb.save(filename) 
wb.close()

Я нашла отлично работающий способ с использованием xlwings, но в нем есть проблема. В нескольких колонках DataFrame есть цифры, которые представлены как Текст (например, 01234). Когда происходит запись (скрипт ниже), эти колонки превращаются в формат General. Т.е. вместо 01234 записано 1234. Возможно ли это исправить. Или все же есть способ записать данные в "умную" таблицу с помощью openpyxl

    with xw.App(add_book=False) as app:
        wb = app.books.open(WORKBOOK_PATH, update_links=False, read_only=False)
        sht = wb.sheets[SHEET_NAME]
        table = sht.range(TABLE_NAME)
        table.clear_contents()
        table.options(index=False, header=False, table_style_name='TableStyleLight9').value = my_df
        wb.save()
        wb.close()

Ответы (1 шт):

Автор решения: strawdog

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

import pandas as pd
import xlwings as xw
df = pd.DataFrame({"a":["0123", "0234"]})
print(df)
print(df.info())
      a
0  0123
1  0234
. . .
 0   a       2 non-null      object
. . .
book = xw.Book('Book1.xlsx')
sheet = book.sheets['Лист1']
sheet.range('A1:B3').number_format = '@' # <- вот здесь
sheet['A1'].value = df
book.save()

введите сюда описание изображения

для какой области менять формат, я думаю, вы сами разберетесь...

→ Ссылка