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

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

ただいまの
回答率

90.37%

  • Python 3.x

    8523questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 274

Nyann

score 3

エクセルの日報の記載されている項目を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)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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日のほうが先にきます。
    ※ 自然順ソートをしたい場合は、こちらの回答 を見てください。
import glob
import locale
import os
import re
import time
from datetime import datetime

import openpyxl as xl

locale.setlocale(locale.LC_ALL, '')

# エクセルファイル一覧を取得する。
xlsx_files = os.path.join('日報', '*.xlsx')
xlsx_paths = [path for path in sorted(glob.glob(xlsx_files))]

out_wb = xl.Workbook()  # 新しい workbook を作成する。
out_ws = out_wb.active

row_offset = 1

# ヘッダー
headers = ['タイトル', '更新日時', 'B', 'C', 'D', 'E', 'F',
           'G', 'H', 'I', 'J', 'K', 'L']
for c, label in enumerate(headers, 1):
    out_ws.cell(row=row_offset, column=c).value = label
row_offset += 1

for path in xlsx_paths:
    print('reading... ', path)

    # 更新日時を取得
    datetime = datetime.fromtimestamp(os.path.getmtime(path))
    modified = '{0:%Y年%m月%d日 %H時%M分}'.format(datetime)
    # Excel ファイルを読み込む。
    wb = xl.load_workbook(path, data_only=True)
    ws = wb.active
    # ファイル名から日付部分を取得
    matches = re.search(r'日報(\d{1,2})\.(\d{1,2})', os.path.basename(path))
    month, date = matches.groups()
    title = '{}/{}'.format(month, date)

    # 値をコピー B14:L28
    out_ws.cell(row=row_offset, column=1).value = title  # タイトル
    out_ws.cell(row=row_offset, column=2).value = modified  # 修正日時
    for r, rows in enumerate(ws['B14:L28']):  # B14 ~ L28 の値
        for c, cell in enumerate(rows):
            out_ws.cell(row=row_offset + r, column=3 + c).value  = cell.value
    row_offset += 15

    # 値をコピー B34:L48
    out_ws.cell(row=row_offset, column=1).value = title  # タイトル
    out_ws.cell(row=row_offset, column=2).value = modified  # 修正日時
    for r, row in enumerate(ws['B34:L48']):  # B34 ~ L48 の値
        for c, cell in enumerate(row):
            out_ws.cell(row=row_offset + r, column=3 + c).value  = cell.value
    row_offset += 15

# 保存する。
out_wb.save('output.xlsx')

イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/05 10: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

    キャンセル

  • 2018/10/05 15:09

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

    キャンセル

  • 2018/10/05 16:22

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

    キャンセル

  • 2018/10/05 16:32 編集

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

    キャンセル

  • 2018/10/09 10: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から取ってきたデータ。複数列、複数行)

    キャンセル

  • 2018/10/09 15:04 編集

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

    キャンセル

  • 2018/10/10 10:35

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

    キャンセル

  • 2018/10/15 10:22

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

    ファイル名①: 2017.6.6XXXX日報
    ファイル名②: 2017.09.12XXXX日報
    ファイル名③: 2017.06.06XXXX日報
    ファイル名④: XXXX日報20140715

    キャンセル

  • 2018/10/15 10:35

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

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    8523questions

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