This commit is contained in:
2025-09-11 16:35:22 +03:00
parent babf491c8e
commit 6920d24a98
6 changed files with 173 additions and 276486 deletions

View File

@@ -15,7 +15,7 @@ class TranschendentnostCell:
self._is_empty = is_empty
def is_empty(self):
self._is_empty
return self._is_empty
class ExcelSheetReader(ABC):
"""
@@ -25,6 +25,18 @@ class ExcelSheetReader(ABC):
def __init__(self, file_path):
self.file_path = file_path
@abstractmethod
def get_sheet_index(self):
pass
@abstractmethod
def has_next_sheet(self):
pass
@abstractmethod
def next_sheet(self):
pass
@abstractmethod
def get_cell_value(self, row, col):
"""Возвращает значение ячейки по 0-индексированным координатам."""
@@ -96,8 +108,23 @@ class ExcelSheetReader(ABC):
class XlrdSheetReader(ExcelSheetReader):
def __init__(self, file_path, sheet_index=0):
super().__init__(file_path)
self.sheet_index = sheet_index
self.book = xlrd.open_workbook(file_path, formatting_info=True)
self.sheet = self.book.sheet_by_index(sheet_index)
self.init_sheet()
def get_sheet_index(self):
return self.sheet_index
def init_sheet(self):
self.sheet = self.book.sheet_by_index(self.sheet_index)
def has_next_sheet(self):
return self.sheet_index < len(self.book.sheet_names())-1
def next_sheet(self):
if self.has_next_sheet():
self.sheet_index += 1
self.init_sheet()
def get_cell_value(self, row, col):
# Проверка на выход за пределы таблицы, чтобы избежать ошибок
@@ -106,9 +133,9 @@ class XlrdSheetReader(ExcelSheetReader):
return None
def info(self):
print("The number of worksheets is {0}".format(self.book.nsheets))
print("Worksheet name(s): {0}".format(self.book.sheet_names()))
return "'{0}': size: {1}x{2} names: ".format(self.sheet.name, self.sheet.nrows, self.sheet.ncols, " ".join(self.book.sheet_names()))
return """[XLRD (.xls)] The number of worksheets is {0}
Worksheet name(s): {1}
'{2}': size: {3}x{4}""".format(self.book.nsheets, self.book.sheet_names(), self.sheet.name, self.sheet.nrows, self.sheet.ncols)
def cell(self, row, col):
"""Возвращает абстрактную клетку"""
@@ -150,8 +177,9 @@ class XlrdSheetReader(ExcelSheetReader):
class OpenpyxlSheetReader(ExcelSheetReader):
def __init__(self, file_path, sheet_name=None):
super().__init__(file_path)
self.sheet_index = 0
self.workbook = openpyxl.load_workbook(file_path, data_only=True)
self.sheet = self.workbook[sheet_name] if sheet_name else self.workbook.active
self.init_sheet()
# Словарь для трансляции стилей границ openpyxl в числовые коды xlrd
self.BORDER_STYLE_MAP = {
@@ -161,6 +189,26 @@ class OpenpyxlSheetReader(ExcelSheetReader):
'slantDashDot': 13
}
def get_sheet_index(self):
return self.sheet_index
def has_next_sheet(self):
return self.sheet_index < len(self.workbook.sheetnames)-1
def next_sheet(self):
if self.has_next_sheet():
self.sheet_index += 1
self.init_sheet()
def init_sheet(self):
self.sheet = self.workbook[self.workbook.sheetnames[self.sheet_index]]
def info(self):
return """[OpenPyXL (.xlsx)] The number of worksheets is {0}
Worksheet name(s): {1}
'{2}': size: {3}x{4}""".format(len(self.workbook.sheetnames), self.workbook.sheetnames, self.sheet, self.sheet.max_row, self.sheet.max_column)
def _get_cell(self, row, col):
"""Внутренний метод для получения ячейки с преобразованием координат."""
# openpyxl использует 1-индексированную систему