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

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

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

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

Q&A

解決済

1回答

2227閲覧

エクセルデータの新規エクセルシートへの書き出し

Nyann

総合スコア12

Python 3.x

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

0グッド

0クリップ

投稿2018/10/04 08:36

エクセルの日報の記載されている項目をPythonで読み込み、そのデータを順番に(日付ごとに)新規のエクセルシートに書き出したいです。

現状下記のコードでエクセル内の欲しいデータをPythonで読み込ませることは出来ているのですが、この読み込んだデータを他のエクセルへ順番に出力する方法を教えてください。

読み込みたいエクセルには
XXXX日報6.17.xlsx, XXXX日報6.18.xlsx...のようにファイルの名前の最後に日付が降られています。


import openpyxl as px

wb = px.load_workbook("XXXX日報6.17.xlsx", data_only = True)
sheet = wb.active

for i in range(13,27):
print(sheet.cell(row=i, column=2).value)
for i in range(13,27):
print(sheet.cell(row=i, column=4).value)
for i in range(13,27):
print(sheet.cell(row=i, column=6).value)
for i in range(13,27):
print(sheet.cell(row=i, column=8).value)
for i in range(13,27):
print(sheet.cell(row=i, column=12).value)

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

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

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

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

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

guest

回答1

0

ベストアンサー

保存したい列ごとに Workbook を新しく作成し、必要な値をコピーしたあと、保存すればよいです。

データ

日報 |-- 日報6.17.xlsx |-- 日報6.18.xlsx `-- 日報6.19.xlsx

日報 というディレクトリ以下に以下の xlsx ファイルがあり、B14 ~ L28、B34 ~ L48 にデータが入っています。

イメージ説明

コード

ファイル一覧を取得する。

  1. glob.glob() でファイル一覧を取得する。
  2. sorted() でソートする。

※ 06月12日のように2桁で揃えられていない場合、辞書順ソートの場合、6月12日より12月1日のほうが先にきます。
※ 自然順ソートをしたい場合は、こちらの回答 を見てください。

python

1import glob 2import locale 3import os 4import re 5import time 6from datetime import datetime 7 8import openpyxl as xl 9 10locale.setlocale(locale.LC_ALL, '') 11 12# エクセルファイル一覧を取得する。 13xlsx_files = os.path.join('日報', '*.xlsx') 14xlsx_paths = [path for path in sorted(glob.glob(xlsx_files))] 15 16out_wb = xl.Workbook() # 新しい workbook を作成する。 17out_ws = out_wb.active 18 19row_offset = 1 20 21# ヘッダー 22headers = ['タイトル', '更新日時', 'B', 'C', 'D', 'E', 'F', 23 'G', 'H', 'I', 'J', 'K', 'L'] 24for c, label in enumerate(headers, 1): 25 out_ws.cell(row=row_offset, column=c).value = label 26row_offset += 1 27 28for path in xlsx_paths: 29 print('reading... ', path) 30 31 # 更新日時を取得 32 datetime = datetime.fromtimestamp(os.path.getmtime(path)) 33 modified = '{0:%Y年%m月%d日 %H時%M分}'.format(datetime) 34 # Excel ファイルを読み込む。 35 wb = xl.load_workbook(path, data_only=True) 36 ws = wb.active 37 # ファイル名から日付部分を取得 38 matches = re.search(r'日報(\d{1,2}).(\d{1,2})', os.path.basename(path)) 39 month, date = matches.groups() 40 title = '{}/{}'.format(month, date) 41 42 # 値をコピー B14:L28 43 out_ws.cell(row=row_offset, column=1).value = title # タイトル 44 out_ws.cell(row=row_offset, column=2).value = modified # 修正日時 45 for r, rows in enumerate(ws['B14:L28']): # B14 ~ L28 の値 46 for c, cell in enumerate(rows): 47 out_ws.cell(row=row_offset + r, column=3 + c).value = cell.value 48 row_offset += 15 49 50 # 値をコピー B34:L48 51 out_ws.cell(row=row_offset, column=1).value = title # タイトル 52 out_ws.cell(row=row_offset, column=2).value = modified # 修正日時 53 for r, row in enumerate(ws['B34:L48']): # B34 ~ L48 の値 54 for c, cell in enumerate(row): 55 out_ws.cell(row=row_offset + r, column=3 + c).value = cell.value 56 row_offset += 15 57 58# 保存する。 59out_wb.save('output.xlsx')

イメージ説明

投稿2018/10/04 10:19

編集2018/10/09 06:03
tiitoi

総合スコア21956

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

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

Nyann

2018/10/05 01:42

ありがとうございます。このコードですと、列ごとにworkbookを作成していますが、やりたいことは取り出したデータを同じシートに保存していく方法を探しています。過去の日報が膨大にありますので日付順にそのデータを並べていきたいです。 エクセルアウトプットのイメージ 日付 データ 6/17 XX XX XX (取り出したデータ) 6/17  XX XX XX 6/17  XX XX XX 6/18 yy yy yy 6/18 yy yy yy 6/18 yy yy yy
tiitoi

2018/10/05 06:09

修正しました。追記したサンプルコードを参考にして、試してみてください。
Nyann

2018/10/05 07:22

ありがとうございます。あともう一歩のところまで来ています。 取り出すデータは複数行且つ複数列なのですが、コードのどこを修正するとうまくいくのか判りません。よろしくお願いいたします。
tiitoi

2018/10/05 07:32 編集

質問欄を編集して、入力となる各Excel ファイルの「ファイル名」「シートの中身」、希望する「出力するExcelの中身」を具体的に記載いただけないと、実際どのような中身なのか、今の質問欄からはわかりませんので、アドバイスは難しいです。
Nyann

2018/10/09 01:00

説明不足で申し訳ありません。 ①ファイル名:XXXX6.17.xlsxとなっており、最後に日付がついています。 ②シートの中身:シートの中身にはその日に行った作業情報が記載されていますが、今回抽出したいデータは、時間とその時に行っていた作業の内容となります。これらの情報は複数列、複数行で記載されており、セル番号B14:L28及びB34:L48に記載されています。(作業がシンプルな日は28行及び、48行まで作業が記載されないこともある) ③出力:出力シートには、左端の列に日報の日付を出力しその右側に②の情報を張り付けたいです。 以上、よろしくお願いいたします。 Example: 日付  時間情報  作業内容 6/17 XX:XX XX:XX XXXXXX (B14:L28から取ってきたデータ。複数列、複数行) 6/17 XX:XX XX:XX XXXXXX (B34:L48から取ってきたデータ。複数列、複数行) 6/18 XX:XX XX:XX XXXXXX (B14:L28から取ってきたデータ。複数列、複数行) 6/18 XX:XX XX:XX XXXXXX (B34:L48から取ってきたデータ。複数列、複数行)
tiitoi

2018/10/09 06:04 編集

回答を修正しました。 意図と違うところがありましたら、回答のサンプルコードを参考に変更してみてください。
Nyann

2018/10/10 01:35

ありがとうございました。無事必要なデータを抽出することが出来ました。
Nyann

2018/10/15 01:22

ファイル名に記載されている日付なのですが、新たに下記のような記載の日報が出てきました。シート内の記載はこれまでのファイルと同様であり、ファイルの名前だけが異なる状況です。やりたいことはこれまでと同様です。コードの修正よろしく願い致します。 ファイル名①: 2017.6.6XXXX日報 ファイル名②: 2017.09.12XXXX日報 ファイル名③: 2017.06.06XXXX日報 ファイル名④: XXXX日報20140715
tiitoi

2018/10/15 01:35

回答しますので、新たに質問を立てていただけますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問