【问题标题】:How to create a pivot table in Excel with python win32com如何使用 python win32com 在 Excel 中创建数据透视表
【发布时间】:2021-03-13 01:10:32
【问题描述】:
  • 给定一个现有的 Excel 文件,数据为长格式

  • 使用 Python win32com 模块在 Excel 中自动创建以下数据透视表

  • 以下是使用数据设置 test.xlsx 并连接以创建 Excel com 对象的代码

进口

import win32com.client as win32
from pathlib import Path
import sys
import pandas as pd
import numpy as np
import random
from datetime import datetime

win32c = win32.constants

创建test.xlsx的函数

  • 此功能仅提供测试数据和文件
def create_test_excel_file(f_path: Path, f_name: str, sheet_name: str):
    
    filename = f_path / f_name
    random.seed(365)
    np.random.seed(365)
    number_of_data_rows = 1000
    
    # create list of 31 dates
    dates = pd.bdate_range(datetime(2020, 7, 1), freq='1d', periods=31).tolist()

    data = {'date': [random.choice(dates) for _ in range(number_of_data_rows)],
            'expense': [random.choice(['business', 'personal']) for _ in range(number_of_data_rows)],
            'products': [random.choice(['book', 'ribeye', 'coffee', 'salmon', 'alcohol', 'pie']) for _ in range(number_of_data_rows)],
            'price': np.random.normal(15, 5, size=(1, number_of_data_rows))[0]}

    pd.DataFrame(data).to_excel(filename, index=False, sheet_name=sheet_name, float_format='%.2f')

创建 Excel com 对象的函数

def run_excel(f_path: Path, f_name: str, sheet_name: str):

    filename = f_path / f_name

    # create excel object
    excel = win32.gencache.EnsureDispatch('Excel.Application')

    # excel can be visible or not
    excel.Visible = True  # False
    
    # try except for file / path
    try:
        wb = excel.Workbooks.Open(filename)
    except com_error as e:
        if e.excepinfo[5] == -2146827284:
            print(f'Failed to open spreadsheet.  Invalid filename or location: {filename}')
        else:
            raise e
        sys.exit(1)

    # set worksheet
    ws1 = wb.Sheets('data')
    
#     wb.Close(True)
#     excel.Quit()

主要

def main():
    # sheet name for data
    sheet_name = 'data'  # update with sheet name from your file
    # file path
    f_path = Path.cwd()  # file in current working directory
#   f_path = Path(r'c:\...\Documents')  # file located somewhere else
    # excel file
    f_name = 'test.xlsx'
    
    # function calls
    create_test_excel_file(f_path, f_name, sheet_name)  # remove when running your own file
    run_excel(f_path, f_name, sheet_name)

【问题讨论】:

    标签: python excel pivot-table win32com


    【解决方案1】:
    • 找出要使用的正确 Excel 方法的一种有用方法是在 Excel 中记录分步宏,同时以所需的形式创建数据透视表。
      • 这对于创建必须在包含现有数据的文件中定期运行的数据透视表很有用。
    • 使用问题中的导入和方法
    • 为新数据文件修改此代码
      • 更新def main
        • sheet_name
        • f_path
        • f_name
      • 更新def run_excel
        • ws1
        • ws2_name
        • pt_name
        • pt_rows
        • pt_cols
        • pt_filters
        • pt_fields
      • 调用main()运行代码

    pivot_table函数

    def pivot_table(wb: object, ws1: object, pt_ws: object, ws_name: str, pt_name: str, pt_rows: list, pt_cols: list, pt_filters: list, pt_fields: list):
        """
        wb = workbook1 reference
        ws1 = worksheet1
        pt_ws = pivot table worksheet number
        ws_name = pivot table worksheet name
        pt_name = name given to pivot table
        pt_rows, pt_cols, pt_filters, pt_fields: values selected for filling the pivot tables
        """
    
        # pivot table location
        pt_loc = len(pt_filters) + 2
        
        # grab the pivot table source data
        pc = wb.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=ws1.UsedRange)
        
        # create the pivot table object
        pc.CreatePivotTable(TableDestination=f'{ws_name}!R{pt_loc}C1', TableName=pt_name)
    
        # selecte the pivot table work sheet and location to create the pivot table
        pt_ws.Select()
        pt_ws.Cells(pt_loc, 1).Select()
    
        # Sets the rows, columns and filters of the pivot table
    
        for field_list, field_r in ((pt_filters, win32c.xlPageField), (pt_rows, win32c.xlRowField), (pt_cols, win32c.xlColumnField)):
            for i, value in enumerate(field_list):
                pt_ws.PivotTables(pt_name).PivotFields(value).Orientation = field_r
                pt_ws.PivotTables(pt_name).PivotFields(value).Position = i + 1
    
        # Sets the Values of the pivot table
        for field in pt_fields:
            pt_ws.PivotTables(pt_name).AddDataField(pt_ws.PivotTables(pt_name).PivotFields(field[0]), field[1], field[2]).NumberFormat = field[3]
    
        # Visiblity True or Valse
        pt_ws.PivotTables(pt_name).ShowValuesRow = True
        pt_ws.PivotTables(pt_name).ColumnGrand = True
    

    更新run_excel 调用pivot_table

    def run_excel(f_path: Path, f_name: str, sheet_name: str):
    
        filename = f_path / f_name
    
        # create excel object
        excel = win32.gencache.EnsureDispatch('Excel.Application')
    
        # excel can be visible or not
        excel.Visible = True  # False
        
        # try except for file / path
        try:
            wb = excel.Workbooks.Open(filename)
        except com_error as e:
            if e.excepinfo[5] == -2146827284:
                print(f'Failed to open spreadsheet.  Invalid filename or location: {filename}')
            else:
                raise e
            sys.exit(1)
    
        # set worksheet
        ws1 = wb.Sheets('data')
        
        # Setup and call pivot_table
        ws2_name = 'pivot_table'
        wb.Sheets.Add().Name = ws2_name
        ws2 = wb.Sheets(ws2_name)
        
        pt_name = 'example'
        pt_rows = ['expense']
        pt_cols = ['products']
        pt_filters = ['date']
        # [0]: field name [1]: pivot table column name [3]: calulation method [4]: number format
        pt_fields = [['price', 'price: mean', win32c.xlAverage, '$#,##0.00'],  
                     ['price', 'price: sum', win32c.xlSum, '$#,##0.00'],
                     ['price', 'price: count', win32c.xlCount, '0']]
        
        pivot_table(wb, ws1, ws2, ws2_name, pt_name, pt_rows, pt_cols, pt_filters, pt_fields)
        
    #     wb.Close(True)
    #     excel.Quit()
    

    资源

    【讨论】:

      猜你喜欢
      • 2020-12-23
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2019-06-20
      相关资源
      最近更新 更多