Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pandas从excel中读取下拉列表值_Python_Excel_Python 3.x_Pandas_Xlsx - Fatal编程技术网

Python 使用pandas从excel中读取下拉列表值

Python 使用pandas从excel中读取下拉列表值,python,excel,python-3.x,pandas,xlsx,Python,Excel,Python 3.x,Pandas,Xlsx,我有一个带下拉单元格的excel。我一直在尝试读取excel下拉列表,但它只读取选定的选项 输出: Empty DataFrame Columns: [Column 1, Column 2, Column 3, Column 4, yes] Index: [] 预期产出: Empty DataFrame Columns: [Column 1, Column 2, Column 3, Column 4, [yes, no, yes1, no1]] Index: [] 您可以使用open

我有一个带下拉单元格的excel。我一直在尝试读取excel下拉列表,但它只读取选定的选项

输出:

 Empty DataFrame
 Columns: [Column 1, Column 2, Column 3, Column 4, yes]
 Index: []
预期产出:

Empty DataFrame
Columns: [Column 1, Column 2, Column 3, Column 4, [yes, no, yes1, no1]]
Index: []

您可以使用
openpyxl
提取下拉信息:它存储在给定工作表的数据验证中。例如(为可读性插入换行符):

给我(再次插入换行符):


这是一个有趣的问题,希望有人能给出答案。我的直觉告诉我,它在python和xlrd等中不可用。在.NET和excel interop中,您需要单元格验证属性。请参阅:。一个可能仍然没有结果的建议是查看xlwings。将列表存储在单元格中通常是一个很糟糕的主意,但在列中使用列表确实很困难。有没有一种更明智的储存方法,你会接受吗,给我任何方法,我可以阅读所有的选项cell@ReKx不确定您是否仍然关心此问题,但我所做的是将选项列表存储在字典中,然后将选项的键存储在数据框中。我得到一个错误:
-->ranges=validation.sqref.ranges
AttributeError:'str'对象没有属性“ranges”
回答得很好,对我很有用。只需删除您的第一个
if,else
语句,因为我的工作表有多个范围,其中有下拉菜单。
Empty DataFrame
Columns: [Column 1, Column 2, Column 3, Column 4, [yes, no, yes1, no1]]
Index: []
>>> wb = openpyxl.load_workbook("dropdown.xlsx")
>>> ws = wb["Sheet1"]
>>> ws.data_validations
<openpyxl.worksheet.datavalidation.DataValidationList object>
Parameters:
disablePrompts=None, xWindow=None, yWindow=None, count=1, 
dataValidation=[<openpyxl.worksheet.datavalidation.DataValidation object>
Parameters:
sqref=<MultiCellRange [E1]>, showErrorMessage=True, showDropDown=None, showInputMessage=True, 
allowBlank=False, errorTitle=None, error=None, promptTitle=None, prompt=None,
type='list', errorStyle=None, imeMode=None, operator=None, formula1='$L$4:$L$7', formula2=None]
def read_with_dropdown(book_name, sheet_name, range_str):
    wb = openpyxl.load_workbook(book_name)
    ws = wb[sheet_name]
    data = [[cell.value for cell in row] for row in ws[range_str]]

    validations = ws.data_validations.dataValidation
    for validation in validations:
        ranges = validation.sqref.ranges
        if len(ranges) != 1:
            raise NotImplementedError
        if validation.type == 'list':
            list_cells = ws[validation.formula1]
            values = [cell.value for cell_row in list_cells for cell in cell_row]
        else:
            raise NotImplementedError
        bounds = ranges[0].bounds
        try:
            data[bounds[1]-1][bounds[0]-1] = values
        except IndexError:
            pass
    return data
>>> data = read_with_dropdown("dropdown.xlsx", "Sheet1", "A1:E5")
>>> data
[['Column 1', 'Column 2', 'Column 3', 'Column 4', ['yes', 'no', 'yes1', 'no1']],
 [None, None, None, None, None],
 [None, None, None, None, None],
 [None, None, None, None, None],
 [None, None, None, None, None]]