Как вы читаете значение ячейки из файла OpenOffice Calc .ods?

Мне удалось прочитать значение ячейки Excel с помощью xlrd, используя номера столбцов и строк в качестве входных данных. Теперь мне нужно получить доступ к тем же значениям ячеек в некоторых электронных таблицах, которые были сохранены в формате .ods.

Так, например, как мне прочитать с помощью Python значение, хранящееся в ячейке E10 в файле .ods?


person user329257    schedule 29.04.2010    source источник
comment
Некоторые подсказки и небольшой код находятся на solyaris.wordpress. .com/2007/07/06/ Похоже, это не должно быть слишком, слишком сложно (как только вы взломаете XML.   -  person msw    schedule 30.04.2010
comment
@msw: Похоже это не должно быть слишком сложно ... но с тех пор (почти 3 года назад) об этом блоггере ничего не было слышно ;-)   -  person John Machin    schedule 30.04.2010
comment
Можете ли вы положиться на установленный openoffice? API OOo имеет привязки к Python. Хотя API немного сбивает с толку, его использование должно быть более надежным, чем взлом xml.   -  person intuited    schedule 06.06.2010


Ответы (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 ... но это произойдет не скоро. .

person John Machin    schedule 30.04.2010
comment
Учитывая, что две предположительно работающие библиотеки (pyexcel-ods, odfpy) умерли в первом файле, который я тестировал, а третий (ezodf) может молча возвращать фиктивные данные, я бы предпочел не писать свою собственную обработку. Рано или поздно он наткнулся бы на какую-нибудь загадочную и загадочную часть формата файла .ods — как эти существующие решения. - person reducing activity; 15.05.2016

Из библиотек, которые я пробовал, работала ezodf.

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 может молча возвращать поддельные данные.

person reducing activity    schedule 07.02.2016
comment
Спасибо, что обратили мое внимание на серьезную проблему с ezodf здесь. Ваше редактирование было отклонено, но я обновил ответ и добавил информацию в качестве комментария. У меня лично есть большой опыт использования pyexcel-ods. - person Gabriel; 15.05.2016
comment
@Gabriel И в случае этого сбоя pyexcel-ods невиновен. Проблема вызвана ошибкой в ​​LibreOffice (bugs.documentfoundation.org/show_bug.cgi?id= 97631). Просто мне не повезло, что я вызвал какой-то пограничный случай. - person reducing activity; 15.05.2016
comment
Большое спасибо после использования ozodf, я понял, что odfpy был хуже всего, если вы попытаетесь открыть огромный файл, он просто зависнет, потратив много времени на процессор. - person rho; 18.07.2016