响应式布局网站建设,住房公积金网站怎么做减员,东莞做网站排名,宾馆做网站秋风阁-北溪入江流 文章目录 安装依赖库openpyxlopenpyxl的操作加载文件#xff0c;获取sheet加载文件load_workbook获取sheet 遍历单元格迭代遍历索引遍历 单元格行高和列宽的修改Excel列号与字母的转换Excel行高修改Excel列宽修改 Excel表格文字对齐属性设置修改单元格框线保…秋风阁-北溪入江流 文章目录 安装依赖库openpyxlopenpyxl的操作加载文件获取sheet加载文件load_workbook获取sheet 遍历单元格迭代遍历索引遍历 单元格行高和列宽的修改Excel列号与字母的转换Excel行高修改Excel列宽修改 Excel表格文字对齐属性设置修改单元格框线保存Excel文件 openpyxl实战Excel样式优化 在操作Excel表格时我们有时需要对Excel表中的内容样式进行修改。当Excel文件过大的情况下修改样式单元格较多修改麻烦可采用代码脚本的方式来进行Excel样式的修改
安装依赖库openpyxl
pip install openpyxlopenpyxl的操作
加载文件获取sheet
加载文件load_workbook
在Excel中一般把一个文件称为工作薄。在openpyxl中可以通过load_workbook()方法来加载一个文件返回Workbook对象。Workbook对象会保存Excel表中的所有相关信息。
from openpyxl import load_workbookload_workbook(file_path)获取sheet
在一个Excel文件中会有多个sheet表格所以当操作Excel文件时需要对多个sheet分别处理。在对多个sheet表格进行处理时可以通过先获取表格内部所有的sheetname然后在通过sheetname获取对应的sheet
openpyxl中可以通过workbook.get_sheet_names()方法来获取所需所有sheetname列表 在openpyxl中workbook.get_sheet_names()方法将在后续版本废除可以通过workbook.sheetnames属性来获取所有的sheetname 获取到对应的sheetname名称后可以通过workbook.get_sheet_by_name(sheetname)的方法获取对应的sheet然后对sheet中的单元格进行操作 在openpyxl中workbook.get_sheet_by_name(sheetname)方法将在后续版本废除可以通过workbook.[sheetname]属性来获取对应的sheet
sheetnames workbook.get_sheet_names()for sheetname in sheetnames:sheet workbook.get_sheet_by_name(sheetname)...openpyxl中可以通过workbook.sheetnames的方法获取所有的sheetname。推荐使用openpyxl中可以通过workbook.[sheetname]的方法根据sheetname获取对应的sheet。推荐使用
sheetnames workbook.sheetnamesfor sheetname in sheetnames:sheet workbook[sheetname]...遍历单元格
Excel表格格式作为二维的结构化文件存储格式对其数据遍历读取修改可以按照行的方式或列的方式进行遍历。
迭代遍历
在openpyxl中可以通过sheet.rows按行获取数据或sheet.columns按列获取数据。获取到每一行或者每一列的数据后在对其迭代遍历即可获取到具体的单元格cell可以通过cell.value获取单元格的具体值。 按行遍历
for row in sheet.rows:for cell in row:value cell.value...按列遍历
for col in sheet.columns:for cell in col:value cell.value...索引遍历
通过sheet.rows和sheet.columns属性可以很好对按行或按列对表格进行迭代遍历但是有时我们在遍历的过程中希望知道当前遍历对象的索引迭代遍历不能很好的满足我们的需求。 在sheet.rows和sheet.columns属性中返回的是一个迭代器所以不能直接根据索引获取内容所以需要先将其转换成列表然后获取索引来实现遍历 注意索引遍历因为将sheet的属性转存了所以在索引遍历中对内容的修改并不会影响到Workbook对象所以索引遍历的优点是仅能获取到对应的索引并不能对属性进行修改。 按行索引
rows list(sheet.rows)for row_index in range(sheet.max_row):for col_index in range(len(rows[row_index])):value rows[row_index][col_index].value...按列索引
columns list(sheet.columns)for col_index in range(sheet.max_column):for row_index in range(len(columns[col_index])):value columns[col_index][row_index].value...单元格行高和列宽的修改
Excel列号与字母的转换
在Excel中行号以数字1为下标开始索引列号以字母A为下标开始索引。在编程语言中一般以下标0为下标开始索引。所以在处理列的时候需要将数字下标转换为相应的字母下标来获取对应的列。openpyxl提供列专门的转换工具。
openpyxl.utils.get_column_letter(index: int)实现数字下标到列号字母的转换openpyxl.utils.column_index_from_string(str_col: str)实现列号字母到数字下标到转换
Excel行高修改
在进行Excel行高的修改时需要先根据对应的行号获取到对应的行然后对行高修改。 在openpyxl中通过sheet.row_dimensions[row_number]获取到对应的行修改sheet.row_dimensions[row_number].height属性来修改行高。
rows list(sheet.rows)for row_index in range(sheet.max_row):for col_index in range(len(rows[row_index])):sheet.row_dimensions[row_index 1].height 100Excel列宽修改
在进行Excel列宽的修改时需要先根据对应的列号索引获取对应列的字母下标然后根据字母下标获取对应列对列宽修改。 在openpyxl中通过sheet.column_dimensions[col_number]获取到对应的列修改sheet.column_dimensions[col_number].width属性来修改列宽。
columns list(sheet.columns)for col_index in range(sheet.max_column):for row_index in range(len(columns[col_index])):sheet.column_dimensions[get_column_letter(col_index 1)].width 100Excel表格文字对齐属性设置
在对Excel的行高和列宽属性进行修改后由于文字的对齐设置往往会导致部分单元格中字体的显示效果不好。这时我们可以设置文字的对齐属性来修改文字在单元格中的排布。 在Excel中对齐属性是针对单元格而言的所以我们需要获取到对应的单元格而不是行列。对齐属性可以分为水平对齐属性和垂直对齐属性需要对这两个维度的属性分别进行设置。
获取单元格在openpyxl中获取单元格是根据sheet按照先列后行的维度进行获取
cell sheet[f{get_column_letter(col_number)}{row_number}]对齐属性在openpyxl中对齐属性通过对象Alignment进行设置修改 水平方向horizontal属性 left左对齐center水平居中right右对齐justify两端对齐 垂直方向vertical属性 top顶端对齐center垂直居中bottom底端对齐
from openpyxl.styles import Alignmentalignment Alignment(horizontaljustify, verticalcenter)修改对齐属性通过修改单元格的alignment属性来修改对齐属性
from openpyxl.styles import Alignmentalignment Alignment(horizontaljustify, verticalcenter)
sheet[f{get_column_letter(col_number)}{row_number}].alignment alignment修改单元格框线
在Excel中针对表格的框线同样也是针对单元格而言的。openpyxl中修改框线通过Border对象来设置。由于边框线分别有上下左右四个方向的框线所以需要分别对四个方向的框线进行设置。在Boder对象中通过Side属性来设置某一方向上的线条。
Border对象单元格框线 方向 top上边框线条设置bottom下边框线条设置left左边框线条设置right右边框线条设置 线条属性Side对象 style设置线条的属性 可选属性dashDot、dashDotDot、dashed、dotted、double、hair、medium、mediumDashDot、mediumDashDotDot、mediumDashed、slantDashDot、thick、thin线条的可选属性较多一般选择常用的thin线条即可 color设置线条颜色类型HEX格式的颜色属性默认黑色 修改单元格边框通过修改单元格的border属性来修改边框颜色
from openpyxl.styles.borders import Border, Sidethin_border Border(topSide(stylethin),bottomSide(stylethin),leftSide(stylethin),rightSide(stylethin)
)
sheet[f{get_column_letter(col_number)}{row_number}].border thin_border保存Excel文件
在上文中提到调用openpyxl.load_workbook()方法会返回一个Workbook对象对象中包含了Excel中的相关信息属性我们在后文中对Excel的修改本质上都是对Workbook对象的属性进行修改所以在保存是是需要调用workbook.save(file_path)即可将修改后的内容写入Excel文件中。
openpyxl实战Excel样式优化
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter, column_index_from_string
from openpyxl.styles import Alignment
from openpyxl.styles.borders import Border, Sidedef pref_excel_style(file_path):优化Excel样式根据单元格内文字长度优化行高和列宽优化单元格边框样式# 边框样式thin_border Border(topSide(stylethin),bottomSide(stylethin),leftSide(stylethin),rightSide(stylethin),)# 对齐属性alignment Alignment(horizontaljustify, verticalcenter)# 获取工作博workbook load_workbook(file_path)# 根据sheet名称来获取当前工作表逐sheet修改for sheetname in workbook.sheetnames:sheet workbook[sheetname]columns list(sheet.columns)rows list(sheet.rows)# 列遍历获取每列最长cell修改单元格宽度for col_index in range(sheet.max_column):try:max_col_len max(len(cell.value) for cell in columns[col_index] if cell.value is not None)# 修改cell宽度if max_col_len 5:sheet.column_dimensions[get_column_letter(col_index 1)].width 10elif 5 max_col_len 75:sheet.column_dimensions[get_column_letter(col_index 1)].width max_col_len * 1.5else:sheet.column_dimensions[get_column_letter(col_index 1)].width 100except ValueError as error:# 捕获在多个sheet的情况下其余sheet内无数据导致的调用max()方法异常...# 行遍历获取没行最长cell修改行高和超出长度单元格排布属性for row_index in range(sheet.max_row):try:max_row_len max(len(cell.value) for cell in rows[row_index] if cell.value is not None)if max_row_len 100:sheet.row_dimensions[row_index 1].height max_row_len * 2for col_index in range(sheet.max_column):# 修复文字内容过长情况下修改cell高度文字的排版情况sheet[f{get_column_letter(col_index 1)}{row_index 1}].alignment alignmentexcept ValueError as error:...# 所有数据添加单元格for row in sheet.rows:for cell in row:cell.border thin_borderworkbook.save(file_path)以上的行高和列宽与单元格文字长度是经过多次试验后得到了修改样式后显示效果较优的关系可根据自身需求更改。