本日の目的
- 開いたExcelに書かれているデータを取得して別なExcelに保存する。
- データ数が分かってない場合の書き方をやってみる。
ポイント的なアレ
- Excelを操作する(前回参照)
- データの取り方
- 要素数が決まってないときの二次元配列(リスト)
とりあえずやってみる
-
データの取り方
- セル単位でのデータ取得例:for num in range(maxCellNum)
- 行単位でのデータ取得例 :for row in ws.iter_rows(min_row = startDataRow):
-
要素数が決まってないときの二次元配列
- これはググっても出てこないから無理っぽい・・・
- そもそも使う設計にしない方がいいのかもしれない。
- 取得元のデータを1行単位でカンマ付き文字列結合をして
- 使う側でカンマで分割すれば一次元配列(リスト)でもいけそう(ソース参照)
まとめ
- 要素数の決まってない多次元配列を使いたい時は設計自体を見直した方がいいのかもしれない。
参考
- 愚直なコードを載せておきます。
書いたコード
import sys
import os
import openpyxl
# 実際の売上データではありません。
# 直書きはしたくない。
targetExcel = r"..\data\売上.xlsx"
targetSheetName = "先月売上"
newFileName = "新.xlsx"
newSheetName = "test"
# A4から
startDataRow = 4
startDataColumn = 1
# エクセル開く
# data_only=Trueで式の結果がとれる。無いと式自体がとれる。
wb = openpyxl.load_workbook(targetExcel, data_only=True)
# エクセル内のデータにアクセスする
ws = wb[targetSheetName]
# 空のリストをよーい
# 要素数が決まっていない二次元配列は用意出来ない・・
datalist = []
# 開いたエクセルから対象行のデータをリストにつっこむ
# どうせなら行ごとデータを引っこ抜きたいが・・・
# むりやり
for row in ws.iter_rows(min_row = startDataRow):
# 行ごとにカンマ区切りで結合してけば何とかなるんじゃない?
tempStr = ""
for cellVal in row:
# 2項目以降はカンマ付きで結合
if tempStr == "":
tempStr = str(cellVal.value)
else:
tempStr = tempStr + ',' + str(cellVal.value)
datalist.append(tempStr)
print(datalist)
# 新しいエクセルをよーい
wb2 = openpyxl.Workbook()
ws2 = wb2.worksheets[0]
ws2.title = newSheetName
# 元のエクセルと同じ位置にsetしたい
# カンマで結合したやつをリストに入れるんだから
# 戻したいならリストの要素を分割する感じでいけそう。
splitList = []
for rowNum in range(len(datalist)):
splitList = datalist[rowNum].split(",")
for colNum in range(len(splitList)):
ws2.cell(startDataRow + rowNum, startDataColumn + colNum).value = splitList[colNum]
# ほぞーん
wb2.save(newFileName)
おまけ
- パス指定について
書いたコード
# 前回
targetExcel = r"../data/売上.xlsx"
# 今回
targetExcel = r"..\data\売上.xlsx"
- スラッシュ区切りでもバックスラッシュ区切りでもどちらでも問題なく動いている。
- LinuxやMacOSは前者、Windowsは後者で記述するので差分を吸収してくれるのかもしれない。
追記:タイトル更新しました。