6

Excel がテキストを数値として解釈しないようにする方法や、openpyxl を使用して数値形式を出力する方法について多くの質問がありますが、この問題の解決策は見当たりません。

他の人から Excel スプレッドシートをもらったので、作成していません。Excel でファイルを開くと、「5E12」(誰かが気になる場合はクローン番号) のような特定の値が正しく表示されているように見えますが、それぞれの横に小さな緑色の矢印があり、「これは数字のようです」という警告が表示されます。テキストとして保存されます。」次に、Excel はそれを数値に変換するかどうかを尋ねます。そうであれば、5000000000000 を取得します。これは自動的に科学的表記法に変換され、5E12 が再び表示されます。今回のみ、テキスト出力はゼロで完全な数値を表示します。 . 変換前は、これは実際にはテキストであり、Excel であっても、変換するように警告/提供されているだけであることに注意してください。

そのため、このファイルを openpyxl (openpyxl.reader.excel import load_workbook から) で読み取ると、5E12 は自動的に 5000000000000 に変換されます。openpyxl は、Excel が行ったのと同じ仮定を行っていると思いますが、変換のみがプロンプトまたはなしで行われます。私の側で入力します。

どうすればこれを防ぐことができますか? 「テキストとして保存された数値」のように見えるテキストを数値に変換したくありません。私がそう言わない限り、それらはテキストです。

これまでのところ、私が見つけた唯一の解決策は、各セルの前に一重引用符を追加することですが、これはプログラムによる解決策ではなく手作業であるため、理想的な解決策ではありません。また、この問題がどこで発生するかを常に知っているとは限らないため、解決策は一般的である必要があります (1 日に何百万行も読んでいるので、手動で何かをする必要はありません)。

これはopenpyxlの問題だと思います。2011 年の初めから、この問題について言及している Google グループ ディスカッションがありますが、問題になることはめったにないと想定しています。https://groups.google.com/forum/?fromgroups=#!topic/openpyxl-users/HZfpShMp8Tk

それで、何か提案はありますか?

4

1 に答える 1

6

(何らかの理由で) 再度使用する場合はopenpyxl、ワークシート リーダー ルーチンに次の変更を加えて、文字列を文字列として保持するというトリックを実行します。

差分 --git a/openpyxl/reader/worksheet.py b/openpyxl/reader/worksheet.py

--- a/openpyxl/reader/worksheet.py
+++ b/openpyxl/reader/worksheet.py
@@ -134,8 +134,10 @@
             data_type = element.get('t', 'n')
             if data_type == Cell.TYPE_STRING:
                 value = string_table.get(int(value))
-
-            ws.cell(coordinate).value = value
+                ws.cell(coordinate).set_value_explicit(value=value,
+                                                data_type=Cell.TYPE_STRING)
+            else:
+                ws.cell(coordinate).value = value

         # to avoid memory exhaustion, clear the item after use
         element.clear()

これCell.valueはプロパティであり、割り当て呼び出しCell._set_valueではCell.bind_value、メソッドのドキュメントに従って which を実行します。「値を指定すると、型を推測し、オプションを表示します」。値の型は XML ファイルにあるので、「スマート」なことをする代わりに、それらを取得する必要があります (ここでは文字列に対してのみ行います)。

コードからわかるように、文字列であるかどうかのテストは既に存在します。

于 2013-03-18T20:48:38.167 に答える