python: получить активный лист в xlrd? и помощь для чтения и проверки файла excel в Python

2 вопроса, которые нужно задать:

Вопрос 1. Я только начал изучать xlrd для чтения в Excel. файл на питоне. Мне было интересно, есть ли метод в xlsrd --> аналогичный get_active_sheet() в openpyxl или любой другой другой способ получить активный лист?

get_active_sheet() работает в openpyxl

import openpyxl

wb = openpyxl.load_workbook('example.xlsx')

active_sheet = wb.get_active_sheet()


вывод: Рабочий лист "Лист1"

Я нашел в xlrd методы для получения имен листов, но ни один из них не мог указать мне активный лист.

Вопрос 2:

Является ли xlrd лучшим пакетом в Python для чтения файлов Excel? Я также наткнулся на это, в котором была информация о других пакетах Python (xlsxwriterxlwtxlutils) для чтения и записи файлов Excel.

Что из вышеперечисленного лучше всего подходит для создания приложения, которое читает файл Excel и применяет разные проверки к разным столбцам.

Например: столбец с заголовком «ID» должен иметь уникальные значения, а столбец с заголовком «Страна» должен иметь действительные страны.


person dollardhingra    schedule 21.04.2016    source источник


Ответы (3)


Добро пожаловать в Stack Overflow.

Я уже некоторое время работаю с Excel файлами в Python, поэтому, думаю, я мог бы помочь вам с вашим вопросом.

openpyxl и xlrd решают разные задачи, одна для xlsx файлов (Excel 2007+), а другая для xls файлов (Excel 1997-2003) соответственно.

Xenon сказал в своем ответе, что Excel не признает концепцию active листа, что не совсем верно. Если вы откроете документ Excel, перейдете к другому листу (не первому), сохраните и закроете документ, в следующий раз, когда вы его откроете, Excel откроет документ на последнем листе, на котором вы были.

Однако xlrd не поддерживает такой рабочий процесс, т. е. запрос листа active. Если вы знаете имя листа, вы можете использовать метод sheet_by_name, или если вы знаете индекс листа, вы можете использовать метод sheet_by_index.

Я не знаю, является ли xlrd лучшим комплектом, но он довольно прочный, и у меня не было никаких проблем с его использованием.

Приведенный пример можно решить, сначала перебирая первую строку и сохраняя словарь, для которого столбец является заголовком. Затем сохраняем все значения в столбце ID в списке и сравниваем длину этого списка с длиной набора, созданного из этого списка, т. е. len(values) == len(set(values)). После этого вы можете перебрать столбец с заголовком Country и проверить каждое значение, если оно находится в словаре, который вы ранее создали со всеми допустимыми округами.

Я надеюсь, что этот ответ соответствует вашим потребностям.

Резюме: придерживайтесь xlrd, потому что он достаточно взрослый.

person Simon Stoiljkovikj    schedule 26.08.2016
comment
это неверно, см. мой ответ - желаемая функциональность OP существовала в xlrd в течение 10 лет - person NikT; 11.12.2017
comment
На самом деле, я сомневаюсь в упомянутом вами диапазоне версий. У меня есть несколько файлов Excel, созданных с помощью Excel 2007, которые openpyxl не могут прочитать многие значения ячеек и дают нетиповое значение. Я пробовал с xlrd, и он читался плавно - person FabioSpaghetti; 26.02.2019
comment
Я не уверен, что смогу задать новый вопрос, так как об этом задают так много вопросов. - person FabioSpaghetti; 26.02.2019
comment
потому что кажется, что даже в более высоких версиях Excel xlrd работает лучше - person FabioSpaghetti; 26.02.2019
comment
Я даже сохраняю файл с Excel 2016, но без изменений - person FabioSpaghetti; 26.02.2019

«Активный лист» здесь, кажется, вы имеете в виду последний лист, выбранный при сохранении/закрытии книги. Вы можете получить этот лист через значение sheet_visible.

https://github.com/python-excel/xlrd/blob/master/xlrd/sheet.py#L33

import xlrd
xl = xlrd.open_workbook("example.xls")
for sht in xl.sheets():
    # sht.sheet_visible value of 1 is "active sheet"
    print(sht.name, sht.sheet_selected, sht.sheet_visible)

Обычно за один раз выбирается только один лист, поэтому может показаться, что sheet_visible и sheet_selected одинаковы, но одновременно можно выбрать несколько листов (например, Ctrl + щелчок по вкладкам нескольких листов).

Другая причина, по которой это может показаться запутанным, заключается в том, что Excel использует «видимый» в терминах скрытых/видимых листов. В xlrd это вместо sheet.visibility (см. https://stackoverflow.com/a/44583134/4258124)

person NikT    schedule 29.11.2017
comment
В любом случае, чтобы получить активную ячейку после получения активного листа, как вы упомянули? - person Eswar; 07.10.2018
comment
@ Эсвар не уверен, но я так не думаю. Даже если бы вы могли, я думаю, что действительные варианты использования были бы крайне незначительными или нулевыми. Если вам действительно нужно, вы можете использовать что-то вроде win32com, чтобы открыть Excel и взаимодействовать с ним таким образом. - person NikT; 08.10.2018

Вы можете увидеть все рабочие листы в данной книге с помощью функции sheet_names(). В Excel нет понятия «активный лист», но если мое предположение о том, что вы имеете в виду первый лист, верно, вы можете получить первый элемент sheet_names(), чтобы получить «активный лист».

Что касается вашего второго вопроса, не так просто объективно сказать, что пакет лучше другого. Тем не менее, xlrd широко используется и является самой популярной библиотекой Python для своих целей.

Я бы рекомендовал придерживаться его.

person Cisplatin    schedule 21.04.2016
comment
Спасибо за ваш ответ, под активным листом в Excel я имел в виду лист, который открывается как лист по умолчанию, когда мы открываем файл Excel. Существует концепция активного листа ( нажмите здесь ) в Эксель. - person dollardhingra; 21.04.2016
comment
это неверно, см. мой ответ - желаемая функциональность OP существовала в xlrd в течение 10 лет - person NikT; 11.12.2017
comment
@NikT, какова желаемая функциональность OP? Не могли бы вы объяснить? - person Eswar; 01.10.2018