Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: Refresh PivotTables in worksheet [closed]

I'm building a python script that will allow me to open a Excel 2010 worksheet and print it out.

I got most of the way

import win32com.client

office = win32com.client.Dispatch("Excel.Application")
wb = office.Workbooks.Open(r"path\to\excel\file\to\print.xlsm")

count = wb.Sheets.Count
for i in range(count):
    ws = wb.Worksheets[i]

    pivotCount = ws.PivotTables().Count
    for j in range(1, pivotCount+1):
        #TODO code to refresh each pivot table

    ws.PrintOut()
    print "Worksheet: %s - has been sent to the printer" % (ws.Name)

As you can see I'm still missing the refreshing of the pivot tables in the worksheet.

The VBA code for refreshing is:

ActiveSheet.PivotTables(1).PivotCache.Refresh

I can't seem to break the code into python win32com syntax. The closest I got is:

wb.WorkSheets(5).PivotTables(1).PivotCache.Refresh

which gives <bound method CDispatch.Refresh of <COMObject PivotCache>> but no result in the the worksheet.

like image 594
Norfeldt Avatar asked Nov 04 '13 14:11

Norfeldt


People also ask

How do you refresh a pivot table in Python?

First, create an object and open the excel application. Using the object, open the excel file containing the pivot table by providing the source path. RefreshAll() method used on the excel instance refreshes all the data connections.

How do you refresh a locked pivot table?

Refresh Pivot Table on Protected Sheet. When a worksheet is protected, you can't refresh the pivot tables on that sheet. You could manually unprotect the worksheet, refresh the pivot table, and then protect the sheet again.

How do you refresh a pivot table macro?

Here are the steps to refresh a Pivot Table: Right-click on any cell in the Pivot Table. Select Refresh.

How do I refresh an Excel file without opening it?

Click a cell in the external data range. On the Data tab, in the Connections group, click Refresh All, and then click Connection Properties. Click the Usage tab. Select the Refresh every check box, and then enter the number of minutes between each refresh operation.


1 Answers

I found my problem. I had a protection on the worksheet. Here is the solution:

import win32com.client

office = win32com.client.Dispatch("Excel.Application")
wb = office.Workbooks.Open(r"path\to\excel\file\to\print.xlsm")

count = wb.Sheets.Count
for i in range(count):
    ws = wb.Worksheets[i]
    ws.Unprotect() # IF protected

    pivotCount = ws.PivotTables().Count
    for j in range(1, pivotCount+1):
        ws.PivotTables(j).PivotCache().Refresh()

    # Put protection back on
    ws.Protect(DrawingObjects=True, Contents=True, Scenarios=True, AllowUsingPivotTables=True)

    ws.PrintOut()
    print "Worksheet: %s - has been sent to the printer" % (ws.Name)
like image 187
Norfeldt Avatar answered Sep 28 '22 04:09

Norfeldt