LoginSignup
0
0

More than 3 years have passed since last update.

【Python】Openpyxlで書き込んだ値が指数表示(E)にされた

Last updated at Posted at 2020-09-12

発生した問題

Pythonのライブラリopenpyxlで書き込んだ値がEを用いた指数表示の表示形式にされた

sample_code.py
import openpyxl

wb = openpyxl.open('./Book1.xlsx')
sh = wb['Sheet1']

sh.cell(row=1, column=1).value = 308985489249593041

wb.save('./result.xlsx')

結果
image.png
指数関数を取り除いた表示にしても末尾がいくつか0に置き換えられてて困る

原因

openpyxlでなくExcelの仕様上の問題

Excel のセルに15桁を超える数字を入力すると、15桁を超える数字はすべて0に変更されます。

Excel のセルに長い数値を入力すると、最後の数字が0に変更されるより

数値計算ならこんくらいの桁数なら少しくらい精度が落とされても問題ではなさそうですが,
なんかのidだとかクレカの番号だとか1ケタでも違うと困るのを書き込んでる場合は困りますね

解決策

文字列として数値を書き込んであげればよい

sample_code.py
import openpyxl

wb = openpyxl.open('./Book1.xlsx')
sh = wb['Sheet1']

#ここで書き込む数値をstr型にしてあげる
sh.cell(row=1, column=1).value = str(308985489249593041)

wb.save('./result.xlsx')

image.png
これ文字列かアポストロフィで始まってる数値だよって怒られるけど書き込めた
ちなみにExcel内での計算はこのエラー出てても正常に行える

openpyxlでは文字列として書き込んだ値はどんな感じで取得できるか

sample_code.py
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
image.png
A列が与えたフォーマットで,B列が結果
おー,すごい.ちゃんとフォーマットが変わってますね.
けど残念なことにやっぱり末尾の方は0に変えられちゃいますね….
B2とか文字列フォーマットなんだけど書き込む時点でint型だと多分無理っぽいですね….

あとがき

もっとかしこい回避策あるんですかね
Excelのプラグインで上限解放できるとかw
知っている方いたら教えてください

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0