对于带有超链接的单元格,OpenPyXL 总是 return None
OpenPyXL always return None for a cell with hyperlink
(我的最终目的是append clickable cells to existing XLSX
。)
我使用下面的代码提取单元格的显示值和超链接。
from openpyxl import load_workbook
xlsFile='hello.xlsx'
wbook = load_workbook(xlsFile)
wsheet1= wbook.get_sheet_by_name('mysheet')
cell1 = wsheet1.cell('A1')
print cell1.value
print cell1.hyperlink
print wsheet1['A1'].value
print wsheet1['A1'].hyperlink
但它 returns 以下内容:
URL1
None
URL1
None
为什么 hyperlink
总是 None
?我确实为单元格 A1 手动添加了超链接,超链接在 Excel 2013 中有效。
不幸的是,这是一个错误。
这是 2012 年的 bug...
一些相关线程:
Extracting Hyperlinks From Excel (.xlsx) with Python
我的超链接实验的一些细节。我正在使用 OpenPyXL 2.3.3
.
- 我可以向单元格添加超链接。
from openpyxl import load_workbook
xlsFile='hello.xlsx'
wbook = load_workbook(xlsFile)
wsheet1= wbook.get_sheet_by_name('mysheet')
cell1 = wsheet1.cell('A1')
cell1.hyperlink = r'http://www.example.com'
cell1.value=r'XXX'
wbook.save(xlsFile)
但是我无法加载XLSX文件并读取超链接,就像我的问题所说的那样。
并且如果我只是 加载和 re-save XLSX 文件,所有现有的超链接都将丢失。 是啊!
from openpyxl import load_workbook
xlsFile='hello.xlsx'
wbook = load_workbook(xlsFile)
wbook.save(xlsFile)
解决方法!
Use the formula with OpenPyXL.
我的目的是append clickable cells to existing XLSX file
。因为 hyperlink
不起作用。我改用公式 =HYPERLINK(url, displayText)
。幸运的是,公式没有像之前的实验3那样丢失。
from openpyxl import load_workbook
xlsFile='hello.xlsx'
wbook = load_workbook(xlsFile)
wsheet1= wbook.get_sheet_by_name('mysheet')
cell1 = wsheet1.cell('A2')
cell1.value=r'=HYPERLINK("http://www.example.com","XXX")'
wbook.save(xlsFile)
我试过的其他(失败)选项:
我查看了 XlsxWriter. But it explicitly says it cannot modify existing XLSX file。所以它不能用于追加。
我也研究了 xlrd/xlwt/xlutils
,不幸的是,如果你想编辑现有的 excel,你必须使用 xlrd 将它加载为 read-only 工作簿,然后使用 xlutils 将其转换(复制)为可写工作簿。砰!在复制过程中,一些东西会丢失,其中包括 HYPERLINK
公式。根据它的文档字符串,这是一个已知的限制:
# Copyright (c) 2009-2012 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
from xlutils.filter import process,XLRDReader,XLWTWriter
def copy(wb):
"""
Copy an :class:`xlrd.Book` into an :class:`xlwt.Workbook` preserving as much
information from the source object as possible.
See the :doc:`copy` documentation for an example.
"""
w = XLWTWriter()
process(
XLRDReader(wb,'unknown.xls'),
w
)
return w.output[0][1]
另外,xlwt 不支持 XLSX,只支持 XLS。这是我决定不使用它的另一个原因。
(我的最终目的是append clickable cells to existing XLSX
。)
我使用下面的代码提取单元格的显示值和超链接。
from openpyxl import load_workbook
xlsFile='hello.xlsx'
wbook = load_workbook(xlsFile)
wsheet1= wbook.get_sheet_by_name('mysheet')
cell1 = wsheet1.cell('A1')
print cell1.value
print cell1.hyperlink
print wsheet1['A1'].value
print wsheet1['A1'].hyperlink
但它 returns 以下内容:
URL1
None
URL1
None
为什么 hyperlink
总是 None
?我确实为单元格 A1 手动添加了超链接,超链接在 Excel 2013 中有效。
不幸的是,这是一个错误。
这是 2012 年的 bug...
一些相关线程:
Extracting Hyperlinks From Excel (.xlsx) with Python
我的超链接实验的一些细节。我正在使用 OpenPyXL 2.3.3
.
- 我可以向单元格添加超链接。
from openpyxl import load_workbook xlsFile='hello.xlsx' wbook = load_workbook(xlsFile) wsheet1= wbook.get_sheet_by_name('mysheet') cell1 = wsheet1.cell('A1') cell1.hyperlink = r'http://www.example.com' cell1.value=r'XXX' wbook.save(xlsFile)
但是我无法加载XLSX文件并读取超链接,就像我的问题所说的那样。
并且如果我只是 加载和 re-save XLSX 文件,所有现有的超链接都将丢失。 是啊!
from openpyxl import load_workbook xlsFile='hello.xlsx' wbook = load_workbook(xlsFile) wbook.save(xlsFile)
解决方法!
Use the formula with OpenPyXL.
我的目的是append clickable cells to existing XLSX file
。因为 hyperlink
不起作用。我改用公式 =HYPERLINK(url, displayText)
。幸运的是,公式没有像之前的实验3那样丢失。
from openpyxl import load_workbook
xlsFile='hello.xlsx'
wbook = load_workbook(xlsFile)
wsheet1= wbook.get_sheet_by_name('mysheet')
cell1 = wsheet1.cell('A2')
cell1.value=r'=HYPERLINK("http://www.example.com","XXX")'
wbook.save(xlsFile)
我试过的其他(失败)选项:
我查看了 XlsxWriter. But it explicitly says it cannot modify existing XLSX file。所以它不能用于追加。
我也研究了 xlrd/xlwt/xlutils
,不幸的是,如果你想编辑现有的 excel,你必须使用 xlrd 将它加载为 read-only 工作簿,然后使用 xlutils 将其转换(复制)为可写工作簿。砰!在复制过程中,一些东西会丢失,其中包括 HYPERLINK
公式。根据它的文档字符串,这是一个已知的限制:
# Copyright (c) 2009-2012 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
from xlutils.filter import process,XLRDReader,XLWTWriter
def copy(wb):
"""
Copy an :class:`xlrd.Book` into an :class:`xlwt.Workbook` preserving as much
information from the source object as possible.
See the :doc:`copy` documentation for an example.
"""
w = XLWTWriter()
process(
XLRDReader(wb,'unknown.xls'),
w
)
return w.output[0][1]
另外,xlwt 不支持 XLSX,只支持 XLS。这是我决定不使用它的另一个原因。