質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

580閲覧

PythonでJSONデータからエクセルへ書き込みたい

fideo

総合スコア55

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/12/21 02:54

編集2022/12/21 03:14

やりたいこと
下記のjsonのデータからbodyを取得します。
取得後、エクセルへ横方向で出力したいです。

Jsonファイル

{ "hasMore": false, "records": [ { "id": 11111778, "tmId": 11111111, "wrId": 22222222, "coType": "comment", "perm": 740, "upAt": "2022-12-19T06:11:40.632Z", "crAt": "2022-12-19T06:11:40.614Z", "isTh": false, "isEd": false, "attach": [ ], "menti": [ { "id": 11111111, "type": "member", "offset": 0, "length": 5 } ], "info": { "mentis": [ ] }, "liked": 0, "comm": 0, "formKey": null, "isForm": false, "tod": null, "postId": 2111111110, "pollId": null, "feeId": 2111111110, "shareEntities": [ 11111111 ], "status": "created", "linkPreviewId": null, "content": { "body": "テスト1", "connectInfo": [ ] }, "updateTime": 1571515700632, "createTime": 1571515700614, "deleterId": null, "from": "web", "isLiked": false, "isStarred": false }, { "id": 11111779, "tmId": 11111111, "wrId": 22222222, "coType": "comment", "perm": 740, "upAt": "2022-12-19T07:48:12.110Z", "crAt": "2022-12-19T07:48:12.089Z", "isTh": false, "isEd": false, "attach": [ ], "menti": [ { "id": 11111111, "type": "member", "offset": 0, "length": 6 } ], "info": { "mentis": [ ] }, "liked": 0, "comm": 0, "formKey": null, "isForm": false, "tod": null, "postId": 2111111110, "pollId": null, "feeId": 2111111110, "shareEntities": [ 11111111 ], "status": "created", "linkPreviewId": null, "content": { "body": "テスト2", "connectInfo": [ ] }, "updateTime": 1571522492110, "createTime": 1571522492089, "deleterId": null, "from": "web", "isLiked": false, "isStarred": false }, { "id": 2711111111, "tmId": 11111111, "wrId": 11111111, "coType": "comment", "perm": 740, "upAt": "2022-12-19T07:51:37.576Z", "crAt": "2022-12-19T07:49:13.758Z", "isTh": false, "isEd": false, "attach": [ ], "menti": [ { "id": 22222222, "type": "member", "offset": 0, "length": 6 } ], "info": { "mentis": [ ] }, "liked": 1, "comm": 0, "formKey": null, "isForm": false, "tod": null, "postId": 2111111110, "pollId": null, "feeId": 2111111110, "shareEntities": [ 11111111 ], "status": "created", "linkPreviewId": null, "content": { "body": "テスト3", "connectInfo": [ ] }, "updateTime": 1571522697576, "createTime": 1571522553758, "deleterId": null, "from": "web", "isLiked": false, "isStarred": false }, { "id": 2111111110, "tmId": 11111111, "wrId": 22222222, "coType": "comment", "perm": 740, "upAt": "2022-12-19T07:51:53.204Z", "crAt": "2022-12-19T07:51:53.178Z", "isTh": false, "isEd": false, "attach": [ ], "menti": [ { "id": 11111111, "type": "member", "offset": 0, "length": 6 } ], "info": { "mentis": [ ] }, "liked": 0, "comm": 0, "formKey": null, "isForm": false, "tod": null, "postId": 2111111110, "pollId": null, "feeId": 2111111110, "shareEntities": [ 11111111 ], "status": "created", "linkPreviewId": null, "content": { "body": "テスト4", "connectInfo": [ ] }, "updateTime": 1571522713204, "createTime": 1571522713177, "deleterId": null, "from": "web", "isLiked": false, "isStarred": false } ] }

現在結果
先ずはfor文で取り出したbodyを下記のように出力されます。
print(body)

テスト1 テスト2 テスト3 テスト4

エクセルの結果
列ごとに出力されます。

body1body2body3body4
テスト1
テスト2
テスト3
テスト4

実現したい結果
横方向で出力するようにしたいです。
またbody毎回変化するので、自動でbody1,body2...のようにヘッダー書き込み可能でしょうか。

body1body2body3body4
テスト1テスト2テスト3テスト4

解決方法やチェック事項などご存知ありましたらアドバイスいただきたく思います。

よろしくお願いします。

コード

import json import openpyxl json_open = open("C:\\Users\\test2\\Desktop\\test2.json", 'r') json_load = json.load(json_open) print(json_load) # エクセルを開く wb = openpyxl.Workbook() sheet = wb.active sheet .title = "Sheet1" ws = wb["Sheet1"] # シートの番号用変数 cnt = 1 #For文でbody取得 for key in json_load['records']: body=key['content']["body"] print(body) # シートの番号を決める sel1 = "A"+str(cnt) sheet[sel1].value = body cnt += 1 #1番目に行を追加 ws.insert_rows(1) #header sheet["A1"].value = "body1" sheet["B1"].value = "body2" sheet["C1"].value = "body3" sheet["D1"].value = "body4" # エクセルにデータを保存する wb.save("text.xlsx")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

sheet["A1"].value = "body1" の "A1"にあたる文字列が計算できれば良いので、
何らかの形で(行,列)のタプルを作り、

python

1keyStr = openpyxl.utils.get_column_letter(pos[1]) + str(pos[0])

の形を作れば任意のセルに挿入できます。
今回の例だと

Python

1origin = (2,1) # A1 = (1行目 ,1列目)  2for idx,item in enumerate(json_load['records']): 3 keyStr = openpyxl.utils.get_column_letter(origin[1]) + str(origin[0]+idx) 4 sheet[keyStr] = item

あたりでしょうか。
mod計算等でn項目ごとに折り返す等もできるので試してみるとよいかと。
(挿入始点・方向・折り返し項目数あたりを引数に持つ関数を作っておくと便利)

投稿2022/12/22 05:42

編集2022/12/22 06:16
mdkh

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fideo

2022/12/23 06:48

回答ありがとうございます。 こちらの方法も試してみます。
guest

0

Pandas を使う方法はどうでしょうか。

python

1import pandas as pd 2 3df = pd.read_json('test2.json') 4bodies = df['records'].str['content'].str['body']\ 5 .rename(lambda i: f'body{i+1}')\ 6 .to_frame().T.reset_index(drop=True) 7 8bodies.to_excel('test.xlsx', index=False)

投稿2022/12/21 03:46

melian

総合スコア19805

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fideo

2022/12/21 05:51

回答ありがとうございます。 openpyxlで行うのは難しいでしょうか。
melian

2022/12/21 06:00

可能かと思います。質問文に「openpyxl で〜」という文言を入れて、他の方の回答を待つとよいかと。
fideo

2022/12/21 06:35

ありがとうございます。一旦上記の方法で試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問