Pandas read_excel with Hyperlink

时间:2016-02-10 21:00:18

标签: excel pandas

我有一个Excel电子表格,我正在阅读Pandas DataFrame:

getCurrentUser

但是,电子表格的其中一列包含与其关联的超链接的文本。如何访问Pandas中的基础超链接?

4 个答案:

答案 0 :(得分:6)

这可以通过openpyxl完成,我不确定它可能与Pandas完全相同。以下是我的表现:

Select * From Some_Table Where Field_Name Like 'bla\%bla&2' ESCAPE '\';

您也可以使用iPython,并设置一个等于超链接对象的变量:

import openpxyl wb = openpyxl.load_workbook('yourfile.xlsm') ws = wb.get_sheet_by_name('Sheet1') print(ws.cell(row=2, column=1).hyperlink.target)

然后执行t = ws.cell(row=2, column=1).hyperlink并按Tab键查看您可以对象执行或访问的所有选项。

答案 1 :(得分:2)

由slaw评论它不会抓取超链接但只抓取文本

此处text.xlsx包含第9列中的链接

workbook = load_workbook('test.xlsx')
worksheet = workbook.active

column_indices = [9]

for row in range(2,worksheet.max_row+1): 
    for col in column_indices:
        filelocation = worksheet.cell(column=col, row=row ) #this is hyperlink
        text = worksheet.cell(column=col+1, row=row) # thi is your text 
        worksheet.cell(column=col+1,row=row).value = '=HYPERLINK("'+filelocation.value+'","'+text.value+'")'


workbook.save('test.xlsx')

答案 2 :(得分:1)

快速猴子修补,没有转换器或类似的东西,如果您想将所有带有超链接的单元格视为超链接,更复杂的方式,我想,至少可以选择,哪些列视为超链接或收集数据,或以某种方式将数据和超链接保存在数据帧的同一单元格中。并使用转换器,不知道。 (顺便说一句,我也玩过 data_onlykeep_links,没有帮助,只改变 read_only 结果没问题,我想它会降低你的代码速度)。

P.S.:仅适用于 xlsx,即引擎为 openpyxl

PPS:如果您以后阅读此评论并发出 https://github.com/pandas-dev/pandas/issues/13439 仍然打开,请不要忘记在 _convert_cell 处查看 load_workbookpandas.io.excel._openpyxl 中的更改并更新相应地。

import pandas
from pandas.io.excel._openpyxl import OpenpyxlReader
import numpy as np
from pandas._typing import FilePathOrBuffer, Scalar


def _convert_cell(self, cell, convert_float: bool) -> Scalar:
    from openpyxl.cell.cell import TYPE_BOOL, TYPE_ERROR, TYPE_NUMERIC
    # here we adding this hyperlink support:
    if cell.hyperlink and cell.hyperlink.target:
        return cell.hyperlink.target
        # just for example, you able to return both value and hyperlink,
        # comment return above and uncomment return below
        # btw this may hurt you on parsing values, if symbols "|||" in value or hyperlink.
        # return f'{cell.value}|||{cell.hyperlink.target}'
    # here starts original code, except for "if" became "elif"
    elif cell.is_date:
        return cell.value
    elif cell.data_type == TYPE_ERROR:
        return np.nan
    elif cell.data_type == TYPE_BOOL:
        return bool(cell.value)
    elif cell.value is None:
        return ""  # compat with xlrd
    elif cell.data_type == TYPE_NUMERIC:
        # GH5394
        if convert_float:
            val = int(cell.value)
            if val == cell.value:
                return val
        else:
            return float(cell.value)

    return cell.value


def load_workbook(self, filepath_or_buffer: FilePathOrBuffer):
    from openpyxl import load_workbook
    # had to change read_only to False:
    return load_workbook(
        filepath_or_buffer, read_only=False, data_only=True, keep_links=False
    )


OpenpyxlReader._convert_cell = _convert_cell
OpenpyxlReader.load_workbook = load_workbook

在您的 python 文件中添加以上内容后,您将能够调用 df = pandas.read_excel(input_file)

在写完所有这些东西之后,我想到了,也许单独使用 openpyxl 会更容易和更干净^_^

答案 3 :(得分:0)

你不能在熊猫中这样做。您可以尝试使用other libraries designed to deal with excel files