#発生した問題
Pythonのライブラリopenpyxlで書き込んだ値がEを用いた指数表示の表示形式にされた
import openpyxl
wb = openpyxl.open('./Book1.xlsx')
sh = wb['Sheet1']
sh.cell(row=1, column=1).value = 308985489249593041
wb.save('./result.xlsx')
結果
指数関数を取り除いた表示にしても末尾がいくつか0に置き換えられてて困る
#原因
openpyxlでなくExcelの仕様上の問題
Excel のセルに15桁を超える数字を入力すると、15桁を超える数字はすべて0に変更されます。
Excel のセルに長い数値を入力すると、最後の数字が0に変更されるより
数値計算ならこんくらいの桁数なら少しくらい精度が落とされても問題ではなさそうですが,
なんかのidだとかクレカの番号だとか1ケタでも違うと困るのを書き込んでる場合は困りますね
#解決策
文字列として数値を書き込んであげればよい
import openpyxl
wb = openpyxl.open('./Book1.xlsx')
sh = wb['Sheet1']
#ここで書き込む数値をstr型にしてあげる
sh.cell(row=1, column=1).value = str(308985489249593041)
wb.save('./result.xlsx')
これ文字列かアポストロフィで始まってる数値だよって怒られるけど書き込めた
ちなみにExcel内での計算はこのエラー出てても正常に行える
###openpyxlでは文字列として書き込んだ値はどんな感じで取得できるか
import openpyxl
wb = openpyxl.open('./result.xlsx')
sh = wb['Sheet1']
A1_value = sh.cell(row=1, column=1).value
print(A1_value)
print(type(A1_value))
'''
> 308985489249593041
> <class 'str'>
文字列として取得されるみたいですね
intでまた置き換えてあげないといけないですね
###追記:フォーマットを指定してあげる
コメントで以下の記事を紹介して頂きました.
openpyxlで数値の表示フォーマットを指定する
ってことで
sh.cell(row= , colum=).number_format =
に何個かフォーマットを渡してみました.
書き込む数値は上と同じ308985489249593041
A列が与えたフォーマットで,B列が結果
おー,すごい.ちゃんとフォーマットが変わってますね.
けど残念なことにやっぱり末尾の方は0に変えられちゃいますね….
B2とか文字列フォーマットなんだけど書き込む時点でint型だと多分無理っぽいですね….
#あとがき
もっとかしこい回避策あるんですかね
Excelのプラグインで上限解放できるとかw
知っている方いたら教えてください