Как вы читаете значение ячейки из файла 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 может молча вернуть поддельные данные.

Другие вопросы по тегам