2013-05-21 114 views
7

私は主にExcelファイル操作用のxlrdとopenpyxlライブラリを探しています。しかし、xlrdは現在、.xlsxファイルのためにformatting_info=Trueをサポートしていないので、xlrd hyperlink_map関数を使用することはできません。だから私はopenpyxlに向いていましたが、それにExcelファイルからハイパーリンクを抽出する運もありませんでした。以下のテストコード(テストファイルを「テスト」に設定されたハイパーリンクのテキストをGoogleに簡単なハイパーリンクを含む):Excel(.xlsx)からPythonでハイパーリンクを抽出する

import openpyxl 

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

ws = wb.get_sheet_by_name('Sheet1') 

r = 0 
c = 0 

print ws.cell(row = r, column = c). value 
print ws.cell(row = r, column = c). hyperlink 
print ws.cell(row = r, column = c). hyperlink_rel_id 

出力:

test 

None 

私はopenpyxlは現在、どちらか完全に書式設定をサポートしていませんと思いますか? Excel(.xlsx)ファイルからハイパーリンク情報を抽出するために使用できる他のライブラリはありますか?

+0

の書式設定のためのOpenpyxlのサポートは今かなり完了です。ハイパーリンクがあまりうまくサポートされていない理由は、歴史的なものでも、間接的に多くのExcel 2010仕様に実装されているものです。 –

+0

ここでは、OpenPyXlのハイパーリンクの制限に関するもう少し実験があります。 http://stackoverflow.com/questions/34964255/openpyxl-always-return-none-for-a-cell-with-hyperlink/34964292#34964292 – smwikipedia

答えて

1

私の経験では、.xlsxのやりとりをよくするにはIronPythonに移行する必要があります。これはFYI、openpyxlに問題が実際bugある

http://ironpython.net/

import clr 
clr.AddReference("Microsoft.Office.Interop.Excel") 
import Microsoft.Office.Interop.Excel as Excel 
excel = Excel.ApplicationClass() 

wb = excel.Workbooks.Open('testFile.xlsx') 
ws = wb.Worksheets['Sheet1'] 

address = ws.Cells(row, col).Hyperlinks.Item(1).Address 
3

「あなたが共通言語ランタイム(CLR)と協力し、Excelとの直接対話することができます。

そして、xlrdformatting_infoなしでハイパーリンクを読み取ることができません。これは現在xlsxではサポートされていません。私が働いてきた

+1

2016年ですが、何か変更されていますか? –

+0

@ivan_bilanは問題がまだ開いているように見える、ええ、3年.. – alecxe

1

成功したソリューションは、サーバー上のunoconvをインストールし、xlshyperlink_map.get()作品以来のxlsへのxlsxからファイルを変換するためにsubprocessモジュールを介して、このコマンドラインツールを起動する メソッドを実装することです。

1

Excelファイルを直接操作するには、優れたXlWingsライブラリを調べる価値があります。

2

少なくともバージョンopenpyxl-2.4.0b1からこのバグhttps://bitbucket.org/openpyxl/openpyxl/issue/152/hyperlink-returns-empty-string-instead-ofが修正されました。今では、セルのハイパーリンクオブジェクトの戻りです:

hl_obj = ws.row(col).hyperlink # getting Hyperlink object for Cell 
#hl_obj = ws.cell(row = r, column = c).hyperlink This could be used as well. 
if hl_obj: 
    print(hl_obj.display) 
    print(hl_obj.target) 
    print(hl_obj.tooltip) # you can see it when hovering mouse on hyperlink in Excel 
    print(hl_obj) # to see other stuff if you need 
0

が動作するはず.hyperlink.target場合だけでなく.hyperlinkを行います。その前にセルオブジェクトに ".hyperlink"だけを使用することから、 "None"も得ていました。

2

これは今openpyxlで可能でなければなりません:

import openpxyl 

wb = openpyxl.load_workbook('yourfile.xlsm') 
ws = wb.get_sheet_by_name('Sheet1') 
print(ws.cell(row=2, column=1).hyperlink.target) 
関連する問題