Source code for metapack_build.package.excel
# Copyright (c) 2017 Civic Knowledge. This file is licensed under the terms of the
# MIT License, included in this distribution as LICENSE
""" """
from .core import PackageBuilder
from metapack.util import datetime_now
[docs]class ExcelPackageBuilder(PackageBuilder):
"""An Excel File Package"""
type_code = 'xlsx'
type_suffix = '.xlsx'
def __init__(self, source_ref=None, package_root=None, callback=None, env=None):
super().__init__(source_ref, package_root, callback, env)
self.package_path, self.cache_path = self.make_package_path(self.package_root, self.package_name)
self.cache_path = self.package_name + self.type_suffix
self.package_path = self.package_root.join(self.cache_path)
self.package_root.ensure_dir()
[docs] @classmethod
def make_package_path(cls, package_root, package_name):
cache_path = package_name + cls.type_suffix
package_path = package_root.join(cache_path)
return package_path, cache_path
[docs] def save(self):
from openpyxl import Workbook
from openpyxl.cell import WriteOnlyCell
from openpyxl.styles import PatternFill, Alignment
self.check_is_ready()
self.wb = Workbook(write_only=True)
meta_ws = self.wb.create_sheet()
meta_ws.title = "meta"
meta_ws.sheet_properties.tabColor = "8888ff"
meta_ws.column_dimensions['A'].width = 15
meta_ws.column_dimensions['B'].width = 40
meta_ws.column_dimensions['C'].width = 20
meta_ws.column_dimensions['D'].width = 20
meta_ws.column_dimensions['E'].width = 20
self.sections.resources.sort_by_term()
self.load_declares()
self.doc.cleanse()
self._load_resources()
self._clean_doc()
fill = PatternFill("solid", fgColor="acc0e0") # PatternFill(patternType='gray125')
table_fill = PatternFill("solid", fgColor="d9dce0") # PatternFill(patternType='gray125')
alignment = Alignment(wrap_text=False)
self._doc['Root'].get_or_new_term('Root.Issued').value = datetime_now()
for i, row in enumerate(self.doc.rows, 1):
if row[0] == 'Section' or row[0] == 'Table':
styled_row = []
for c in row + [''] * 5:
cell = WriteOnlyCell(meta_ws, value=c)
cell.fill = fill if row[0] == 'Section' else table_fill
styled_row.append(cell)
meta_ws.append(styled_row)
else:
meta_ws.append(row)
self.wb.save(self.package_path.path)
return self.package_path
def _load_resources(self):
"""Remove the geography from the files, since it isn't particularly useful in Excel"""
for t in self.doc.find('Root.Table'):
for c in t.find('Table.Column'):
if c.get_value('datatype') == 'geometry':
c['transform'] = '^empty_str'
c['datatype'] = 'text'
return super()._load_resources()
def _load_resource(self, source_r, abs_path=False):
r = self._doc.resource(source_r.name)
from itertools import islice
self.prt("Loading data for sheet '{}' ".format(r.name))
ws = self.wb.create_sheet(r.name)
ws.append(r.headers)
for row in islice(r, 1, None):
ws.append(row)
r.url = r.name