2016-11-07 3 views
0

ワークブックでは、Excelドキュメントを使用してサンプルの解析を行い、ワークブック内のワークシートの1つが「トップシート」です。データの一部がレポート用の素敵なテーブルに照合されます。私は、OpenPyXLを使って必要なすべてのデータを取り出して、複数のファイルからこのデータを取り出すことができる網羅的なpythonスクリプトを作成しました。このすべてでは、ブックを開くときにdata_only=Trueフラグを実装する必要があります。OpenpyXL - 任意のワークブックのセルの計算されたコンポーネントとフォーミュラコンポーネントの両方を返す方法

これまで、ワークシートの別の部分(トップシートではない)からデータを取得する必要がありましたが、実際には「トップシート」の数式で参照されています。私は本質的にスクリプトをブックに2回開くようにしました。一度はすべてのトップシートのデータを取り出し、一度式(実際には一連のセル参照)を取り出すことです。

wb_value = load_workbook(os.path.join(root, fname), data_only=True)

wb_formula = load_workbook(os.path.join(root, fname))

再開することなく、データや数式を返すためにOpenPyXLのいずれかの方法はありますか?これは文字通り抽出ループを実行するのに必要な時間を2倍にします。これは上記のように、適切な.xlsxファイルを見つけるためにディレクトリ全体をループする大きな構造の一部です。

大変助かりました。

PS。私はチャールズ・クラークの23350581の答えを読んだので、楽観的でないのは簡単な解決策ですが、うまくいけば誰かが回避策を考え出すことができます。

PPS。時間の経過とともに変更され、誰かがExcelの位置を追跡するために(複数年に渡って)ハードコーディングしているので、私が取り出したいセル参照をハードコードすることはできません。

乾杯

答えて

1

それはopenpyxlのコードを変更することで可能です。 openpyxl 2.2.5ではこれらの変更を行ったことに注意してください。これは最新バージョンではありません。したがって、行番号はおそらくあなたのために異なるでしょう。

これはすばらしい猿のパッチであり、おそらくこれを行う最善の方法ではありませんが、それはあなたに行く必要があります。

これらの変更により、式を変更した場合にopenpyxlが値を再計算することはないことに注意してください(チャールズ・クラーク氏の答えによる)。これにより、単純にload_workbookに、セルの値と数式の両方を2回呼び出す必要なく検索するようになります。

\ openpyxl \セル\セル

。PY:

行84:

__slots__'formula'を追加します。

__slots__ = (
     'column', 
     'row', 
     'coordinate', 
     '_value', 
     'formula',  
     'data_type', 
     'parent', 
     'xf_index', 
     '_hyperlink_rel', 
     '_comment') 


ライン111:

def __init__(self, worksheet, column, row, value=None, formula=None, fontId=0, 
       fillId=0, borderId=0, alignmentId=0, protectionId=0, numFmtId=0, 
       pivotButton=None, quotePrefix=None, xfId=None): 
: 変更 Cell__init__をデフォルト引数 Noneformula引数を受け入れるように

そして__init__体でそれを初期化します。

self.formula = formula


\ openpyxl \リーダー\のworksheet.py

ライン111:

私たちは本当にもうについてdata_onlyを気にしません、if formula is not None and not self.data_only:からif formula is not None:に回線を変更してください。

ライン113から116:

変更

から次の行
if formula.text: 
    value = "=" + formula.text 
else: 
    value = "=" 

if formula.text: 
    _formula = "=" + formula.text 
else: 
    _formula = "=" 

に数行は、あなたがすぐに

else: 
    cell._value=value 
    cell.data_type=data_type 

を確認する必要があり、これらの行を怒鳴りますベルOWこれらの行が追加:

try: 
    cell.formula = _formula 
except UnboundLocalError: 
    pass 



それだそれ!それをテストしましょう:

私は新しいxlsxファイルを作成しました。セルA1は式=1+1を持ち、セルA2は式を持たず、ちょうど平方の値2です。これは関係なく、open_workbookに渡されたdata_onlyの値の動作することを

wb = load_workbook('test.xlsx') 
sheet = wb.get_sheet_by_name('Sheet1') 

cell = sheet.cell(row=1, column=1) 
print(cell.value) 
print(cell.formula) 

>> 2 
>> =1+1 

cell = sheet.cell(row=2, column=1) 
print(cell.value) 
print(cell.formula) 

>> 2 
>> None 

は注意してください。

+0

DeepSpaceのおかげでよかったです。私はopenrickxを呼び出す(文字通り何百もの)他のスクリプトを持っているので、コアライブラリの機能を変更したくないし、機能を損ねたくない。 – user2658194

+0

また、この機能が変更しただけの単純なものであれば、コアライブラリの一部ではない理由を考えることはできますか? – user2658194

+0

@ user2658194私は実際には実際にはわかりません。 – DeepSpace

関連する問題