是否有可能跳过第一行的行并设置列标题?

发布于 2025-01-20 12:47:39 字数 4781 浏览 1 评论 0原文

但是,我使用以下依赖项具有以下功能

import win32com.client as win32
import pandas as pd
import numpy as np
from pathlib import Path
import re
import sys
win32c = win32.constants

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('GRC User Data Clean Up')

,我的WS1具有从第9行开始的标题。如何使用Win32指定这一点?

我想跳过前八行,

请帮忙!

不幸的是,我不能在这里使用熊猫,

然后我想从八行下方创建一个枢轴表,直到12000;

    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('GRC User Data Clean Up')
        
        # Setup and call pivot_table
        ws2_name = 'pivot_table'
        wb.Sheets.Add().Name = ws2_name
        ws2 = wb.Sheets(ws2_name)
        
        # update the pt_name, pt_rows, pt_cols, pt_filters, pt_fields at your preference
        pt_name = 'example'  # pivot table name, must be a string
        pt_rows = ['Access Risk ID', 'User ID','User Group','Execution Hit on Both Sides?', 'Risk Description']  # rows of pivot table, must be a list
        # pt_cols = []  # columns of pivot table, must be a list
        pt_filters = ['Final verdict','Execution Hit on Both Sides?' ]  # filter to be applied on pivot table, must be a list
        # [0]: field name [1]: pivot table column name [3]: calulation method [4]: number format (explain the list item of pt_fields below)
        pt_fields = [['Access Risk ID', 'Access Risk ID', win32c.xlCount, '0'],  # must be a list of lists
                     ['User ID', 'User ID', win32c.xlCount, '0'],
                     ['User Group', 'User Group', win32c.xlCount, '0'],
                     ['Execution Hit on Both Sides?', 'Execution Hit on Both Sides?', win32c.xlCount, '0'],
                     ['Risk Description', 'Risk Description', win32c.xlCount, '0']]
        # calculation method: xlAverage, xlSum, xlCount
        pivot_table(wb, ws1, ws2, ws2_name, pt_name, pt_rows, pt_filters, pt_fields)
        wb.Save() # save the pivot table created
    #    wb.Close(True)
    #    excel.Quit()


def pivot_table(wb: object, ws1: object, pt_ws: object, ws_name: str, pt_name: str, pt_rows: list, pt_filters: list, pt_fields: list):
    """
    wb = workbook1 reference
    ws1 = worksheet1 that contain the data
    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)):
        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 False
    pt_ws.PivotTables(pt_name).ShowValuesRow = True
    pt_ws.PivotTables(pt_name).ColumnGrand = True

I have the following function using the following dependencies

import win32com.client as win32
import pandas as pd
import numpy as np
from pathlib import Path
import re
import sys
win32c = win32.constants

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('GRC User Data Clean Up')

However, my ws1 has headers that start at row 9. How do I specify this with win32?

I want to skip the first eight rows

Please help!

I can't use pandas here unfortunately

Then I want to create a pivot table from the eight row down until 12000;

    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('GRC User Data Clean Up')
        
        # Setup and call pivot_table
        ws2_name = 'pivot_table'
        wb.Sheets.Add().Name = ws2_name
        ws2 = wb.Sheets(ws2_name)
        
        # update the pt_name, pt_rows, pt_cols, pt_filters, pt_fields at your preference
        pt_name = 'example'  # pivot table name, must be a string
        pt_rows = ['Access Risk ID', 'User ID','User Group','Execution Hit on Both Sides?', 'Risk Description']  # rows of pivot table, must be a list
        # pt_cols = []  # columns of pivot table, must be a list
        pt_filters = ['Final verdict','Execution Hit on Both Sides?' ]  # filter to be applied on pivot table, must be a list
        # [0]: field name [1]: pivot table column name [3]: calulation method [4]: number format (explain the list item of pt_fields below)
        pt_fields = [['Access Risk ID', 'Access Risk ID', win32c.xlCount, '0'],  # must be a list of lists
                     ['User ID', 'User ID', win32c.xlCount, '0'],
                     ['User Group', 'User Group', win32c.xlCount, '0'],
                     ['Execution Hit on Both Sides?', 'Execution Hit on Both Sides?', win32c.xlCount, '0'],
                     ['Risk Description', 'Risk Description', win32c.xlCount, '0']]
        # calculation method: xlAverage, xlSum, xlCount
        pivot_table(wb, ws1, ws2, ws2_name, pt_name, pt_rows, pt_filters, pt_fields)
        wb.Save() # save the pivot table created
    #    wb.Close(True)
    #    excel.Quit()


def pivot_table(wb: object, ws1: object, pt_ws: object, ws_name: str, pt_name: str, pt_rows: list, pt_filters: list, pt_fields: list):
    """
    wb = workbook1 reference
    ws1 = worksheet1 that contain the data
    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)):
        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 False
    pt_ws.PivotTables(pt_name).ShowValuesRow = True
    pt_ws.PivotTables(pt_name).ColumnGrand = True

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文