Как вы читаете значение ячейки из файла OpenOffice Calc .ods с python?
Я смог прочитать значение ячейки Excel с xlrd, используя номера столбцов и строк в качестве входных данных. Теперь мне нужно получить доступ к тем же значениям ячеек в некоторых электронных таблицах, которые были сохранены в формате.ods.
Так, например, как мне прочитать значение, хранящееся в ячейке E10, из файла.ods из python?
2 ответа
Взломать ваш путь через XML не должно быть слишком сложно... но есть сложности. Только один пример: OOo в своей мудрости решил не писать адрес ячейки явно. Там нет атрибута ячейки, как address="E10"
или же column="E"
; вам нужно сосчитать строки и столбцы.
Пять последовательных пустых ячеек представлены<table:table-cell table:number-columns-repeated="5" />
number-colums-repeated
атрибут по умолчанию равен 1, а также применяется к непустым ячейкам.
Становится хуже, когда вы объединяете ячейки; Вы получаете covered-table-cell
тег, который на 90% совпадает с table-cell
тег и атрибуты number-columns-spanned
а также number-rows-spanned
нужно вычислить в подсчете столбцов и строк.
table:table-row
тег может иметь number-rows-repeated
приписывать. Это можно использовать для повторения содержимого всей непустой строки, но чаще всего это происходит, когда имеется более 1 последовательных пустых строк.
Таким образом, даже если вы будете удовлетворены подходом "работает с моими данными", он не тривиален.
Вы можете посмотреть на ODFpy. Обратите внимание на второе предложение: """В отличие от других более удобных API, по сути, это уровень абстракции чуть выше формата XML." "" Существует сценарий ODF-to-HTML, который (если он написан для ODS, а также для ODT) можно взломать, чтобы получить то, что вы хотите.
Если вы предпочитаете подход "работает почти на всех данных, поддерживается и имеет интерфейс, который вам знаком", вам, возможно, придется подождать, пока функциональность xlrd
... но это не скоро произойдет.
Из библиотек, которые я пробовал езодф, была та, которая работала.
from ezodf import opendoc, Sheet
doc = opendoc('test.ods')
for sheet in doc.sheets:
print sheet.name
cell = sheet['E10']
print cell.value
print cell.value_type
Произошел сбой pyexcel-ods, произошел сбой odfpy, и, кроме того, его документация отсутствует или является ужасной.
Принимая во внимание, что предположительно работающие библиотеки умерли при первом тестируемом файле, я бы предпочел не писать свою собственную обработку, так как рано или поздно это может привести к сбою или, что еще хуже, молча в некоторых странных ситуациях.
РЕДАКТИРОВАТЬ: становится хуже. ezodf может молча вернуть поддельные данные.