/usr/lib/python2.7/dist-packages/openpyxl/reader/workbook.py is in python-openpyxl 2.3.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | from __future__ import absolute_import
# Copyright (c) 2010-2015 openpyxl
"""Read in global settings to be maintained by the workbook object."""
# package imports
from openpyxl.xml.functions import fromstring, safe_iterator
from openpyxl.xml.constants import (
DCORE_NS,
COREPROPS_NS,
DCTERMS_NS,
SHEET_MAIN_NS,
CONTYPES_NS,
PKG_REL_NS,
REL_NS,
ARC_CONTENT_TYPES,
ARC_WORKBOOK,
ARC_WORKBOOK_RELS,
WORKSHEET_TYPE,
EXTERNAL_LINK,
)
from openpyxl.workbook import DocumentProperties
from openpyxl.utils.datetime import (
CALENDAR_WINDOWS_1900,
CALENDAR_MAC_1904
)
from openpyxl.workbook.names.named_range import (
NamedRange,
NamedValue,
split_named_range,
refers_to_range,
external_range,
)
import datetime
import re
# constants
VALID_WORKSHEET = WORKSHEET_TYPE
def read_excel_base_date(archive):
src = archive.read(ARC_WORKBOOK)
root = fromstring(src)
wbPr = root.find('{%s}workbookPr' % SHEET_MAIN_NS)
if wbPr is not None and wbPr.get('date1904') in ('1', 'true'):
return CALENDAR_MAC_1904
return CALENDAR_WINDOWS_1900
def read_content_types(archive):
"""Read content types."""
xml_source = archive.read(ARC_CONTENT_TYPES)
root = fromstring(xml_source)
contents_root = root.findall('{%s}Override' % CONTYPES_NS)
for type in contents_root:
yield type.get('ContentType'), type.get('PartName')
def read_rels(archive):
"""Read relationships for a workbook"""
xml_source = archive.read(ARC_WORKBOOK_RELS)
tree = fromstring(xml_source)
for element in safe_iterator(tree, '{%s}Relationship' % PKG_REL_NS):
rId = element.get('Id')
pth = element.get("Target")
typ = element.get('Type')
# normalise path
if pth.startswith("/xl"):
pth = pth.replace("/xl", "xl")
elif not pth.startswith("xl") and not pth.startswith(".."):
pth = "xl/" + pth
yield rId, {'path':pth, 'type':typ}
def read_sheets(archive):
"""Read worksheet titles and ids for a workbook"""
xml_source = archive.read(ARC_WORKBOOK)
tree = fromstring(xml_source)
for element in safe_iterator(tree, '{%s}sheet' % SHEET_MAIN_NS):
attrib = element.attrib
attrib['id'] = attrib["{%s}id" % REL_NS]
del attrib["{%s}id" % REL_NS]
if attrib['id']:
yield attrib
def detect_worksheets(archive):
"""Return a list of worksheets"""
# content types has a list of paths but no titles
# workbook has a list of titles and relIds but no paths
# workbook_rels has a list of relIds and paths but no titles
# rels = {'id':{'title':'', 'path':''} }
content_types = read_content_types(archive)
valid_sheets = dict((path, ct) for ct, path in content_types if ct == VALID_WORKSHEET)
rels = dict(read_rels(archive))
for sheet in read_sheets(archive):
rel = rels[sheet['id']]
rel['title'] = sheet['name']
rel['sheet_id'] = sheet['sheetId']
rel['state'] = sheet.get('state', 'visible')
if ("/" + rel['path'] in valid_sheets
or "worksheets" in rel['path']): # fallback in case content type is missing
yield rel
def detect_external_links(archive):
rels = read_rels(archive)
for rId, d in rels:
if d['type'] == EXTERNAL_LINK:
pth = d['path']
def read_workbook_code_name(xml_source):
tree = fromstring(xml_source)
pr = tree.find("{%s}workbookPr" % SHEET_MAIN_NS)
if pr is None:
pr = {}
return pr.get('codeName', 'ThisWorkbook')
def read_workbook_settings(xml_source):
root = fromstring(xml_source)
view = root.find('*/' '{%s}workbookView' % SHEET_MAIN_NS)
if view is not None:
if 'activeTab' in view.attrib:
return int(view.attrib['activeTab'])
|