Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/openpyxl/reader/workbook.py: 23%
77 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1# Copyright (c) 2010-2022 openpyxl
3import posixpath
4from warnings import warn
6from openpyxl.xml.functions import fromstring
8from openpyxl.packaging.relationship import (
9 get_dependents,
10 get_rels_path,
11 get_rel,
12)
13from openpyxl.packaging.manifest import Manifest
14from openpyxl.packaging.workbook import WorkbookPackage
15from openpyxl.workbook import Workbook
16from openpyxl.workbook.defined_name import (
17 _unpack_print_area,
18 _unpack_print_titles,
19)
20from openpyxl.workbook.external_link.external import read_external_link
21from openpyxl.pivot.cache import CacheDefinition
22from openpyxl.pivot.record import RecordList
24from openpyxl.utils.datetime import CALENDAR_MAC_1904
27class WorkbookParser:
29 _rels = None
31 def __init__(self, archive, workbook_part_name, keep_links=True):
32 self.archive = archive
33 self.workbook_part_name = workbook_part_name
34 self.wb = Workbook()
35 self.keep_links = keep_links
36 self.sheets = []
39 @property
40 def rels(self):
41 if self._rels is None:
42 self._rels = get_dependents(self.archive, get_rels_path(self.workbook_part_name))
43 return self._rels
46 def parse(self):
47 src = self.archive.read(self.workbook_part_name)
48 node = fromstring(src)
49 package = WorkbookPackage.from_tree(node)
50 if package.properties.date1904:
51 self.wb.epoch = CALENDAR_MAC_1904
53 self.wb.code_name = package.properties.codeName
54 self.wb.active = package.active
55 self.wb.views = package.bookViews
56 self.sheets = package.sheets
57 self.wb.calculation = package.calcPr
58 self.caches = package.pivotCaches
60 #external links contain cached worksheets and can be very big
61 if not self.keep_links:
62 package.externalReferences = []
64 for ext_ref in package.externalReferences:
65 rel = self.rels[ext_ref.id]
66 self.wb._external_links.append(
67 read_external_link(self.archive, rel.Target)
68 )
70 if package.definedNames:
71 package.definedNames._cleanup()
72 self.wb.defined_names = package.definedNames
74 self.wb.security = package.workbookProtection
77 def find_sheets(self):
78 """
79 Find all sheets in the workbook and return the link to the source file.
81 Older XLSM files sometimes contain invalid sheet elements.
82 Warn user when these are removed.
83 """
85 for sheet in self.sheets:
86 if not sheet.id:
87 msg = "File contains an invalid specification for {0}. This will be removed".format(sheet.name)
88 warn(msg)
89 continue
90 yield sheet, self.rels[sheet.id]
93 def assign_names(self):
94 """
95 Bind reserved names to parsed worksheets
96 """
97 defns = []
99 for defn in self.wb.defined_names.definedName:
100 reserved = defn.is_reserved
101 if reserved in ("Print_Titles", "Print_Area"):
102 sheet = self.wb._sheets[defn.localSheetId]
103 if reserved == "Print_Titles":
104 rows, cols = _unpack_print_titles(defn)
105 sheet.print_title_rows = rows
106 sheet.print_title_cols = cols
107 elif reserved == "Print_Area":
108 sheet.print_area = _unpack_print_area(defn)
109 else:
110 defns.append(defn)
111 self.wb.defined_names.definedName = defns
114 @property
115 def pivot_caches(self):
116 """
117 Get PivotCache objects
118 """
119 d = {}
120 for c in self.caches:
121 cache = get_rel(self.archive, self.rels, id=c.id, cls=CacheDefinition)
122 if cache.deps:
123 records = get_rel(self.archive, cache.deps, cache.id, RecordList)
124 cache.records = records
125 d[c.cacheId] = cache
126 return d