1# Copyright (c) 2010-2024 openpyxl
2
3from openpyxl.descriptors.serialisable import Serialisable
4from openpyxl.descriptors import (
5 Typed,
6 Integer,
7 Sequence,
8)
9from openpyxl.descriptors.sequence import (
10 MultiSequence,
11 MultiSequencePart,
12)
13from openpyxl.descriptors.excel import ExtensionList
14from openpyxl.descriptors.nested import (
15 NestedInteger,
16 NestedBool,
17)
18
19from openpyxl.xml.constants import SHEET_MAIN_NS
20from openpyxl.xml.functions import tostring
21
22from .fields import (
23 Boolean,
24 Error,
25 Missing,
26 Number,
27 Text,
28 TupleList,
29 DateTimeField,
30 Index,
31)
32
33
34class Record(Serialisable):
35
36 tagname = "r"
37
38 _fields = MultiSequence()
39 m = MultiSequencePart(expected_type=Missing, store="_fields")
40 n = MultiSequencePart(expected_type=Number, store="_fields")
41 b = MultiSequencePart(expected_type=Boolean, store="_fields")
42 e = MultiSequencePart(expected_type=Error, store="_fields")
43 s = MultiSequencePart(expected_type=Text, store="_fields")
44 d = MultiSequencePart(expected_type=DateTimeField, store="_fields")
45 x = MultiSequencePart(expected_type=Index, store="_fields")
46
47
48 def __init__(self,
49 _fields=(),
50 m=None,
51 n=None,
52 b=None,
53 e=None,
54 s=None,
55 d=None,
56 x=None,
57 ):
58 self._fields = _fields
59
60
61class RecordList(Serialisable):
62
63 mime_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml"
64 rel_type = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheRecords"
65 _id = 1
66 _path = "/xl/pivotCache/pivotCacheRecords{0}.xml"
67
68 tagname ="pivotCacheRecords"
69
70 r = Sequence(expected_type=Record, allow_none=True)
71 extLst = Typed(expected_type=ExtensionList, allow_none=True)
72
73 __elements__ = ('r', )
74 __attrs__ = ('count', )
75
76 def __init__(self,
77 count=None,
78 r=(),
79 extLst=None,
80 ):
81 self.r = r
82 self.extLst = extLst
83
84
85 @property
86 def count(self):
87 return len(self.r)
88
89
90 def to_tree(self):
91 tree = super().to_tree()
92 tree.set("xmlns", SHEET_MAIN_NS)
93 return tree
94
95
96 @property
97 def path(self):
98 return self._path.format(self._id)
99
100
101 def _write(self, archive, manifest):
102 """
103 Write to zipfile and update manifest
104 """
105 xml = tostring(self.to_tree())
106 archive.writestr(self.path[1:], xml)
107 manifest.append(self)
108
109
110 def _write_rels(self, archive, manifest):
111 pass