使用python在Excel中创build数据透视表

我写了下面的代码在现有的Excel表中创build一个数据透视表:

import win32com.client as win32 win32c = win32.constants import sys import itertools tablecount = itertools.count(1) def addpivot(wb,sourcedata,title,filters=(),columns=(), rows=(),sumvalue=(),sortfield=""): newsheet = wb.Sheets.Add() newsheet.Cells(1,1).Value = title newsheet.Cells(1,1).Font.Size = 16 tname = "PivotTable%d"%tablecount.next() pc = wb.PivotCaches().Add(SourceType=win32c.xlDatabase, SourceData=sourcedata) pt = pc.CreatePivotTable(TableDestination="%s!R4C1"%newsheet.Name, TableName=tname, DefaultVersion=win32c.xlPivotTableVersion10) for fieldlist,fieldc in ((filters,win32c.xlPageField), (columns,win32c.xlColumnField), (rows,win32c.xlRowField)): for i,val in enumerate(fieldlist): wb.ActiveSheet.PivotTables(tname).PivotFields(val).Orientation = fieldc wb.ActiveSheet.PivotTables(tname).PivotFields(val).Position = i+1 wb.ActiveSheet.PivotTables(tname).AddDataField(wb.ActiveSheet.PivotTables(tname). PivotFields(sumvalue),sumvalue,win32c.xlSum) def runexcel(): excel = win32.gencache.EnsureDispatch('Excel.Application') #excel.Visible = True try: wb = excel.Workbooks.Open('18.03.14.xls') except: print "Failed to open spreadsheet 18.03.14.xls" sys.exit(1) ws = wb.Sheets('defaulters') xldata = ws.UsedRange.Value newdata = [] for row in xldata: if len(row) == 4 and row[-1] is not None: newdata.append(list(row)) rowcnt = len(newdata) colcnt = len(newdata[0]) wsnew = wb.Sheets.Add() wsnew.Range(wsnew.Cells(1,1),wsnew.Cells(rowcnt,colcnt)).Value = newdata wsnew.Columns.AutoFit() src = "%s!R1C1:R%dC%d"%(wsnew.Name,rowcnt,colcnt) addpivot(wb,src, title="Employees by leads", filters=("Leads",), columns=(), rows=("Name",), sumvalue="Actual hours", sortfield=()) if int(float(excel.Version)) >= 12: wb.SaveAs('new18.03.14.xlsx',win32c.xlOpenXMLWorkbook) else: wb.SaveAs('new18.03.14.xls') excel.Application.Quit() if __name__ == "__main__": runexcel() 

这行代码, wb.ActiveSheet.PivotTables(tname).AddDataField(wb.ActiveSheet.PivotTables(tname).PivotFields(sumvalue),sumvalue,win32c.xlSum)

返回以下错误:

pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, u'Microsoft Excel', u'PivotFields method of PivotTable class failed', u'xlmain11.chm', 0, -2146827284), None)

当我删除该行时,数据透视表生成时没有任何数据字段。 有什么我做错了吗?

由于这是从pythonsearch数据透视表的第一个谷歌点击之一,我张贴我的示例代码。 此代码通过COM服务器在Excel中生成一个简单的数据透视表,其中应用了一些基本的filter,列,行和一些数字格式。 我希望这可以帮助别人浪费半天的时间(就像我做的那样)

 import win32com.client Excel = win32com.client.gencache.EnsureDispatch('Excel.Application') # Excel = win32com.client.Dispatch('Excel.Application') win32c = win32com.client.constants wb = Excel.Workbooks.Add() Sheet1 = wb.Worksheets("Sheet1") TestData = [['Country','Name','Gender','Sign','Amount'], ['CH','Max' ,'M','Plus',123.4567], ['CH','Max' ,'M','Minus',-23.4567], ['CH','Max' ,'M','Plus',12.2314], ['CH','Max' ,'M','Minus',-2.2314], ['CH','Sam' ,'M','Plus',453.7685], ['CH','Sam' ,'M','Minus',-53.7685], ['CH','Sara','F','Plus',777.666], ['CH','Sara','F','Minus',-77.666], ['DE','Hans','M','Plus',345.088], ['DE','Hans','M','Minus',-45.088], ['DE','Paul','M','Plus',222.455], ['DE','Paul','M','Minus',-22.455]] for i, TestDataRow in enumerate(TestData): for j, TestDataItem in enumerate(TestDataRow): Sheet1.Cells(i+2,j+4).Value = TestDataItem cl1 = Sheet1.Cells(2,4) cl2 = Sheet1.Cells(2+len(TestData)-1,4+len(TestData[0])-1) PivotSourceRange = Sheet1.Range(cl1,cl2) PivotSourceRange.Select() Sheet2 = wb.Worksheets(2) cl3=Sheet2.Cells(4,1) PivotTargetRange= Sheet2.Range(cl3,cl3) PivotTableName = 'ReportPivotTable' PivotCache = wb.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=PivotSourceRange, Version=win32c.xlPivotTableVersion14) PivotTable = PivotCache.CreatePivotTable(TableDestination=PivotTargetRange, TableName=PivotTableName, DefaultVersion=win32c.xlPivotTableVersion14) PivotTable.PivotFields('Name').Orientation = win32c.xlRowField PivotTable.PivotFields('Name').Position = 1 PivotTable.PivotFields('Gender').Orientation = win32c.xlPageField PivotTable.PivotFields('Gender').Position = 1 PivotTable.PivotFields('Gender').CurrentPage = 'M' PivotTable.PivotFields('Country').Orientation = win32c.xlColumnField PivotTable.PivotFields('Country').Position = 1 PivotTable.PivotFields('Country').Subtotals = [False, False, False, False, False, False, False, False, False, False, False, False] PivotTable.PivotFields('Sign').Orientation = win32c.xlColumnField PivotTable.PivotFields('Sign').Position = 2 DataField = PivotTable.AddDataField(PivotTable.PivotFields('Amount')) DataField.NumberFormat = '#\'##0.00' Excel.Visible = 1 wb.SaveAs('ranges_and_offsets.xlsx') Excel.Application.Quit() 

从这里发现,在expression .AddDataField(Field, Caption, Function)只有Field是必需的,另外两个参数是可选的。 我删除了他们,代码工作正常!