我想在我的代码运行时向Excel写入多个不同大小的df。
某些表将包含源数据,而其他表将包含对该源数据进行操作的Excel公式。
我想要公式df包含对源数据df的Excel引用,而不是跟踪我写入源数据的单元格范围。
这可以使用Excel的名称或Excel的表格功能完成。
例如在我的公式df中我可以有= INDEX(my_Defined_Name_source_data,4,3)* 2和Excel名称my_Defined_Name_source_data是我索引源数据所需的全部内容。
Openpyxl详细信息在这里写表https://openpyxl.readthedocs.io/en/stable/worksheet_tables.html?highlight=tables
表不支持multiindex df.to_excel将创建的合并单元格。
所以我正在寻找定义名称。几乎没有使用wb.defined_names.append()在openpyxl中编写定义名称的文档这是我发现的https://openpyxl.readthedocs.io/en/stable/api/openpyxl.workbook.defined_name.html?highlight=definednames
我正在寻求帮助:如何将DataFrame写入Excel并为其提供Excel定义的名称。文档和在线示例几乎不存在。
还要感谢接受替代想法的建议,因为我似乎正在访问几乎没有其他人使用的东西。
“xlsxwriter”库允许您创建Excel数据表,因此我编写了以下函数来获取DataFrame,将其写入Excel,然后将数据转换为数据表。
def dataframe_to_excel_table(df, xl_file, xl_tablename, xl_sheet='Sheet1'):
"""
Pass a dataframe, filename, name of table and Excel sheet name.
Save an excel file of the df, formatted as a named Excel 'Data table'
* Requires "xlsxwriter" library ($ pip install XlsxWriter)
:param df: a Pandas dataframe object
:param xl_file: File name of Excel file to create
:param xl_sheet: String containing sheet/tab name
:param xl_tablename: Data table name in the excel file
:return: Nothing / New Excel file
"""
# Excel doesn't like multi-indexed df's. Convert to 1 value per column/row
# See https://stackoverflow.com/questions/14507794
df.reset_index(inplace=True) # Expand multiindex
# Write dataframe to Excel
writer = pd.ExcelWriter(path=xl_file,
engine='xlsxwriter',
datetime_format='yyyy mm dd hh:mm:ss')
df.to_excel(writer, index=False, sheet_name=xl_sheet)
# Get dimensions of data to size table
num_rows, num_cols = df.shape
# make list of dictionaries of form [{'header' : col_name},...]
# to pass so table doesn't overwrite column header names
# https://xlsxwriter.readthedocs.io/example_tables.html#ex-tables
dataframes_cols = df.columns.tolist()
col_list = [{'header': col} for col in dataframes_cols]
# Convert data in Excel file to an Excel data table
worksheet = writer.sheets[xl_sheet]
worksheet.add_table(0,0, # begin in Cell 'A1'
num_rows, num_cols-1,
{'name': xl_tablename,
'columns': col_list})
writer.save()
我通过简单地从OpenPyXL切换到XLSXWriter来解决这个问题
https://xlsxwriter.readthedocs.io/example_defined_name.html?highlight=names