record.py 2.6 KB

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