前面我们介绍了使用Python包处理Excel的的基本操作,今天我们来讨论一下如何对Excel的格式进行修改。这次我们使用openpyxl包进行处理,当然pandas也可以对Excel进行格式的修改,这个以后有时间再讨论。
首先,我们来看看如何修改Excel文本的字体。在Excel文件中字体也是比较重要的一个方面,使用openpyxl修改Excel文件的字体需要先选中需要修改字体的单元格,然后可以设置单元格的字体,大小以及背景色等等。Font对象用于设置字体,PatternFill对象用于设置填充。
## 设置字体格式
import openpyxl
from openpyxl.styles import Font, Color, colors # 导入字体和颜色模块
from openpyxl.styles import PatternFill # 导入填充模块
wb = openpyxl.Workbook()
sheet = wb.get_sheet_by_name('Sheet')
italic24Font = Font(size=24, italic=True, color=colors.RED) # 设置字体
sheet['A1'].font = italic24Font
sheet['A1'] = 'Hello World!'
sheet['A1'].fill = PatternFill(fill_type='solid',fgColor=colors.GREEN) # 设置单元格填充色
#sheet.sheet_view.showGridLines = False #小技巧:不显示网格
wb.save('styled.xlsx')
可以看到经过我们处理后,"Hello World"已经修改成24号大小,斜体,颜色为红色,并且单元格填充为绿色了。(这里还有个小技巧,就是将sheet的sheet_view的属性showGridLines设置为False可以关闭Excel的网格显示。)
设置字体
下面,我看一下如何修改Excel的行高和列宽。要修改Excel的行高和列宽,我们用sheet.row_dimensions和sheet.column_dimensions来设置,代码如下:
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
sheet['A1'] = 'Tall row'
sheet['B2'] = 'Wide column'
sheet.row_dimensions[1].height = 70 # 设置第一行的行高为70
sheet.column_dimensions['B'].width = 20 # 设置B列的列宽为20
wb.save('dimensions.xlsx')
修改行高列宽
可以看到,实现了行高和列宽的修改。
下面我们再看看如何合并和拆分单元格。用openpyxl合并拆分单元格非常容易,merge_cells[strart:end]用于合并单元格,unmerge_cells[start:end]用于拆分单元格。
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
sheet.merge_cells('A1:D3')
sheet['A1'] = 'Twelve cells merged together.'
sheet.merge_cells('C5:D5')
sheet['C5'] = 'Two merged cells.'
wb.save('merged.xlsx')
可以看到,A1到D3之间的单元格被合并成一个单元格,C5到D5之间也是合并为一个单元格了。
合并单元格
拆分单元格也是一样,不再赘述,直接上代码。
import openpyxl
wb = openpyxl.load_workbook('merged.xlsx')
sheet = wb.get_active_sheet()
sheet.unmerge_cells('A1:D3')
sheet.unmerge_cells('C5:D5')
wb.save('merged.xlsx')
可以看到单元格已经被拆分了。
拆分单元格
冻结单元格
对于太大而不能一屏显示的excel文件,“冻结”顶部的行和左边的列是很有帮助的,就算滚动excel,表头也是使用可见的。在openpyxl中,每个Worksheet对象多有一个freeze_panes属性,可以设置为一个Cell对象或一个单元格坐标的字符串。
如果要解冻所有的单元格,只要设置freeze_panes为None或者‘A1’即可。
import openpyxl
wb = openpyxl.load_workbook('merged.xlsx')
sheet = wb.get_active_sheet()
sheet.freeze_panes = 'A2'
wb.save('freezeExample.xlsx')
可以看到首行已经被冻结。
冻结单元格
下面我们来做一个综合的示例,将我们上次的平均分Excel修改一下格式,标题栏字体改为24号,加粗,黑色,并设置背景灰色填充,姓名字体设置为12号,加粗,蓝色,平均分字体设置为12号,红色。最后,设置所有单元格居中对齐。代码如下:
import openpyxl
from openpyxl.styles import Font, Color, colors
from openpyxl.styles import PatternFill
from openpyxl.utils import get_column_letter
from openpyxl.styles import Alignment
from openpyxl.styles import PatternFill # 导入填充模块
wb = openpyxl.load_workbook('D:/Book5.xlsx')
sheet = wb.get_active_sheet()
#sheet = wb.get_sheet_by_name('Sheet1')
titleFont = Font(size=24, bold=True, color=colors.BLACK)
nameFont = Font(size=12, bold=True, color=colors.BLUE)
avgFont = Font(size=12, color=colors.RED)
nrows = sheet.max_row
ncols = sheet.max_column
for i in range(1, ncols+1):
#print(ncols)
sheet.cell(1, i).font = titleFont # 设置标题栏字体
column_letter = get_column_letter(i)
sheet.column_dimensions[column_letter].width = 25 # 动态设置列宽
sheet.cell(1, i).fill = PatternFill(fill_type='solid',fgColor="00C0C0C0") # 设置单元格填充色
for i in range(2, nrows+1):
sheet.cell(i, 1).font = nameFont # 设置姓名字体
for i in range(2, nrows+1):
#print(ncols)
sheet.cell(i, ncols).font = avgFont # 设置最后的平均分字体
for i in range(1, nrows+1):
for j in range(1, ncols+1):
sheet.cell(i,j).alignment = Alignment(horizontal='center', vertical='center') # 设置居中对齐
wb.save('D:/Book5.xlsx')
结果如图所示:
修改平均分Excel
可以看到Excel已经按我们的要求进行了设置。
其实openpyxl可以对Excel进行各种设置,包括poi等Java包也可以对Excel进行操作,不过我们介绍这些功能的目的并不是说用程序可以实现一些Excel中不存在的功能,这些事情用Excel一样可以很快的做到。但是一旦需要批量处理的时候,程序化的优势就显示出来了,想象一下,如果要对多个文件夹里面的几百个Excel统一批量修改格式,那么一个个去操作就太麻烦了,哪怕是VBA也仅仅是在一个Excel文件的内部进行处理。可是如果用Python或者Java进行批量处理的话,可以瞬间完成这些枯燥的操作,这才是程序化处理的优势所在。
网友评论