123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- from __future__ import absolute_import
- # Copyright (c) 2010-2019 openpyxl
- from openpyxl.cell import Cell
- from openpyxl.utils import get_column_letter
- from openpyxl.utils.datetime import from_excel
- from openpyxl.styles import is_date_format
- from openpyxl.styles.numbers import BUILTIN_FORMATS, BUILTIN_FORMATS_MAX_SIZE
- class ReadOnlyCell(object):
- __slots__ = ('parent', 'row', 'column', '_value', 'data_type', '_style_id')
- def __init__(self, sheet, row, column, value, data_type='n', style_id=0):
- self.parent = sheet
- self._value = None
- self.row = row
- self.column = column
- self.data_type = data_type
- self.value = value
- self._style_id = style_id
- def __eq__(self, other):
- for a in self.__slots__:
- if getattr(self, a) != getattr(other, a):
- return
- return True
- def __ne__(self, other):
- return not self.__eq__(other)
- def __repr__(self):
- return "<ReadOnlyCell {0!r}.{1}>".format(self.parent.title, self.coordinate)
- @property
- def coordinate(self):
- column = get_column_letter(self.column)
- return "{1}{0}".format(self.row, column)
- @property
- def coordinate(self):
- return Cell.coordinate.__get__(self)
- @property
- def column_letter(self):
- return Cell.column_letter.__get__(self)
- @property
- def style_array(self):
- return self.parent.parent._cell_styles[self._style_id]
- @property
- def number_format(self):
- _id = self.style_array.numFmtId
- if _id < BUILTIN_FORMATS_MAX_SIZE:
- return BUILTIN_FORMATS.get(_id, "General")
- else:
- return self.parent.parent._number_formats[
- _id - BUILTIN_FORMATS_MAX_SIZE]
- @property
- def font(self):
- _id = self.style_array.fontId
- return self.parent.parent._fonts[_id]
- @property
- def fill(self):
- _id = self.style_array.fillId
- return self.parent.parent._fills[_id]
- @property
- def border(self):
- _id = self.style_array.borderId
- return self.parent.parent._borders[_id]
- @property
- def alignment(self):
- _id = self.style_array.alignmentId
- return self.parent.parent._alignments[_id]
- @property
- def protection(self):
- _id = self.style_array.protectionId
- return self.parent.parent._protections[_id]
- @property
- def is_date(self):
- return Cell.is_date.__get__(self)
- @property
- def internal_value(self):
- return self._value
- @property
- def value(self):
- return self._value
- @value.setter
- def value(self, value):
- if self._value is not None:
- raise AttributeError("Cell is read only")
- self._value = value
- class EmptyCell(object):
- __slots__ = ()
- value = None
- is_date = False
- font = None
- border = None
- fill = None
- number_format = None
- alignment = None
- data_type = 'n'
- def __repr__(self):
- return "<EmptyCell>"
- EMPTY_CELL = EmptyCell()
|