openpyxlは、xlsx形式のExcelファイルを処理できるサードパーティのライブラリです。 pip installopenpyxlインストール。
Excelファイルを読む
関連する関数をインポートする必要があります
from openpyxl import load_workbook
# デフォルトでは読み取りと書き込みが可能です。必要に応じて書き込みを指定できます_のみ読んでください_唯一は真実です
wb =load_workbook('pythontab.xlsx')
デフォルトで開かれるファイルは読み取りと書き込みが可能です。必要に応じて、読み取りパラメーターを指定できます。_唯一は真実です。
ワークシートを入手する-シート
# すべてのシートの名前を取得します
print(wb.get_sheet_names())
# シート名に従ってシートを入手する
a_sheet = wb.get_sheet_by_name('Sheet1')
# シート名を取得する
print(a_sheet.title)
# 現在表示されているシートを取得する,wbも使用できます.get_active_sheet()
sheet = wb.active
セルを取得
# セルの値を取得し、excelを観察して、文字、数字、列の順になっていることを確認します。
b4 = sheet['B4']
# 別途返品
print(f'({b4.column}, {b4.row}) is {b4.value}') #返される番号はintタイプです
# 添え字の取得に加えて、セル機能を使用することもできます,数字に変更します。これはB2を意味します
b4_too = sheet.cell(row=4, column=2)print(b4_too.value)
b4.columnはBを返し、b4.rowは4を返し、valueはそのセルの値です。さらに、セルには属性座標があり、b4のようなセルは座標B4を返します。
最大の行と最大の列を取得する
行と列を取得
sheet.rowsは、各行のデータを含むジェネレーターであり、各行はタプルでラップされます。
sheet.columnsも同様ですが、内部には各タプルが各列のセルです。
# ラインがあるので、A1に戻ります, B1,C1この注文
for row in sheet.rows:for cell in row:print(cell.value)
# A1, A2,A3この順
for column in sheet.columns:for cell in column:print(cell.value)
上記のコードは、すべてのセルのデータを取得できます。特定の行のデータを取得したい場合はどうなりますか? sheet.rowsはジェネレータータイプであり、インデックスを使用できないため、インデックスを付けるだけです。リストに変換した後、インデックスを使用できます。List(sheet.rows)[2]は、2番目の行のタプルオブジェクトを取得します。
for cell inlist(sheet.rows)[2]:print(cell.value)
任意の範囲のセルを取得するにはどうすればよいですか?
次の書き込み方法である範囲関数を使用して、A1を左上隅、B3を右下隅として長方形領域内のすべてのセルを取得できます。 openpyxlでは、Excelの式と一貫性を保つために、最初の値を表すために0を使用するプログラミング言語と一貫性がないため、範囲は1から始まることに注意してください。
for i inrange(1,4):for j inrange(1,3):print(sheet.cell(row=i, column=j))
# out
< Cell pythontab.A1
< Cell pythontab.B1
< Cell pythontab.A2
< Cell pythontab.B2
< Cell pythontab.A3
< Cell pythontab.B3
スライスのように使用することもできます。 sheet ['A1': 'B3']はタプルを返します。タプルはまだタプルです。各行のセルはタプルを形成します。
for row_cell in sheet['A1':'B3']:for cell in row_cell:print(cell)for cell in sheet['A1':'B3']:print(cell)
# out(<Cell pythontab.A1 ,<Cell pythontab.B1 )(<Cell pythontab.A2 ,<Cell pythontab.B2 )(<Cell pythontab.A3 ,<Cell pythontab.B3 )
文字に従って列番号を取得し、列番号に従って文字を返します
インポートする必要があります。これら2つの関数はopenpyxl.utilsにあります。
from openpyxl.utils import get_column_letter, column_index_from_string
# 列番号に基づいて文字を返す
print(get_column_letter(2)) # B
# 文字に基づいて列の番号を返します
print(column_index_from_string('D')) # 4
Excelにデータを書き込む
ワークシート関連
WorkBookをインポートする必要があります
from openpyxl import Workbook
wb =Workbook()
これにより、新しいワークシートが作成されます(ただし、まだ保存されていません)。
書き込み専用モードを指定するには、パラメーターwrite_only = Trueを指定できます。通常、デフォルトの書き込み可能および読み取り可能モードで十分です。
print(wb.get_sheet_names()) #デフォルトでSheetという名前のテーブルを提供し、office2016の下に新しいデフォルトのSheet1を作成します
# 直接割り当てにより、ワークシートの名前を変更できます
sheet.title ='Sheet1'
# 新しいワークシートを作成します。インデックスを指定して、ワークブック内での位置を適切に配置できます。
wb.create_sheet('Data', index=1) #2番目のワークシート、インデックスに配置されます=0が最初の位置です
# ワークシートを削除する
wb.remove(sheet)
del wb[sheet]
セルに書き込む
次の式を使用することもできます
# セルに直接値を割り当てるだけです
sheet['A1']='good'
# B9で平均値を書く
sheet['B9']='=AVERAGE(B2:B8)'
ただし、読み取り時にdata_only = Trueを追加して、B9が数値を返す必要がある場合、このパラメーターを追加しないと、戻り値は式自体 '= AVERAGE(B2:B8)'になります。
追加機能
最初の空白行から始めて、一度に複数行のデータを追加できます(以下は空白行です)。
# 行を追加する
row =[1,2,3,4,5]
sheet.append(row)
# 複数行追加
rows =[['Number','data1','data2'],[2,40,30],[3,40,25],[4,50,30],[5,30,10],[6,25,5],[7,50,10],]
追加関数は行でしか記述できないためです。列に書き込みたい場合はどうなりますか。追加は需要を満たすことができますか?上記のリストがマトリックスとしてネストされている場合。マトリックスを転置するだけです。 zip()関数を使用して実現できますが、内部リストはタプルになります。それらはすべて反復可能なオブジェクトであり、それらに影響を与えません。
list(zip(*rows))
# out
[(' Number',2,3,4,5,6,7),('data1',40,40,50,30,25,50),('data2',30,25,30,10,5,10)]
上記のlist(zip(* rows))について説明します。最初の* rowsはリストを分割します。これは、いくつかのパラメーターを入力するのと同じです。zipは、リストから最初の値を抽出してタプルに結合し、から各リストを抽出します。 2番目の値はリストから抽出され、最も短いリストの最後の値が抽出されるまでタプルに結合されます。長いリストの後の値は破棄されます。つまり、最後のタプルの数は各パラメーターによって決定されます。 (Iterableオブジェクト)最短の長さによって決定されます。たとえば、値がランダムに削除された場合、リストの最短の長さは2であり、data2列(垂直方向に見た場合)の値はすべて破棄されます。
rows =[['Number','data1','data2'],[2,40],[3,40,25],[4,50,30],[5,30,10],[6,25,5],[7,50,10],]
# out
[(' Number',2,3,4,5,6,7),('data1',40,40,50,30,25,50)]
最後に、zipはzipオブジェクトを返し、データは表示されません。リスト変換を使用するだけです。 zipを使用すると、列へのデータの書き込みが容易になります。
フォント
bold_itatic_24_font =Font(name='輪郭', size=24, italic=True, color=colors.RED, bold=True)
sheet['A1'].font = bold_itatic_24_font
上記のコードは、24行目が太字で斜体で、フォントの色が赤であることを指定しています。セルのfontプロパティを直接使用して、Fontオブジェクトをセルに割り当てます。
配置
また、垂直方向のセンタリングと水平方向のセンタリングが指定されているセル属性アラインメントを直接使用します。中央に加えて、右や左などのパラメータも使用できます。
# B1のデータを垂直方向と水平方向の中央に配置するように設定します
sheet['B1'].alignment =Alignment(horizontal='center', vertical='center')
行の高さと列の幅を設定する
データが長すぎて表示できない場合があります。セルを拡大する必要があります
# 行2の高さ
sheet.row_dimensions[2].height =40
# C列幅
sheet.column_dimensions['C'].width =30
セルの結合と分割
いわゆるマージされたセルとは、マージされた領域の左上隅のセルが参照として使用され、他のセルがカバーされて大きなセルになることを意味します。
逆に、セルを分割すると、この大きなセルの値は元の左上隅の位置に戻ります。
# セルをマージして、左上隅にデータを書き込みます
sheet.merge_cells('B1:G1') #複数のセルを連続してマージします
sheet.merge_cells('A1:C3') #長方形の領域でセルを組み合わせる
マージ後は、インターバルの左座標である左上隅にのみデータを書き込むことができます。
マージするこれらのセルにデータがある場合、左上隅のデータのみが保持され、他のセルは破棄されます。つまり、マージ前にデータが左上隅に書き込まれなかった場合、マージ後のセルにはデータがありません。
以下は、セルを分割するためのコードです。分割後、値はA1の位置に戻ります。
sheet.unmerge_cells('A1:C3')
コード拡張の例:
# coding=utf-8import xlrd
# ファイルを開く
data = xlrd.open_workbook('file/demo.xlsx')
# ワークシートを見る
data.sheet_names()print("sheets:"+str(data.sheet_names()))
# ファイル名でワークシートを取得する,ワークシート1を取得
table = data.sheet_by_name('作業スケジュール1')
# データを印刷する.sheet_names()戻り値はリストであり、ワークシート1はリストにインデックスを付けることによって取得されていることがわかります。
# table = data.sheet_by_index(0)
# 行と列の数を取得します
# 行数:テーブル.nrows
# 列数:テーブル.ncols
print("行の総数:"+str(table.nrows))print("列の総数:"+str(table.ncols))
# 行全体の値と列全体の値を取得します。返される結果は配列です。
# 行全体の値:テーブル.row_values(start,end)
# 列全体の値:テーブル.col_values(start,end)
# パラメータstartは、印刷を開始する番号です。
# endはその位置への印刷の終わりであり、デフォルトはnoneです。
print("行全体の値:"+str(table.row_values(0)))print("列全体の値:"+str(table.col_values(1)))
# セルの値を取得します。たとえば、セルB3の値を取得します。
cel_B3 = table.cell(3,2).value
print("3行目と2列目の値:"+ cel_B3)
これまで、pythonを使用してexcelフォームを処理する方法に関するこの記事を紹介しました。pythonを使用してexcelフォームを処理する方法の詳細については、ZaLou.Cnの以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後、ZaLouをさらにサポートしていただければ幸いです。 Cn!
Recommended Posts