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

1# Copyright (c) 2010-2022 openpyxl 

2 

3import posixpath 

4from warnings import warn 

5 

6from openpyxl.xml.functions import fromstring 

7 

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 

23 

24from openpyxl.utils.datetime import CALENDAR_MAC_1904 

25 

26 

27class WorkbookParser: 

28 

29 _rels = None 

30 

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 = [] 

37 

38 

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 

44 

45 

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 

52 

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 

59 

60 #external links contain cached worksheets and can be very big 

61 if not self.keep_links: 

62 package.externalReferences = [] 

63 

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 ) 

69 

70 if package.definedNames: 

71 package.definedNames._cleanup() 

72 self.wb.defined_names = package.definedNames 

73 

74 self.wb.security = package.workbookProtection 

75 

76 

77 def find_sheets(self): 

78 """ 

79 Find all sheets in the workbook and return the link to the source file. 

80 

81 Older XLSM files sometimes contain invalid sheet elements. 

82 Warn user when these are removed. 

83 """ 

84 

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] 

91 

92 

93 def assign_names(self): 

94 """ 

95 Bind reserved names to parsed worksheets 

96 """ 

97 defns = [] 

98 

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 

112 

113 

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