代码之家  ›  专栏  ›  技术社区  ›  Joylove

使用定义的名称范围将PADAS数据框转换为Excel

  •  1
  • Joylove  · 技术社区  · 6 年前

    我想在代码运行时将多个不同大小的df写入Excel。

    某些表将包含源数据,而其他表将包含对该源数据执行操作的Excel公式。

    我希望公式df包含对源数据df的Excel引用,而不是跟踪将源数据写入其中的单元格的范围。

    这可以通过Excel的名称或Excel的表功能来完成。

    例如,在我的公式df中,我可以有=index(我的\定义的名称\源数据,4,3)*2和Excel名称我的\定义的名称\源数据是我索引源数据所需的全部。

    OpenPYXL详细信息在此处写入表格 https://openpyxl.readthedocs.io/en/stable/worksheet_tables.html?highlight=tables

    表格不支持多索引df.to_Excel将创建的合并单元格。

    所以我要看定义的名字。在OpenPyXL中,几乎没有文档可以使用 wb.defined_name.append()。 这就是我找到的 https://openpyxl.readthedocs.io/en/stable/api/openpyxl.workbook.defined_name.html?highlight=definednames

    我需要的帮助是:如何将数据框架写入Excel,并为其提供一个Excel定义的名称。文档和在线示例几乎不存在。

    同时也感激地接受其他想法的建议,因为我似乎在接触几乎没有人使用的东西。

    2 回复  |  直到 5 年前
        1
  •  1
  •   mhollberg    5 年前

    “XLSxWriter”库允许您创建Excel数据表,因此我编写了以下函数来获取一个数据帧,将其写入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()
        2
  •  0
  •   Joylove    6 年前

    我只需从OpenPYXL切换到XLSXWriter就可以解决这个问题。

    https://xlsxwriter.readthedocs.io/example_defined_name.html?highlight=names