table.py 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177
  1. # Copyright (c) 2010-2019 openpyxl
  2. from openpyxl.descriptors.serialisable import Serialisable
  3. from openpyxl.descriptors import (
  4. Typed,
  5. Integer,
  6. NoneSet,
  7. Set,
  8. Float,
  9. Bool,
  10. DateTime,
  11. String,
  12. Alias,
  13. Bool,
  14. Sequence,
  15. )
  16. from openpyxl.descriptors.excel import ExtensionList, Relation
  17. from openpyxl.descriptors.nested import NestedInteger
  18. from openpyxl.descriptors.sequence import NestedSequence
  19. from openpyxl.xml.constants import SHEET_MAIN_NS
  20. from openpyxl.xml.functions import tostring
  21. from openpyxl.packaging.relationship import (
  22. RelationshipList,
  23. Relationship,
  24. get_rels_path
  25. )
  26. from openpyxl.worksheet.filters import (
  27. AutoFilter,
  28. CellRange,
  29. ColorFilter,
  30. CustomFilter,
  31. CustomFilters,
  32. DateGroupItem,
  33. DynamicFilter,
  34. FilterColumn,
  35. Filters,
  36. IconFilter,
  37. SortCondition,
  38. SortState,
  39. Top10,
  40. )
  41. class HierarchyUsage(Serialisable):
  42. tagname = "hierarchyUsage"
  43. hierarchyUsage = Integer()
  44. def __init__(self,
  45. hierarchyUsage=None,
  46. ):
  47. self.hierarchyUsage = hierarchyUsage
  48. class ColHierarchiesUsage(Serialisable):
  49. tagname = "colHierarchiesUsage"
  50. colHierarchyUsage = Sequence(expected_type=HierarchyUsage, )
  51. __elements__ = ('colHierarchyUsage',)
  52. __attrs__ = ('count', )
  53. def __init__(self,
  54. count=None,
  55. colHierarchyUsage=(),
  56. ):
  57. self.colHierarchyUsage = colHierarchyUsage
  58. @property
  59. def count(self):
  60. return len(self.colHierarchyUsage)
  61. class RowHierarchiesUsage(Serialisable):
  62. tagname = "rowHierarchiesUsage"
  63. rowHierarchyUsage = Sequence(expected_type=HierarchyUsage, )
  64. __elements__ = ('rowHierarchyUsage',)
  65. __attrs__ = ('count', )
  66. def __init__(self,
  67. count=None,
  68. rowHierarchyUsage=(),
  69. ):
  70. self.rowHierarchyUsage = rowHierarchyUsage
  71. @property
  72. def count(self):
  73. return len(self.rowHierarchyUsage)
  74. class PivotFilter(Serialisable):
  75. tagname = "filter"
  76. fld = Integer()
  77. mpFld = Integer(allow_none=True)
  78. type = Set(values=(['unknown', 'count', 'percent', 'sum', 'captionEqual',
  79. 'captionNotEqual', 'captionBeginsWith', 'captionNotBeginsWith',
  80. 'captionEndsWith', 'captionNotEndsWith', 'captionContains',
  81. 'captionNotContains', 'captionGreaterThan', 'captionGreaterThanOrEqual',
  82. 'captionLessThan', 'captionLessThanOrEqual', 'captionBetween',
  83. 'captionNotBetween', 'valueEqual', 'valueNotEqual', 'valueGreaterThan',
  84. 'valueGreaterThanOrEqual', 'valueLessThan', 'valueLessThanOrEqual',
  85. 'valueBetween', 'valueNotBetween', 'dateEqual', 'dateNotEqual',
  86. 'dateOlderThan', 'dateOlderThanOrEqual', 'dateNewerThan',
  87. 'dateNewerThanOrEqual', 'dateBetween', 'dateNotBetween', 'tomorrow',
  88. 'today', 'yesterday', 'nextWeek', 'thisWeek', 'lastWeek', 'nextMonth',
  89. 'thisMonth', 'lastMonth', 'nextQuarter', 'thisQuarter', 'lastQuarter',
  90. 'nextYear', 'thisYear', 'lastYear', 'yearToDate', 'Q1', 'Q2', 'Q3', 'Q4',
  91. 'M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7', 'M8', 'M9', 'M10', 'M11',
  92. 'M12']))
  93. evalOrder = Integer(allow_none=True)
  94. id = Integer()
  95. iMeasureHier = Integer(allow_none=True)
  96. iMeasureFld = Integer(allow_none=True)
  97. name = String(allow_none=True)
  98. description = String(allow_none=True)
  99. stringValue1 = String(allow_none=True)
  100. stringValue2 = String(allow_none=True)
  101. autoFilter = Typed(expected_type=AutoFilter, )
  102. extLst = Typed(expected_type=ExtensionList, allow_none=True)
  103. __elements__ = ('autoFilter',)
  104. def __init__(self,
  105. fld=None,
  106. mpFld=None,
  107. type=None,
  108. evalOrder=None,
  109. id=None,
  110. iMeasureHier=None,
  111. iMeasureFld=None,
  112. name=None,
  113. description=None,
  114. stringValue1=None,
  115. stringValue2=None,
  116. autoFilter=None,
  117. extLst=None,
  118. ):
  119. self.fld = fld
  120. self.mpFld = mpFld
  121. self.type = type
  122. self.evalOrder = evalOrder
  123. self.id = id
  124. self.iMeasureHier = iMeasureHier
  125. self.iMeasureFld = iMeasureFld
  126. self.name = name
  127. self.description = description
  128. self.stringValue1 = stringValue1
  129. self.stringValue2 = stringValue2
  130. self.autoFilter = autoFilter
  131. class PivotFilters(Serialisable):
  132. count = Integer()
  133. filter = Typed(expected_type=PivotFilter, allow_none=True)
  134. __elements__ = ('filter',)
  135. def __init__(self,
  136. count=None,
  137. filter=None,
  138. ):
  139. self.filter = filter
  140. class PivotTableStyle(Serialisable):
  141. tagname = "pivotTableStyleInfo"
  142. name = String(allow_none=True)
  143. showRowHeaders = Bool()
  144. showColHeaders = Bool()
  145. showRowStripes = Bool()
  146. showColStripes = Bool()
  147. showLastColumn = Bool()
  148. def __init__(self,
  149. name=None,
  150. showRowHeaders=None,
  151. showColHeaders=None,
  152. showRowStripes=None,
  153. showColStripes=None,
  154. showLastColumn=None,
  155. ):
  156. self.name = name
  157. self.showRowHeaders = showRowHeaders
  158. self.showColHeaders = showColHeaders
  159. self.showRowStripes = showRowStripes
  160. self.showColStripes = showColStripes
  161. self.showLastColumn = showLastColumn
  162. class MemberList(Serialisable):
  163. tagname = "members"
  164. level = Integer(allow_none=True)
  165. member = NestedSequence(expected_type=String, attribute="name")
  166. __elements__ = ('member',)
  167. def __init__(self,
  168. count=None,
  169. level=None,
  170. member=(),
  171. ):
  172. self.level = level
  173. self.member = member
  174. @property
  175. def count(self):
  176. return len(self.member)
  177. class MemberProperty(Serialisable):
  178. tagname = "mps"
  179. name = String(allow_none=True)
  180. showCell = Bool(allow_none=True)
  181. showTip = Bool(allow_none=True)
  182. showAsCaption = Bool(allow_none=True)
  183. nameLen = Integer(allow_none=True)
  184. pPos = Integer(allow_none=True)
  185. pLen = Integer(allow_none=True)
  186. level = Integer(allow_none=True)
  187. field = Integer()
  188. def __init__(self,
  189. name=None,
  190. showCell=None,
  191. showTip=None,
  192. showAsCaption=None,
  193. nameLen=None,
  194. pPos=None,
  195. pLen=None,
  196. level=None,
  197. field=None,
  198. ):
  199. self.name = name
  200. self.showCell = showCell
  201. self.showTip = showTip
  202. self.showAsCaption = showAsCaption
  203. self.nameLen = nameLen
  204. self.pPos = pPos
  205. self.pLen = pLen
  206. self.level = level
  207. self.field = field
  208. class PivotHierarchy(Serialisable):
  209. tagname = "pivotHierarchy"
  210. outline = Bool()
  211. multipleItemSelectionAllowed = Bool()
  212. subtotalTop = Bool()
  213. showInFieldList = Bool()
  214. dragToRow = Bool()
  215. dragToCol = Bool()
  216. dragToPage = Bool()
  217. dragToData = Bool()
  218. dragOff = Bool()
  219. includeNewItemsInFilter = Bool()
  220. caption = String(allow_none=True)
  221. mps = NestedSequence(expected_type=MemberProperty, count=True)
  222. members = Typed(expected_type=MemberList, allow_none=True)
  223. extLst = Typed(expected_type=ExtensionList, allow_none=True)
  224. __elements__ = ('mps', 'members',)
  225. def __init__(self,
  226. outline=None,
  227. multipleItemSelectionAllowed=None,
  228. subtotalTop=None,
  229. showInFieldList=None,
  230. dragToRow=None,
  231. dragToCol=None,
  232. dragToPage=None,
  233. dragToData=None,
  234. dragOff=None,
  235. includeNewItemsInFilter=None,
  236. caption=None,
  237. mps=(),
  238. members=None,
  239. extLst=None,
  240. ):
  241. self.outline = outline
  242. self.multipleItemSelectionAllowed = multipleItemSelectionAllowed
  243. self.subtotalTop = subtotalTop
  244. self.showInFieldList = showInFieldList
  245. self.dragToRow = dragToRow
  246. self.dragToCol = dragToCol
  247. self.dragToPage = dragToPage
  248. self.dragToData = dragToData
  249. self.dragOff = dragOff
  250. self.includeNewItemsInFilter = includeNewItemsInFilter
  251. self.caption = caption
  252. self.mps = mps
  253. self.members = members
  254. self.extLst = extLst
  255. class Reference(Serialisable):
  256. tagname = "reference"
  257. field = Integer(allow_none=True)
  258. selected = Bool(allow_none=True)
  259. byPosition = Bool(allow_none=True)
  260. relative = Bool(allow_none=True)
  261. defaultSubtotal = Bool(allow_none=True)
  262. sumSubtotal = Bool(allow_none=True)
  263. countASubtotal = Bool(allow_none=True)
  264. avgSubtotal = Bool(allow_none=True)
  265. maxSubtotal = Bool(allow_none=True)
  266. minSubtotal = Bool(allow_none=True)
  267. productSubtotal = Bool(allow_none=True)
  268. countSubtotal = Bool(allow_none=True)
  269. stdDevSubtotal = Bool(allow_none=True)
  270. stdDevPSubtotal = Bool(allow_none=True)
  271. varSubtotal = Bool(allow_none=True)
  272. varPSubtotal = Bool(allow_none=True)
  273. x = NestedInteger(allow_none=True, attribute="v")
  274. extLst = Typed(expected_type=ExtensionList, allow_none=True)
  275. __elements__ = ('x',)
  276. def __init__(self,
  277. field=None,
  278. count=None,
  279. selected=None,
  280. byPosition=None,
  281. relative=None,
  282. defaultSubtotal=None,
  283. sumSubtotal=None,
  284. countASubtotal=None,
  285. avgSubtotal=None,
  286. maxSubtotal=None,
  287. minSubtotal=None,
  288. productSubtotal=None,
  289. countSubtotal=None,
  290. stdDevSubtotal=None,
  291. stdDevPSubtotal=None,
  292. varSubtotal=None,
  293. varPSubtotal=None,
  294. x=None,
  295. extLst=None,
  296. ):
  297. self.field = field
  298. self.selected = selected
  299. self.byPosition = byPosition
  300. self.relative = relative
  301. self.defaultSubtotal = defaultSubtotal
  302. self.sumSubtotal = sumSubtotal
  303. self.countASubtotal = countASubtotal
  304. self.avgSubtotal = avgSubtotal
  305. self.maxSubtotal = maxSubtotal
  306. self.minSubtotal = minSubtotal
  307. self.productSubtotal = productSubtotal
  308. self.countSubtotal = countSubtotal
  309. self.stdDevSubtotal = stdDevSubtotal
  310. self.stdDevPSubtotal = stdDevPSubtotal
  311. self.varSubtotal = varSubtotal
  312. self.varPSubtotal = varPSubtotal
  313. self.x = x
  314. @property
  315. def count(self):
  316. return len(self.field)
  317. class PivotArea(Serialisable):
  318. tagname = "pivotArea"
  319. references = NestedSequence(expected_type=Reference, count=True)
  320. extLst = Typed(expected_type=ExtensionList, allow_none=True)
  321. field = Integer(allow_none=True)
  322. type = NoneSet(values=(['normal', 'data', 'all', 'origin', 'button',
  323. 'topEnd', 'topRight']))
  324. dataOnly = Bool(allow_none=True)
  325. labelOnly = Bool(allow_none=True)
  326. grandRow = Bool(allow_none=True)
  327. grandCol = Bool(allow_none=True)
  328. cacheIndex = Bool(allow_none=True)
  329. outline = Bool(allow_none=True)
  330. offset = String(allow_none=True)
  331. collapsedLevelsAreSubtotals = Bool(allow_none=True)
  332. axis = NoneSet(values=(['axisRow', 'axisCol', 'axisPage', 'axisValues']))
  333. fieldPosition = Integer(allow_none=True)
  334. __elements__ = ('references',)
  335. def __init__(self,
  336. references=(),
  337. extLst=None,
  338. field=None,
  339. type="normal",
  340. dataOnly=True,
  341. labelOnly=None,
  342. grandRow=None,
  343. grandCol=None,
  344. cacheIndex=None,
  345. outline=True,
  346. offset=None,
  347. collapsedLevelsAreSubtotals=None,
  348. axis=None,
  349. fieldPosition=None,
  350. ):
  351. self.references = references
  352. self.extLst = extLst
  353. self.field = field
  354. self.type = type
  355. self.dataOnly = dataOnly
  356. self.labelOnly = labelOnly
  357. self.grandRow = grandRow
  358. self.grandCol = grandCol
  359. self.cacheIndex = cacheIndex
  360. self.outline = outline
  361. self.offset = offset
  362. self.collapsedLevelsAreSubtotals = collapsedLevelsAreSubtotals
  363. self.axis = axis
  364. self.fieldPosition = fieldPosition
  365. class ChartFormat(Serialisable):
  366. tagname = "chartFormat"
  367. chart = Integer()
  368. format = Integer()
  369. series = Bool()
  370. pivotArea = Typed(expected_type=PivotArea, )
  371. __elements__ = ('pivotArea',)
  372. def __init__(self,
  373. chart=None,
  374. format=None,
  375. series=None,
  376. pivotArea=None,
  377. ):
  378. self.chart = chart
  379. self.format = format
  380. self.series = series
  381. self.pivotArea = pivotArea
  382. class ConditionalFormat(Serialisable):
  383. tagname = "conditionalFormat"
  384. scope = Set(values=(['selection', 'data', 'field']))
  385. type = NoneSet(values=(['all', 'row', 'column']))
  386. priority = Integer()
  387. pivotAreas = NestedSequence(expected_type=PivotArea)
  388. extLst = Typed(expected_type=ExtensionList, allow_none=True)
  389. __elements__ = ('pivotAreas',)
  390. def __init__(self,
  391. scope=None,
  392. type=None,
  393. priority=None,
  394. pivotAreas=(),
  395. extLst=None,
  396. ):
  397. self.scope = scope
  398. self.type = type
  399. self.priority = priority
  400. self.pivotAreas = pivotAreas
  401. self.extLst = extLst
  402. class Format(Serialisable):
  403. tagname = "format"
  404. action = NoneSet(values=(['blank', 'formatting', 'drill', 'formula']))
  405. dxfId = Integer(allow_none=True)
  406. pivotArea = Typed(expected_type=PivotArea, )
  407. extLst = Typed(expected_type=ExtensionList, allow_none=True)
  408. __elements__ = ('pivotArea',)
  409. def __init__(self,
  410. action="formatting",
  411. dxfId=None,
  412. pivotArea=None,
  413. extLst=None,
  414. ):
  415. self.action = action
  416. self.dxfId = dxfId
  417. self.pivotArea = pivotArea
  418. self.extLst = extLst
  419. class DataField(Serialisable):
  420. tagname = "dataField"
  421. name = String(allow_none=True)
  422. fld = Integer()
  423. subtotal = Set(values=(['average', 'count', 'countNums', 'max', 'min',
  424. 'product', 'stdDev', 'stdDevp', 'sum', 'var', 'varp']))
  425. showDataAs = Set(values=(['normal', 'difference', 'percent',
  426. 'percentDiff', 'runTotal', 'percentOfRow', 'percentOfCol',
  427. 'percentOfTotal', 'index']))
  428. baseField = Integer()
  429. baseItem = Integer()
  430. numFmtId = Integer(allow_none=True)
  431. extLst = Typed(expected_type=ExtensionList, allow_none=True)
  432. __elements__ = ()
  433. def __init__(self,
  434. name=None,
  435. fld=None,
  436. subtotal="sum",
  437. showDataAs="normal",
  438. baseField=-1,
  439. baseItem=1048832,
  440. numFmtId=None,
  441. extLst=None,
  442. ):
  443. self.name = name
  444. self.fld = fld
  445. self.subtotal = subtotal
  446. self.showDataAs = showDataAs
  447. self.baseField = baseField
  448. self.baseItem = baseItem
  449. self.numFmtId = numFmtId
  450. self.extLst = extLst
  451. class PageField(Serialisable):
  452. tagname = "pageField"
  453. fld = Integer()
  454. item = Integer(allow_none=True)
  455. hier = Integer(allow_none=True)
  456. name = String(allow_none=True)
  457. cap = String(allow_none=True)
  458. extLst = Typed(expected_type=ExtensionList, allow_none=True)
  459. __elements__ = ()
  460. def __init__(self,
  461. fld=None,
  462. item=None,
  463. hier=None,
  464. name=None,
  465. cap=None,
  466. extLst=None,
  467. ):
  468. self.fld = fld
  469. self.item = item
  470. self.hier = hier
  471. self.name = name
  472. self.cap = cap
  473. self.extLst = extLst
  474. class RowColItem(Serialisable):
  475. tagname = "i"
  476. t = Set(values=(['data', 'default', 'sum', 'countA', 'avg', 'max', 'min',
  477. 'product', 'count', 'stdDev', 'stdDevP', 'var', 'varP', 'grand',
  478. 'blank']))
  479. r = Integer()
  480. i = Integer()
  481. x = NestedInteger(allow_none=True, attribute="v")
  482. __elements__ = ('x',)
  483. def __init__(self,
  484. t="data",
  485. r=0,
  486. i=0,
  487. x=None,
  488. ):
  489. self.t = t
  490. self.r = r
  491. self.i = i
  492. self.x = x
  493. class RowColField(Serialisable):
  494. tagname = "field"
  495. x = Integer()
  496. def __init__(self,
  497. x=None,
  498. ):
  499. self.x = x
  500. class AutoSortScope(Serialisable):
  501. pivotArea = Typed(expected_type=PivotArea, )
  502. __elements__ = ('pivotArea',)
  503. def __init__(self,
  504. pivotArea=None,
  505. ):
  506. self.pivotArea = pivotArea
  507. class FieldItem(Serialisable):
  508. tagname = "item"
  509. n = String(allow_none=True)
  510. t = Set(values=(['data', 'default', 'sum', 'countA', 'avg', 'max', 'min',
  511. 'product', 'count', 'stdDev', 'stdDevP', 'var', 'varP', 'grand',
  512. 'blank']))
  513. h = Bool(allow_none=True)
  514. s = Bool(allow_none=True)
  515. sd = Bool(allow_none=True)
  516. f = Bool(allow_none=True)
  517. m = Bool(allow_none=True)
  518. c = Bool(allow_none=True)
  519. x = Integer(allow_none=True)
  520. d = Bool(allow_none=True)
  521. e = Bool(allow_none=True)
  522. def __init__(self,
  523. n=None,
  524. t="data",
  525. h=None,
  526. s=None,
  527. sd=True,
  528. f=None,
  529. m=None,
  530. c=None,
  531. x=None,
  532. d=None,
  533. e=None,
  534. ):
  535. self.n = n
  536. self.t = t
  537. self.h = h
  538. self.s = s
  539. self.sd = sd
  540. self.f = f
  541. self.m = m
  542. self.c = c
  543. self.x = x
  544. self.d = d
  545. self.e = e
  546. class PivotField(Serialisable):
  547. tagname = "pivotField"
  548. items = NestedSequence(expected_type=FieldItem, count=True)
  549. autoSortScope = Typed(expected_type=AutoSortScope, allow_none=True)
  550. extLst = Typed(expected_type=ExtensionList, allow_none=True)
  551. name = String(allow_none=True)
  552. axis = NoneSet(values=(['axisRow', 'axisCol', 'axisPage', 'axisValues']))
  553. dataField = Bool(allow_none=True)
  554. subtotalCaption = String(allow_none=True)
  555. showDropDowns = Bool(allow_none=True)
  556. hiddenLevel = Bool(allow_none=True)
  557. uniqueMemberProperty = String(allow_none=True)
  558. compact = Bool(allow_none=True)
  559. allDrilled = Bool(allow_none=True)
  560. numFmtId = Integer(allow_none=True)
  561. outline = Bool(allow_none=True)
  562. subtotalTop = Bool(allow_none=True)
  563. dragToRow = Bool(allow_none=True)
  564. dragToCol = Bool(allow_none=True)
  565. multipleItemSelectionAllowed = Bool(allow_none=True)
  566. dragToPage = Bool(allow_none=True)
  567. dragToData = Bool(allow_none=True)
  568. dragOff = Bool(allow_none=True)
  569. showAll = Bool(allow_none=True)
  570. insertBlankRow = Bool(allow_none=True)
  571. serverField = Bool(allow_none=True)
  572. insertPageBreak = Bool(allow_none=True)
  573. autoShow = Bool(allow_none=True)
  574. topAutoShow = Bool(allow_none=True)
  575. hideNewItems = Bool(allow_none=True)
  576. measureFilter = Bool(allow_none=True)
  577. includeNewItemsInFilter = Bool(allow_none=True)
  578. itemPageCount = Integer(allow_none=True)
  579. sortType = Set(values=(['manual', 'ascending', 'descending']))
  580. dataSourceSort = Bool(allow_none=True)
  581. nonAutoSortDefault = Bool(allow_none=True)
  582. rankBy = Integer(allow_none=True)
  583. defaultSubtotal = Bool(allow_none=True)
  584. sumSubtotal = Bool(allow_none=True)
  585. countASubtotal = Bool(allow_none=True)
  586. avgSubtotal = Bool(allow_none=True)
  587. maxSubtotal = Bool(allow_none=True)
  588. minSubtotal = Bool(allow_none=True)
  589. productSubtotal = Bool(allow_none=True)
  590. countSubtotal = Bool(allow_none=True)
  591. stdDevSubtotal = Bool(allow_none=True)
  592. stdDevPSubtotal = Bool(allow_none=True)
  593. varSubtotal = Bool(allow_none=True)
  594. varPSubtotal = Bool(allow_none=True)
  595. showPropCell = Bool(allow_none=True)
  596. showPropTip = Bool(allow_none=True)
  597. showPropAsCaption = Bool(allow_none=True)
  598. defaultAttributeDrillState = Bool(allow_none=True)
  599. __elements__ = ('items', 'autoSortScope',)
  600. def __init__(self,
  601. items=(),
  602. autoSortScope=None,
  603. name=None,
  604. axis=None,
  605. dataField=None,
  606. subtotalCaption=None,
  607. showDropDowns=True,
  608. hiddenLevel=None,
  609. uniqueMemberProperty=None,
  610. compact=True,
  611. allDrilled=None,
  612. numFmtId=None,
  613. outline=True,
  614. subtotalTop=True,
  615. dragToRow=True,
  616. dragToCol=True,
  617. multipleItemSelectionAllowed=None,
  618. dragToPage=True,
  619. dragToData=True,
  620. dragOff=True,
  621. showAll=True,
  622. insertBlankRow=None,
  623. serverField=None,
  624. insertPageBreak=None,
  625. autoShow=None,
  626. topAutoShow=True,
  627. hideNewItems=None,
  628. measureFilter=None,
  629. includeNewItemsInFilter=None,
  630. itemPageCount=10,
  631. sortType="manual",
  632. dataSourceSort=None,
  633. nonAutoSortDefault=None,
  634. rankBy=None,
  635. defaultSubtotal=True,
  636. sumSubtotal=None,
  637. countASubtotal=None,
  638. avgSubtotal=None,
  639. maxSubtotal=None,
  640. minSubtotal=None,
  641. productSubtotal=None,
  642. countSubtotal=None,
  643. stdDevSubtotal=None,
  644. stdDevPSubtotal=None,
  645. varSubtotal=None,
  646. varPSubtotal=None,
  647. showPropCell=None,
  648. showPropTip=None,
  649. showPropAsCaption=None,
  650. defaultAttributeDrillState=None,
  651. extLst=None,
  652. ):
  653. self.items = items
  654. self.autoSortScope = autoSortScope
  655. self.name = name
  656. self.axis = axis
  657. self.dataField = dataField
  658. self.subtotalCaption = subtotalCaption
  659. self.showDropDowns = showDropDowns
  660. self.hiddenLevel = hiddenLevel
  661. self.uniqueMemberProperty = uniqueMemberProperty
  662. self.compact = compact
  663. self.allDrilled = allDrilled
  664. self.numFmtId = numFmtId
  665. self.outline = outline
  666. self.subtotalTop = subtotalTop
  667. self.dragToRow = dragToRow
  668. self.dragToCol = dragToCol
  669. self.multipleItemSelectionAllowed = multipleItemSelectionAllowed
  670. self.dragToPage = dragToPage
  671. self.dragToData = dragToData
  672. self.dragOff = dragOff
  673. self.showAll = showAll
  674. self.insertBlankRow = insertBlankRow
  675. self.serverField = serverField
  676. self.insertPageBreak = insertPageBreak
  677. self.autoShow = autoShow
  678. self.topAutoShow = topAutoShow
  679. self.hideNewItems = hideNewItems
  680. self.measureFilter = measureFilter
  681. self.includeNewItemsInFilter = includeNewItemsInFilter
  682. self.itemPageCount = itemPageCount
  683. self.sortType = sortType
  684. self.dataSourceSort = dataSourceSort
  685. self.nonAutoSortDefault = nonAutoSortDefault
  686. self.rankBy = rankBy
  687. self.defaultSubtotal = defaultSubtotal
  688. self.sumSubtotal = sumSubtotal
  689. self.countASubtotal = countASubtotal
  690. self.avgSubtotal = avgSubtotal
  691. self.maxSubtotal = maxSubtotal
  692. self.minSubtotal = minSubtotal
  693. self.productSubtotal = productSubtotal
  694. self.countSubtotal = countSubtotal
  695. self.stdDevSubtotal = stdDevSubtotal
  696. self.stdDevPSubtotal = stdDevPSubtotal
  697. self.varSubtotal = varSubtotal
  698. self.varPSubtotal = varPSubtotal
  699. self.showPropCell = showPropCell
  700. self.showPropTip = showPropTip
  701. self.showPropAsCaption = showPropAsCaption
  702. self.defaultAttributeDrillState = defaultAttributeDrillState
  703. class Location(Serialisable):
  704. tagname = "location"
  705. ref = String()
  706. firstHeaderRow = Integer()
  707. firstDataRow = Integer()
  708. firstDataCol = Integer()
  709. rowPageCount = Integer(allow_none=True)
  710. colPageCount = Integer(allow_none=True)
  711. def __init__(self,
  712. ref=None,
  713. firstHeaderRow=None,
  714. firstDataRow=None,
  715. firstDataCol=None,
  716. rowPageCount=None,
  717. colPageCount=None,
  718. ):
  719. self.ref = ref
  720. self.firstHeaderRow = firstHeaderRow
  721. self.firstDataRow = firstDataRow
  722. self.firstDataCol = firstDataCol
  723. self.rowPageCount = rowPageCount
  724. self.colPageCount = colPageCount
  725. class TableDefinition(Serialisable):
  726. mime_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml"
  727. rel_type = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable"
  728. _id = 1
  729. _path = "/xl/pivotTables/pivotTable{0}.xml"
  730. tagname = "pivotTableDefinition"
  731. cache = None
  732. name = String()
  733. cacheId = Integer()
  734. dataOnRows = Bool()
  735. dataPosition = Integer(allow_none=True)
  736. dataCaption = String()
  737. grandTotalCaption = String(allow_none=True)
  738. errorCaption = String(allow_none=True)
  739. showError = Bool()
  740. missingCaption = String(allow_none=True)
  741. showMissing = Bool()
  742. pageStyle = String(allow_none=True)
  743. pivotTableStyle = String(allow_none=True)
  744. vacatedStyle = String(allow_none=True)
  745. tag = String(allow_none=True)
  746. updatedVersion = Integer()
  747. minRefreshableVersion = Integer()
  748. asteriskTotals = Bool()
  749. showItems = Bool()
  750. editData = Bool()
  751. disableFieldList = Bool()
  752. showCalcMbrs = Bool()
  753. visualTotals = Bool()
  754. showMultipleLabel = Bool()
  755. showDataDropDown = Bool()
  756. showDrill = Bool()
  757. printDrill = Bool()
  758. showMemberPropertyTips = Bool()
  759. showDataTips = Bool()
  760. enableWizard = Bool()
  761. enableDrill = Bool()
  762. enableFieldProperties = Bool()
  763. preserveFormatting = Bool()
  764. useAutoFormatting = Bool()
  765. pageWrap = Integer()
  766. pageOverThenDown = Bool()
  767. subtotalHiddenItems = Bool()
  768. rowGrandTotals = Bool()
  769. colGrandTotals = Bool()
  770. fieldPrintTitles = Bool()
  771. itemPrintTitles = Bool()
  772. mergeItem = Bool()
  773. showDropZones = Bool()
  774. createdVersion = Integer()
  775. indent = Integer()
  776. showEmptyRow = Bool()
  777. showEmptyCol = Bool()
  778. showHeaders = Bool()
  779. compact = Bool()
  780. outline = Bool()
  781. outlineData = Bool()
  782. compactData = Bool()
  783. published = Bool()
  784. gridDropZones = Bool()
  785. immersive = Bool()
  786. multipleFieldFilters = Bool()
  787. chartFormat = Integer()
  788. rowHeaderCaption = String(allow_none=True)
  789. colHeaderCaption = String(allow_none=True)
  790. fieldListSortAscending = Bool()
  791. mdxSubqueries = Bool()
  792. customListSort = Bool(allow_none=True)
  793. autoFormatId = Integer(allow_none=True)
  794. applyNumberFormats = Bool()
  795. applyBorderFormats = Bool()
  796. applyFontFormats = Bool()
  797. applyPatternFormats = Bool()
  798. applyAlignmentFormats = Bool()
  799. applyWidthHeightFormats = Bool()
  800. location = Typed(expected_type=Location, )
  801. pivotFields = NestedSequence(expected_type=PivotField, count=True)
  802. rowFields = NestedSequence(expected_type=RowColField, count=True)
  803. rowItems = NestedSequence(expected_type=RowColItem, count=True)
  804. colFields = NestedSequence(expected_type=RowColField, count=True)
  805. colItems = NestedSequence(expected_type=RowColItem, count=True)
  806. pageFields = NestedSequence(expected_type=PageField, count=True)
  807. dataFields = NestedSequence(expected_type=DataField, count=True)
  808. formats = NestedSequence(expected_type=Format, count=True)
  809. conditionalFormats = NestedSequence(expected_type=ConditionalFormat, count=True)
  810. chartFormats = NestedSequence(expected_type=ChartFormat, count=True)
  811. pivotHierarchies = NestedSequence(expected_type=PivotHierarchy, count=True)
  812. pivotTableStyleInfo = Typed(expected_type=PivotTableStyle, allow_none=True)
  813. filters = NestedSequence(expected_type=PivotFilter, count=True)
  814. rowHierarchiesUsage = Typed(expected_type=RowHierarchiesUsage, allow_none=True)
  815. colHierarchiesUsage = Typed(expected_type=ColHierarchiesUsage, allow_none=True)
  816. extLst = Typed(expected_type=ExtensionList, allow_none=True)
  817. id = Relation()
  818. __elements__ = ('location', 'pivotFields', 'rowFields', 'rowItems',
  819. 'colFields', 'colItems', 'pageFields', 'dataFields', 'formats',
  820. 'conditionalFormats', 'chartFormats', 'pivotHierarchies',
  821. 'pivotTableStyleInfo', 'filters', 'rowHierarchiesUsage',
  822. 'colHierarchiesUsage',)
  823. def __init__(self,
  824. name=None,
  825. cacheId=None,
  826. dataOnRows=False,
  827. dataPosition=None,
  828. dataCaption=None,
  829. grandTotalCaption=None,
  830. errorCaption=None,
  831. showError=False,
  832. missingCaption=None,
  833. showMissing=True,
  834. pageStyle=None,
  835. pivotTableStyle=None,
  836. vacatedStyle=None,
  837. tag=None,
  838. updatedVersion=0,
  839. minRefreshableVersion=0,
  840. asteriskTotals=False,
  841. showItems=True,
  842. editData=False,
  843. disableFieldList=False,
  844. showCalcMbrs=True,
  845. visualTotals=True,
  846. showMultipleLabel=True,
  847. showDataDropDown=True,
  848. showDrill=True,
  849. printDrill=False,
  850. showMemberPropertyTips=True,
  851. showDataTips=True,
  852. enableWizard=True,
  853. enableDrill=True,
  854. enableFieldProperties=True,
  855. preserveFormatting=True,
  856. useAutoFormatting=False,
  857. pageWrap=0,
  858. pageOverThenDown=False,
  859. subtotalHiddenItems=False,
  860. rowGrandTotals=True,
  861. colGrandTotals=True,
  862. fieldPrintTitles=False,
  863. itemPrintTitles=False,
  864. mergeItem=False,
  865. showDropZones=True,
  866. createdVersion=0,
  867. indent=1,
  868. showEmptyRow=False,
  869. showEmptyCol=False,
  870. showHeaders=True,
  871. compact=True,
  872. outline=False,
  873. outlineData=False,
  874. compactData=True,
  875. published=False,
  876. gridDropZones=False,
  877. immersive=True,
  878. multipleFieldFilters=None,
  879. chartFormat=0,
  880. rowHeaderCaption=None,
  881. colHeaderCaption=None,
  882. fieldListSortAscending=None,
  883. mdxSubqueries=None,
  884. customListSort=None,
  885. autoFormatId=None,
  886. applyNumberFormats=False,
  887. applyBorderFormats=False,
  888. applyFontFormats=False,
  889. applyPatternFormats=False,
  890. applyAlignmentFormats=False,
  891. applyWidthHeightFormats=False,
  892. location=None,
  893. pivotFields=(),
  894. rowFields=(),
  895. rowItems=(),
  896. colFields=(),
  897. colItems=(),
  898. pageFields=(),
  899. dataFields=(),
  900. formats=(),
  901. conditionalFormats=(),
  902. chartFormats=(),
  903. pivotHierarchies=(),
  904. pivotTableStyleInfo=None,
  905. filters=(),
  906. rowHierarchiesUsage=None,
  907. colHierarchiesUsage=None,
  908. extLst=None,
  909. id=None,
  910. ):
  911. self.name = name
  912. self.cacheId = cacheId
  913. self.dataOnRows = dataOnRows
  914. self.dataPosition = dataPosition
  915. self.dataCaption = dataCaption
  916. self.grandTotalCaption = grandTotalCaption
  917. self.errorCaption = errorCaption
  918. self.showError = showError
  919. self.missingCaption = missingCaption
  920. self.showMissing = showMissing
  921. self.pageStyle = pageStyle
  922. self.pivotTableStyle = pivotTableStyle
  923. self.vacatedStyle = vacatedStyle
  924. self.tag = tag
  925. self.updatedVersion = updatedVersion
  926. self.minRefreshableVersion = minRefreshableVersion
  927. self.asteriskTotals = asteriskTotals
  928. self.showItems = showItems
  929. self.editData = editData
  930. self.disableFieldList = disableFieldList
  931. self.showCalcMbrs = showCalcMbrs
  932. self.visualTotals = visualTotals
  933. self.showMultipleLabel = showMultipleLabel
  934. self.showDataDropDown = showDataDropDown
  935. self.showDrill = showDrill
  936. self.printDrill = printDrill
  937. self.showMemberPropertyTips = showMemberPropertyTips
  938. self.showDataTips = showDataTips
  939. self.enableWizard = enableWizard
  940. self.enableDrill = enableDrill
  941. self.enableFieldProperties = enableFieldProperties
  942. self.preserveFormatting = preserveFormatting
  943. self.useAutoFormatting = useAutoFormatting
  944. self.pageWrap = pageWrap
  945. self.pageOverThenDown = pageOverThenDown
  946. self.subtotalHiddenItems = subtotalHiddenItems
  947. self.rowGrandTotals = rowGrandTotals
  948. self.colGrandTotals = colGrandTotals
  949. self.fieldPrintTitles = fieldPrintTitles
  950. self.itemPrintTitles = itemPrintTitles
  951. self.mergeItem = mergeItem
  952. self.showDropZones = showDropZones
  953. self.createdVersion = createdVersion
  954. self.indent = indent
  955. self.showEmptyRow = showEmptyRow
  956. self.showEmptyCol = showEmptyCol
  957. self.showHeaders = showHeaders
  958. self.compact = compact
  959. self.outline = outline
  960. self.outlineData = outlineData
  961. self.compactData = compactData
  962. self.published = published
  963. self.gridDropZones = gridDropZones
  964. self.immersive = immersive
  965. self.multipleFieldFilters = multipleFieldFilters
  966. self.chartFormat = chartFormat
  967. self.rowHeaderCaption = rowHeaderCaption
  968. self.colHeaderCaption = colHeaderCaption
  969. self.fieldListSortAscending = fieldListSortAscending
  970. self.mdxSubqueries = mdxSubqueries
  971. self.customListSort = customListSort
  972. self.autoFormatId = autoFormatId
  973. self.applyNumberFormats = applyNumberFormats
  974. self.applyBorderFormats = applyBorderFormats
  975. self.applyFontFormats = applyFontFormats
  976. self.applyPatternFormats = applyPatternFormats
  977. self.applyAlignmentFormats = applyAlignmentFormats
  978. self.applyWidthHeightFormats = applyWidthHeightFormats
  979. self.location = location
  980. self.pivotFields = pivotFields
  981. self.rowFields = rowFields
  982. self.rowItems = rowItems
  983. self.colFields = colFields
  984. self.colItems = colItems
  985. self.pageFields = pageFields
  986. self.dataFields = dataFields
  987. self.formats = formats
  988. self.conditionalFormats = conditionalFormats
  989. self.chartFormats = chartFormats
  990. self.pivotHierarchies = pivotHierarchies
  991. self.pivotTableStyleInfo = pivotTableStyleInfo
  992. self.filters = filters
  993. self.rowHierarchiesUsage = rowHierarchiesUsage
  994. self.colHierarchiesUsage = colHierarchiesUsage
  995. self.extLst = extLst
  996. self.id = id
  997. def to_tree(self):
  998. tree = super(TableDefinition, self).to_tree()
  999. tree.set("xmlns", SHEET_MAIN_NS)
  1000. return tree
  1001. @property
  1002. def path(self):
  1003. return self._path.format(self._id)
  1004. def _write(self, archive, manifest):
  1005. """
  1006. Add to zipfile and update manifest
  1007. """
  1008. self._write_rels(archive, manifest)
  1009. xml = tostring(self.to_tree())
  1010. archive.writestr(self.path[1:], xml)
  1011. manifest.append(self)
  1012. def _write_rels(self, archive, manifest):
  1013. """
  1014. Write the relevant child objects and add links
  1015. """
  1016. if self.cache is None:
  1017. return
  1018. rels = RelationshipList()
  1019. r = Relationship(Type=self.cache.rel_type, Target=self.cache.path)
  1020. rels.append(r)
  1021. self.id = r.id
  1022. if self.cache.path[1:] not in archive.namelist():
  1023. self.cache._write(archive, manifest)
  1024. path = get_rels_path(self.path)
  1025. xml = tostring(rels.to_tree())
  1026. archive.writestr(path[1:], xml)