>  기사  >  백엔드 개발  >  openpyxl을 사용하여 Excel을 읽고 쓰는 방법에 대한 Python 튜토리얼

openpyxl을 사용하여 Excel을 읽고 쓰는 방법에 대한 Python 튜토리얼

零下一度
零下一度원래의
2017-06-30 14:25:187808검색

Python은 openpyxl을 사용하여 Excel 파일을 읽고 씁니다.

이것은 xlsx 형식의 Excel 파일을 처리할 수 있는 타사 라이브러리입니다. pip install openpyxl 설치. Aanconda를 사용한다면 Aanconda도 함께 제공되어야 합니다. xlsx格式的Excel文件。pip install openpyxl安装。如果使用Aanconda,应该自带了。

读取Excel文件

需要导入相关函数。

from openpyxl import load_workbook# 默认可读写,若有需要可以指定write_only和read_only为Truewb = load_workbook('mainbuilding33.xlsx')

默认打开的文件为可读写,若有需要可以指定参数read_onlyTrue

获取工作表--Sheet

# 获得所有sheet的名称print(wb.get_sheet_names())# 根据sheet名字获得sheeta_sheet = wb.get_sheet_by_name('Sheet1')# 获得sheet名print(a_sheet.title)# 获得当前正在显示的sheet, 也可以用wb.get_active_sheet()sheet = wb.active

获取单元格

# 获取某个单元格的值,观察excel发现也是先字母再数字的顺序,即先列再行b4 = sheet['B4']# 分别返回print(f'({b4.column}, {b4.row}) is {b4.value}')  # 返回的数字就是int型# 除了用下标的方式获得,还可以用cell函数, 换成数字,这个表示B2b4_too = sheet.cell(row=4, column=2)print(b4_too.value)

b4.column返回B, b4.row返回4, value则是那个单元格的值。另外cell还有一个属性coordinate, 像b4这个单元格返回的是坐标B4

获得最大行和最大列

# 获得最大列和最大行print(sheet.max_row)print(sheet.max_column)

获取行和列

  • sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹。

  • sheet.columns类似,不过里面是每个tuple是每一列的单元格。

# 因为按行,所以返回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之后再使用索引list(sheet.rows)[2]这样就获取到第二行的tuple对象。

for cell in list(sheet.rows)[2]:print(cell.value)

如何获得任意区间的单元格?

可以使用range函数,下面的写法,获得了以A1为左上角,B3为右下角矩形区域的所有单元格。注意range从1开始的,因为在openpyxl中为了和Excel中的表达方式一致,并不和编程语言的习惯以0表示第一个值。

for i in range(1, 4):for j in range(1, 3):print(sheet.cell(row=i, column=j))        
# out<Cell mainbuilding33.A1><Cell mainbuilding33.B1><Cell mainbuilding33.A2><Cell mainbuilding33.B2><Cell mainbuilding33.A3><Cell mainbuilding33.B3>

还可以像使用切片那样使用。sheet['A1':'B3']返回一个tuple,该元组内部还是元组,由每行的单元格构成一个元组。

for row_cell in sheet[&#39;A1&#39;:&#39;B3&#39;]:for cell in row_cell:print(cell)        

for cell in sheet[&#39;A1&#39;:&#39;B3&#39;]:print(cell)# out(<Cell mainbuilding33.A1>, <Cell mainbuilding33.B1>)
(<Cell mainbuilding33.A2>, <Cell mainbuilding33.B2>)
(<Cell mainbuilding33.A3>, <Cell mainbuilding33.B3>)

根据字母获得列号,根据列号返回字母

需要导入, 这两个函数存在于openpyxl.utils

from openpyxl.utils import get_column_letter, column_index_from_string# 根据列的数字返回字母print(get_column_letter(2))  # B# 根据字母返回列的数字print(column_index_from_string(&#39;D&#39;))  # 4

将数据写入Excel

工作表相关

需要导入WorkBook

from openpyxl import Workbook

wb = Workbook()

这样就新建了一个新的工作表(只是还没被保存)。

若要指定只写模式,可以指定参数write_only=True。一般默认的可写可读模式就可以了。

print(wb.get_sheet_names())  # 提供一个默认名叫Sheet的表,office2016下新建提供默认Sheet1# 直接赋值就可以改工作表的名称sheet.title = &#39;Sheet1&#39;# 新建一个工作表,可以指定索引,适当安排其在工作簿中的位置wb.create_sheet(&#39;Data&#39;, index=1)  # 被安排到第二个工作表,index=0就是第一个位置# 删除某个工作表wb.remove(sheet)del wb[sheet]

写入单元格

还可以使用公式哦

# 直接给单元格赋值就行sheet[&#39;A1&#39;] = &#39;good&#39;# B9处写入平均值sheet[&#39;B9&#39;] = &#39;=AVERAGE(B2:B8)&#39;

但是如果是读取的时候需要加上data_only=True这样读到B9返回的就是数字,如果不加这个参数,返回的将是公式本身'=AVERAGE(B2:B8)'

append函数

可以一次添加多行数据,从第一行空白行开始(下面都是空白行)写入。

# 添加一行row = [1 ,2, 3, 4, 5]
sheet.append(row)# 添加多行rows = [
    [&#39;Number&#39;, &#39;data1&#39;, &#39;data2&#39;],
    [2, 40, 30],
    [3, 40, 25],
    [4, 50, 30],
    [5, 30, 10],
    [6, 25, 5],
    [7, 50, 10],
]

由于append函数只能按行写入。如果我们想按列写入呢。append能实现需求么?如果把上面的列表嵌套看作矩阵。只要将矩阵转置就可以了。使用zip()函数可以实现,不过内部的列表变成了元组就是了。都是可迭代对象,不影响。

list(zip(*rows))# out[(&#39;Number&#39;, 2, 3, 4, 5, 6, 7),
 (&#39;data1&#39;, 40, 40, 50, 30, 25, 50),
 (&#39;data2&#39;, 30, 25, 30, 10, 5, 10)]

解释下上面的list(zip(*rows))首先*rows将列表打散,相当于填入了若干个参数,zip从某个列表中提取第1个值组合成一个tuple,再从每个列表中提取第2个值组合成一个tuple,一直到最短列表的最后一个值提取完毕后结束,更长列表的之后的值被舍弃,换句话,最后的元组个数是由原来每个参数(可迭代对象)的最短长度决定的。比如现在随便删掉一个值,最短列表长度为2,data2那一列(竖着看)的值全部被舍弃。

rows = [
    [&#39;Number&#39;, &#39;data1&#39;, &#39;data2&#39;],
    [2, 40],
    [3, 40, 25],
    [4, 50, 30],
    [5, 30, 10],
    [6, 25, 5],
    [7, 50, 10],
]# out[(&#39;Number&#39;, 2, 3, 4, 5, 6, 7), (&#39;data1&#39;, 40, 40, 50, 30, 25, 50)]

最后zip返回的是zip对象,看不到数据的。使用list转换下就好了。使用zip可以方便实现将数据按列写入。

保存文件

所有的操作结束后,一定记得保存文件。指定路径和文件名,后缀名为xlsx

wb.save(r&#39;D:\example.xlsx&#39;)

设置单元格风格--Style

先导入需要的类from openpyxl.styles import Font, colors, Alignment

엑셀 파일 읽기

관련 기능을 가져와야 합니다.

bold_itatic_24_font = Font(name=&#39;等线&#39;, size=24, italic=True, color=colors.RED, bold=True)

sheet[&#39;A1&#39;].font = bold_itatic_24_font

기본적으로 열리는 파일은 읽기 및 쓰기가 가능합니다. 필요한 경우 read_only 매개변수를 True로 지정할 수 있습니다.
워크시트 가져오기--Sheet🎜🎜
# 设置B1中的数据垂直居中和水平居中sheet[&#39;B1&#39;].alignment = Alignment(horizontal=&#39;center&#39;, vertical=&#39;center&#39;)
🎜🎜셀 가져오기🎜🎜
# 第2行行高sheet.row_dimensions[2].height = 40# C列列宽sheet.column_dimensions[&#39;C&#39;].width = 30
🎜🎜b4.columnReturn B, b4.rowReturns 4, 값은 해당 셀의 값입니다. 또한 셀에는 coordinate 속성도 있습니다. b4와 같은 셀은 B4 좌표를 반환합니다. 🎜🎜최대 행 및 최대 열 가져오기🎜🎜
# 合并单元格, 往左上角写入数据即可sheet.merge_cells(&#39;B1:G1&#39;) # 合并一行中的几个单元格sheet.merge_cells(&#39;A1:C3&#39;) # 合并一个矩形区域中的单元格
🎜🎜행 및 열 가져오기🎜
  • 🎜sheet.rows는 생성기입니다. 이는 데이터의 각 행이 튜플로 래핑됩니다. 🎜
  • 🎜sheet.columns는 비슷하지만 각 튜플은 각 열의 셀입니다. 🎜
🎜
sheet.unmerge_cells(&#39;A1:C3&#39;)
🎜🎜위 코드는 모든 셀의 데이터를 가져올 수 있습니다. 특정 행의 데이터를 가져오려면 어떻게 해야 합니까? sheet.rows는 생성기 유형이므로 목록으로 변환한 다음 list()를 사용하세요. sheet.rows )[2]이런 방식으로 두 번째 행의 튜플 객체를 얻습니다. 🎜🎜rrreee🎜🎜모든 범위의 셀을 얻는 방법은 무엇입니까? 🎜🎜 range 기능을 사용할 수 있습니다. 다음 작성 방법은 A1이 왼쪽 위 모서리이고 B3이 오른쪽 아래 모서리인 직사각형 영역의 모든 셀을 가져옵니다. 범위는 1부터 시작한다는 점에 유의하세요. 왜냐하면 openpyxl에서는 Excel의 표현과 일관성을 유지하기 위해 0을 사용하여 범위를 나타내는 프로그래밍 언어의 관례를 따르지 않기 때문입니다. 첫 번째 값. 🎜🎜rrreee🎜🎜는 슬라이스처럼 사용할 수도 있습니다. sheet['A1':'B3']는 내부의 튜플이기도 한 튜플을 반환합니다. 각 행의 셀은 튜플을 형성합니다. 🎜🎜rrreee🎜🎜문자를 기준으로 열 번호를 가져오고 열 번호를 기준으로 문자를 반환합니다.🎜🎜가져와야 합니다. 이 두 함수는 openpyxl.utils🎜🎜rrreee🎜Excel에 데이터 쓰기🎜워크시트 관련🎜🎜WorkBook🎜🎜rrreee🎜🎜을 가져와야 합니다. 이렇게 하면 새 워크시트가 생성됩니다(아직 저장되지 않았을 뿐입니다). 🎜🎜쓰기 전용 모드를 지정하려면 write_only=True 매개변수를 지정하면 됩니다. 일반적으로 기본 쓰기 및 읽기 모드이면 충분합니다. 🎜🎜rrreee🎜🎜셀에 쓰기🎜🎜수식을 사용할 수도 있습니다🎜🎜rrreee🎜🎜단, 읽고 있는 경우 data_only=True를 추가해야 읽은 후 반환됩니다. B9 이 매개변수를 추가하지 않으면 수식 자체가 반환됩니다. '=AVERAGE(B2:B8)'🎜

append function

🎜여러 개를 추가할 수 있습니다. 첫 번째 행부터 시작하여 한 번에 데이터 행 빈 줄로 시작합니다(다음은 모두 빈 줄입니다). 🎜🎜rrreee🎜🎜append 함수는 행 쓰기만 할 수 있기 때문입니다. 열별로 쓰고 싶다면 어떻게 해야 할까요? 추가가 요구 사항을 충족할 수 있나요? 위의 중첩 목록을 행렬로 생각하면. 행렬을 전치하면 됩니다. 이는 zip() 함수를 사용하여 달성할 수 있지만 내부 목록은 튜플이 됩니다. 이들은 모두 반복 가능한 객체이며 효과가 없습니다. 🎜🎜rrreee🎜🎜위의 list(zip(*rows))를 설명하세요. 먼저 *rows는 목록을 분할하는데, 이는 여러 매개변수를 채우는 것과 같습니다. >zip은 목록에서 첫 번째 값을 추출하여 튜플로 결합한 다음, 가장 짧은 목록이 끝날 때까지 각 목록에서 두 번째 값을 추출하여 튜플로 결합합니다. 값이 추출된 후 더 긴 목록의 후속 값은 삭제됩니다. 즉, 최종 튜플 수는 각 원래 매개변수(반복 가능한 객체)의 가장 짧은 길이에 따라 결정됩니다. 예를 들어 임의로 값을 삭제하면 목록의 가장 짧은 길이는 2가 되며, data2 열(세로 보기)의 값은 모두 삭제됩니다. 🎜🎜rrreee🎜🎜결국 zip은 zip 개체를 반환하므로 데이터를 볼 수 없습니다. 변환하려면 list를 사용하세요. 열에 데이터를 쉽게 쓰려면 zip을 사용하세요. 🎜🎜파일 저장🎜🎜모든 작업이 완료된 후 반드시 파일을 저장하세요. 접미사 xlsx를 사용하여 경로와 파일 이름을 지정합니다. 🎜🎜rrreee🎜

셀 스타일 설정--스타일

🎜먼저 필수 클래스를 가져옵니다. openpyxl.styles import Font, colors, Alignment🎜🎜글꼴 관련 및 색상을 각각 지정할 수 있습니다. 및 정렬. 🎜🎜글꼴🎜🎜rrreee🎜

上面的代码指定了等线24号加粗斜体,字体颜色红色。直接使用cell的font属性,将Font对象赋值给它。

对齐方式

也是直接使用cell的属性aligment,这里指定垂直居中和水平居中。除了center,还可以使用right、left等等参数。

# 设置B1中的数据垂直居中和水平居中sheet[&#39;B1&#39;].alignment = Alignment(horizontal=&#39;center&#39;, vertical=&#39;center&#39;)

设置行高和列宽

有时候数据太长显示不完,就需要拉长拉高单元格。

# 第2行行高sheet.row_dimensions[2].height = 40# C列列宽sheet.column_dimensions[&#39;C&#39;].width = 30

合并和拆分单元格

所谓合并单元格,即以合并区域的左上角的那个单元格为基准,覆盖其他单元格使之称为一个大的单元格。

相反,拆分单元格后将这个大单元格的值返回到原来的左上角位置。

# 合并单元格, 往左上角写入数据即可sheet.merge_cells(&#39;B1:G1&#39;) # 合并一行中的几个单元格sheet.merge_cells(&#39;A1:C3&#39;) # 合并一个矩形区域中的单元格

合并后只可以往左上角写入数据,也就是区间中:左边的坐标。

如果这些要合并的单元格都有数据,只会保留左上角的数据,其他则丢弃。换句话说若合并前不是在左上角写入数据,合并后单元格中不会有数据。

以下是拆分单元格的代码。拆分后,值回到A1位置。

sheet.unmerge_cells(&#39;A1:C3&#39;)

这里就拿常用的说,具体的去看openpyxl文档

위 내용은 openpyxl을 사용하여 Excel을 읽고 쓰는 방법에 대한 Python 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.