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.
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.
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.
Here are the steps to refresh a Pivot Table: Right-click on any cell in the Pivot Table. Select Refresh.
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.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With