Я работаю в LabVIEW 2018 над заменой ВП автоматизации Excel COM узлом Call Python, используя библиотеки OpenPyXL 3.0.3 и Python 3.8.x для чтения и извлечения значения диапазона ячеек из указанный рабочий лист и указанную книгу. У меня есть несколько тестовых примеров, которые работают хорошо; Основное различие между COM и OpenPyXL, с которым я сталкиваюсь, - это обработка ячеек с отметками даты. отформатируйте ячейку или столбец. Мой внутренний код LabVIEW ожидает этот формат и имеет необходимый код форматирования для преобразования из этого формата в формат даты эпохи LabVIEW.
С OpenPyXL всегда кажется, что преобразование этих ячеек происходит в краткий формат даты системы. Есть ли способ получить доступ к этому числовому значению c через OpenPyXL?
Моя функция:
def GetXLSXWorksheetCellsV2(XLSXfile, XLSXsheet, minRow, minCol, maxRow, maxCol):
from openpyxl import load_workbook
wb = load_workbook(XLSXfile,False)
ws = wb[XLSXsheet]
def iter_rows(wsht):
conv = lambda i : i or ''
for wcol in wsht.iter_rows(minCol, maxCol, minRow, maxRow):
yield tuple(str(conv(wcell.value)) for wcell in wcol)
tupleList = tuple(iter_rows(ws))
finalList = [list(tupleElem) for tupleElem in tupleList]
wb.close()
return finalList
(Я конвертирую кортеж кортежей в список списков, потому что LabVIEW преобразует кортежи в кластеры и преобразует списки в массивы; 2D-массив намного проще, чем кластер кластеров!)
EDIT: потенциальный обходной путь, найденный в документации (касающийся закладки производительности ), не работает.
Одно из основных различий между библиотеками заключается в том, что режим openpyxl только для чтения открывает книгу почти сразу, что делает ее пригодной для нескольких процессов, это также значительно сокращает использование памяти. xlrd также не выполняет автоматическое преобразование даты и времени в Python datetimes , хотя делает соответствующие аннотации ячеек, но выполнение этого в клиентском коде значительно снижает производительность.
Рефакторинг load_workbook команда, чтобы сделать read_only True:
wb = load_workbook(XLSXfile, True, False, True, True)
по-прежнему дает данные datetime в результатах (а не значения эпохи Excel).
EDIT: Duh. xlrd - это отдельный продукт, а не только для чтения.