こんにちは私はPythonを使用して3つのExcelファイルxlsxを連結したいと思います。
Openpyxlを使用してみましたが、3つのワークシートを1つに追加するのにどの関数が役立つかわかりません。
それを行う方法について何かアイデアはありますか?
どうもありがとう
これが パンダ ベースのアプローチです。 (舞台裏でopenpyxl
を使用しています。)
import pandas as pd
# filenames
Excel_names = ["xlsx1.xlsx", "xlsx2.xlsx", "xlsx3.xlsx"]
# read them in
excels = [pd.ExcelFile(name) for name in Excel_names]
# turn them into dataframes
frames = [x.parse(x.sheet_names[0], header=None,index_col=None) for x in excels]
# delete the first row for all frames except the first
# i.e. remove the header row -- assumes it's the first
frames[1:] = [df[1:] for df in frames[1:]]
# concatenate them..
combined = pd.concat(frames)
# write it out
combined.to_Excel("c.xlsx", header=False, index=False)
xlrd と xlwt を使用します。文字通りこれらのファイルを追加する必要があると仮定すると(実際の作業を行うのではなく)、次のようにします。xlwt
で書き込むファイルを開き、他の3つのファイルごとにファイル、データをループし、各行を出力ファイルに追加します。開始するには:
import xlwt
import xlrd
wkbk = xlwt.Workbook()
outsheet = wkbk.add_sheet('Sheet1')
xlsfiles = [r'C:\foo.xlsx', r'C:\bar.xlsx', r'C:\baz.xlsx']
outrow_idx = 0
for f in xlsfiles:
# This is all untested; essentially just pseudocode for concept!
insheet = xlrd.open_workbook(f).sheets()[0]
for row_idx in xrange(insheet.nrows):
for col_idx in xrange(insheet.ncols):
outsheet.write(outrow_idx, col_idx,
insheet.cell_value(row_idx, col_idx))
outrow_idx += 1
wkbk.save(r'C:\combined.xls')
ファイルallにヘッダー行がある場合は、おそらくそれを繰り返したくないので、上記のコードを次のように変更できます。
firstfile = True # Is this the first sheet?
for f in xlsfiles:
insheet = xlrd.open_workbook(f).sheets()[0]
for row_idx in xrange(0 if firstfile else 1, insheet.nrows):
pass # processing; etc
firstfile = False # We're done with the first sheet.
データ分析のためにExcelファイル(mydata1.xlsx、mydata2.xlsx、mydata3.xlsx)を組み合わせると、次のようになります。
import pandas as pd
import numpy as np
import glob
all_data = pd.DataFrame()
for f in glob.glob('myfolder/mydata*.xlsx'):
df = pd.read_Excel(f)
all_data = all_data.append(df, ignore_index=True)
次に、それを1つのファイルとして保存する場合:
writer = pd.ExcelWriter('mycollected_data.xlsx', engine='xlsxwriter')
all_data.to_Excel(writer, sheet_name='Sheet1')
writer.save()
openpyxl
のみのソリューション(他の依存関係の束なし)。
このスクリプトは、1枚のシートでも複数のシートでも、任意の数のxlsxドキュメントをマージする必要があります。フォーマットは保持されます。
Openpyxlにシートをコピーする機能がありますが、それは同じファイルとの間でのみ行われます。どこかに関数insert_rowsもありますが、それ自体では行を挿入しません。ですから、一度に1つのセルを(退屈に)処理しなければならないのではないかと心配しています。
for
ループの使用が嫌いで、リスト内包表記のようなコンパクトでエレガントなものを使用したいのと同じくらい、これは副作用のショーであるため、ここではその方法がわかりません。
この回答 ワークブック間でのコピーの功績。
#!/usr/bin/env python3
#USAGE
#mergeXLSX.py <a bunch of .xlsx files> ... output.xlsx
#
#where output.xlsx is the unified file
#This works FROM/TO the xlsx format. Libreoffice might help to convert from xls.
#localc --headless --convert-to xlsx somefile.xls
import sys
from copy import copy
from openpyxl import load_workbook,Workbook
def createNewWorkbook(manyWb):
for wb in manyWb:
for sheetName in wb.sheetnames:
o = theOne.create_sheet(sheetName)
safeTitle = o.title
copySheet(wb[sheetName],theOne[safeTitle])
def copySheet(sourceSheet,newSheet):
for row in sourceSheet.rows:
for cell in row:
newCell = newSheet.cell(row=cell.row, column=cell.col_idx,
value= cell.value)
if cell.has_style:
newCell.font = copy(cell.font)
newCell.border = copy(cell.border)
newCell.fill = copy(cell.fill)
newCell.number_format = copy(cell.number_format)
newCell.protection = copy(cell.protection)
newCell.alignment = copy(cell.alignment)
filesInput = sys.argv[1:]
theOneFile = filesInput.pop(-1)
myfriends = [ load_workbook(f) for f in filesInput ]
#try this if you are bored
#myfriends = [ openpyxl.load_workbook(f) for k in range(200) for f in filesInput ]
theOne = Workbook()
del theOne['Sheet'] #We want our new book to be empty. Thanks.
createNewWorkbook(myfriends)
theOne.save(theOneFile)
Openpyxl 2.5.4、python 3.4でテスト済み。
これを行うには、pandasおよびosライブラリを使用するだけです。
import pandas as pd
import os
#create an empty dataframe which will have all the combined data
mergedData = pd.DataFrame()
for files in os.listdir():
#make sure you are only reading Excel files
if files.endswith('.xlsx'):
data = pd.read_Excel(files, index_col=None)
mergedData = mergedData.append(data)
#move the files to other folder so that it does not process multiple times
os.rename(files, 'path to some other folder')
mergedData DFは、個別のExcelまたはcsvファイルにエクスポートできるすべての結合データを含みます。同じコードはcsvファイルでも機能します。IF条件で置き換えるだけです。
P_barillの答えに追加するだけで、コピーする必要のあるカスタム列幅がある場合は、copySheetの下部に次を追加できます。
for col in sourceSheet.column_dimensions:
newSheet.column_dimensions[col] = sourceSheet.column_dimensions[col]
私は彼または彼女の答えに対するコメントでこれを投稿するだけですが、私の評判は十分に高くありません。