Python酷库之旅-第三方库openpyxl(20)

目录

一、 openpyxl库的由来

1、背景

2、起源

3、发展

4、特点

4-1、支持.xlsx格式

4-2、读写Excel文件

4-3、操作单元格

4-4、创建和修改工作表

4-5、样式设置

4-6、图表和公式

4-7、支持数字和日期格式

二、openpyxl库的优缺点

1、优点

1-1、支持现代Excel格式

1-2、功能丰富

1-3、易于使用

1-4、与Excel兼容性

1-5、性能良好

1-6、社区支持

1-7、跨平台

2、缺点

2-1、不支持旧版格式

2-2、某些特性支持有限

2-3、内存占用

2-4、文档和示例可能不足

2-5、依赖关系

2-6、学习曲线

三、openpyxl库的用途

1、读取Excel文件

2、写入Excel文件

3、修改Excel文件

4、自动化

5、与Excel交互

6、数据迁移和转换

7、创建模板化的报告

四、如何学好openpyxl库?

1、获取openpyxl库的属性和方法

2、获取openpyxl库的帮助信息

3、实战案例

3-241、设置单元格区域的除对角框线以外的全部边框

3-242、删除单元格区域的全部边框

3-243、设置单元格的颜色和背景

3-244、设置单元格的格式

3-245、设置单元格的对齐方式

3-246、缩小单元格内容以全部显示

3-247、设定/删除单元格的输入规则和信息提示(有效性设置)

3-248、为单元格设置条件格式/删除条件格式

3-249、为单元格插入指向工作簿内部的超链接/删除超链接

3-250、为单元格插入指向工作簿外部的超链接/删除超链接

3-251、为单元格添加批注/删除批注

3-252、修改单元格的批注

3-253、为单元格区域定义名称/删除名称(Name属性)

3-254、为单元格区域定义名称/删除名称(Add方法)

3-255、自动调整单元格大小

3-256、自动调整工作表全部单元格的大小

3-257、设置单元格的大小(以磅为单位)

3-258、设置单元格的大小(以cm为单位)

3-259、设置单元格的大小(以in为单位)

3-260、锁定单元格/解除单元格锁定

五、推荐阅读

1、Python筑基之旅

2、Python函数之旅

3、Python算法之旅

4、Python魔法之旅

5、博客个人主页

一、 openpyxl库的由来

        openpyxl库的由来可以总结为以下几点:

1、背景

        在openpyxl库诞生之前,Python中缺乏一个专门用于读取和编写Office Open XML格式(如Excel 2010及更高版本的.xlsx文件)的库。

2、起源

        openpyxl库的创建是为了解决上述提到的Python在处理Excel文件时的不足,它的开发受到了PHPExcel团队的启发,因为openpyxl最初是基于PHPExcel的。

3、发展

        随着时间的推移,openpyxl逐渐发展成为一个功能强大的Python库,专门用于处理Excel文件。它支持Excel 2010及更高版本的文件格式,并提供了丰富的API,用于读取、写入、修改Excel文件。

4、特点
4-1、支持.xlsx格式

        openpyxl主要用于处理Excel 2010及更新版本的.xlsx文件。

4-2、读写Excel文件

        使用openpyxl可以读取现有的Excel文件,获取数据,修改数据,并保存到新的文件中。

4-3、操作单元格

        openpyxl允许用户按行、列或具体的单元格进行数据的读取和写入。

4-4、创建和修改工作表

        用户可以创建新的工作表,复制和删除现有的工作表,设置工作表的属性等。

4-5、样式设置

        openpyxl支持设置单元格的字体、颜色、边框等样式。

4-6、图表和公式

        用户可以通过openpyxl创建图表、添加公式等。

4-7、支持数字和日期格式

        openpyxl能够正确处理数字和日期格式,确保在Excel中显示正确的格式。

        综上所述,openpyxl库的出现填补了Python在处理Excel文件时的空白,经过不断的发展和完善,成为了一个功能丰富、易于使用的Python库。

二、openpyxl库的

        openpyxl库是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库,它基于Python,并且对于处理Excel文件提供了很多便利的功能,其主要点有:

1、优点
1-1、支持现代Excel格式

        openpyxl支持.xlsx格式的Excel文件,这是Excel 2010及更高版本使用的格式,也是目前广泛使用的格式。

1-2、功能丰富

        openpyxl提供了创建、修改和保存Excel工作簿、工作表、单元格、图表、公式、图像等功能。

1-3、易于使用

        openpyxl的API设计得相对直观,使得Python开发者能够很容易地掌握和使用。

1-4、与Excel兼容性

        openpyxl能够处理Excel文件中的很多复杂特性,如公式、样式、条件格式等,这确保了与Excel的良好兼容性。

1-5、性能良好

        在处理大型Excel文件时,openpyxl通常能够保持较好的性能。

1-6、社区支持

        openpyxl是一个开源项目,拥有活跃的社区支持和维护,这意味着开发者可以获得帮助和修复错误的快速响应。

1-7、跨平台

        openpyxl可以在不同的操作系统上运行,包括Windows、Linux和macOS等。

2、缺点
2-1、不支持旧版格式

        openpyxl不支持较旧的.xls格式(Excel 97-2003)。如果需要处理这种格式的文件,需要使用其他库如xlrd和xlwt(尽管这些库也面临一些兼容性和维护问题)。

2-2、某些特性支持有限

        虽然openpyxl支持许多Excel特性,但可能对于某些高级或特定的Excel功能支持有限或不支持。

2-3、内存占用

        在处理大型Excel文件时,openpyxl可能会占用较多的内存。这是因为openpyxl会将整个工作簿加载到内存中。

2-4、文档和示例可能不足

        尽管openpyxl的文档相对完整,但对于某些高级功能或特定用例,可能缺乏足够的示例或详细解释。

2-5、依赖关系

        openpyxl依赖于lxml和et_xmlfile这两个Python库来处理XML和Excel文件,在某些环境中,可能需要额外安装这些依赖项。

2-6、学习曲线

        虽然openpyxl的API设计得相对直观,但对于初学者来说,可能需要一些时间来熟悉和掌握其用法。

三、openpyxl库的用途

        openpyxl是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它是用Python编写的,不需要Microsoft Excel,并且支持多种Excel数据类型,包括图表、图像、公式等,其主要用途有:

1、读取Excel文件

        你可以使用openpyxl来读取 Excel 文件中的数据,如单元格值、工作表名称、公式等,它支持多种数据类型,如字符串、数字、日期等。

2、写入Excel文件

        使用openpyxl,你可以创建新的Excel文件或向现有文件添加数据,你可以设置单元格的字体、颜色、边框等样式,你还可以添加图表、图像和其他复杂的Excel功能。

3、修改Excel文件

        你可以使用openpyxl来修改现有的Excel文件,如更改单元格值、添加或删除工作表等,这对于自动化数据处理和报告生成非常有用。

4、自动化

        openpyxl可以与其他Python库和框架(如 pandas、numpy、matplotlib 等)结合使用,以自动化数据处理和分析任务。你可以编写脚本来从多个数据源收集数据,将数据整合到 Excel 文件中,并执行各种数据分析任务。

5、与Excel交互

        如果你正在开发需要与Excel交互的应用程序或工具,openpyxl可以提供一个强大的API来处理Excel文件,它允许你读取和写入Excel文件,而无需依赖Microsoft Excel或其他第三方库。

6、数据迁移和转换

        使用openpyxl,你可以轻松地将数据从Excel文件迁移到其他数据库或文件格式,或将其他数据源的数据导入到Excel文件中。

7、创建模板化的报告

        你可以使用openpyxl来创建模板化的Excel报告,并在需要时填充数据,这对于需要定期生成具有一致格式和布局的报告的场景非常有用。

        总之,openpyxl是一个功能强大的库,可用于在Python中处理Excel文件,它提供了灵活的API来读取、写入、修改和自动化Excel文件的各个方面。

四、如何学好openpyxl库?

1、获取openpyxl库的属性和方法

        用print()和dir()两个函数获取openpyxl库所有属性和方法的列表

# ['DEBUG', 'DEFUSEDXML', 'LXML', 'NUMPY', 'Workbook', '__author__', '__author_email__', '__builtins__', '__cached__', 
# '__doc__', '__file__', '__license__', '__loader__', '__maintainer_email__', '__name__', '__package__', '__path__',
# '__spec__', '__url__', '__version__', '_constants', 'cell', 'chart', 'chartsheet', 'comments', 'compat', 'constants',
# 'descriptors', 'drawing', 'formatting', 'formula', 'load_workbook', 'open', 'packaging', 'pivot', 'reader', 'styles',
# 'utils', 'workbook', 'worksheet', 'writer', 'xml']
2、获取openpyxl库的帮助信息

        用help()函数获取openpyxl库的帮助信息

Help on package openpyxl:

NAME
    openpyxl - # Copyright (c) 2010-2024 openpyxl

PACKAGE CONTENTS
    _constants
    cell (package)
    chart (package)
    chartsheet (package)
    comments (package)
    compat (package)
    descriptors (package)
    drawing (package)
    formatting (package)
    formula (package)
    packaging (package)
    pivot (package)
    reader (package)
    styles (package)
    utils (package)
    workbook (package)
    worksheet (package)
    writer (package)
    xml (package)

SUBMODULES
    constants

DATA
    DEBUG = False
    DEFUSEDXML = False
    LXML = True
    NUMPY = True
    __author_email__ = 'charlie.clark@clark-consulting.eu'
    __license__ = 'MIT'
    __maintainer_email__ = 'openpyxl-users@googlegroups.com'
    __url__ = 'https://openpyxl.readthedocs.io'

VERSION
    3.1.3

AUTHOR
    See AUTHORS

FILE
    e:\python_workspace\pythonproject\lib\site-packages\openpyxl\__init__.py
3、实战案例
3-241、设置单元格区域的除对角框线以外的全部边框
# 3-241、设置单元格区域的除对角框线以外的全部边框
from openpyxl import Workbook
from openpyxl.styles import Border, Side
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 定义边框样式
thin_side = Side(border_style="thin", color="000000")
border = Border(left=thin_side, right=thin_side, top=thin_side, bottom=thin_side)
# 设定要应用边框的单元格区域
start_row, start_col = 2, 2
end_row, end_col = 5, 5
# 为单元格区域设置边框
for row in range(start_row, end_row + 1):
    for col in range(start_col, end_col + 1):
        cell = ws.cell(row=row, column=col)
        if row == start_row:
            cell.border = Border(top=thin_side, left=thin_side, right=thin_side)
        elif row == end_row:
            cell.border = Border(bottom=thin_side, left=thin_side, right=thin_side)
        else:
            cell.border = Border(left=thin_side, right=thin_side)
# 保存工作簿
wb.save("border_example.xlsx")
3-242、删除单元格区域的全部边框
# 3-242、删除单元格区域的全部边框
from openpyxl import Workbook
from openpyxl.styles import Border, Side
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 定义一个空边框样式
no_border = Border(left=Side(border_style=None),
                   right=Side(border_style=None),
                   top=Side(border_style=None),
                   bottom=Side(border_style=None))
# 设定要删除边框的单元格区域
start_row, start_col = 2, 2
end_row, end_col = 5, 5
# 为单元格区域删除边框
for row in range(start_row, end_row + 1):
    for col in range(start_col, end_col + 1):
        cell = ws.cell(row=row, column=col)
        cell.border = no_border
# 保存工作簿
wb.save("no_border_example.xlsx")
3-243、设置单元格的颜色和背景
# 3-243、设置单元格的颜色和背景
from openpyxl import Workbook
from openpyxl.styles import PatternFill
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 定义填充样式
fill = PatternFill(start_color="FFFF00",  # 设置背景色为黄色
                   end_color="FFFF00",
                   fill_type="solid")
# 设置要应用背景色的单元格区域
start_row, start_col = 2, 2
end_row, end_col = 5, 5
# 为单元格区域设置背景色
for row in range(start_row, end_row + 1):
    for col in range(start_col, end_col + 1):
        cell = ws.cell(row=row, column=col)
        cell.fill = fill
# 保存工作簿
wb.save("colored_cells_example.xlsx")
3-244、设置单元格的格式
# 3-244、设置单元格的格式
# 3-244-1、设置单元格的字体
from openpyxl import Workbook
from openpyxl.styles import Font
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 定义字体样式
font = Font(name='Arial', size=12, bold=True, italic=True, color='FF0000')
# 设置单元格字体
cell = ws['A1']
cell.value = 'Hello, Openpyxl!'
cell.font = font
# 保存工作簿
wb.save("formatted_font_example.xlsx")

# 3-244-2、设置单元格的边框
from openpyxl import Workbook
from openpyxl.styles import Border, Side
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 定义边框样式
thin_border = Border(left=Side(style='thin'),
                     right=Side(style='thin'),
                     top=Side(style='thin'),
                     bottom=Side(style='thin'))
# 设置单元格边框
cell = ws['B2']
cell.value = 'Border Example'
cell.border = thin_border
# 保存工作簿
wb.save("formatted_border_example.xlsx")

# 3-244-3、设置单元格的对齐方式
from openpyxl import Workbook
from openpyxl.styles import Alignment
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 定义对齐方式
alignment = Alignment(horizontal='center', vertical='center')
# 设置单元格对齐方式
cell = ws['C3']
cell.value = 'Center Aligned'
cell.alignment = alignment
# 保存工作簿
wb.save("formatted_alignment_example.xlsx")

# 3-244-4、设置单元格的填充颜色
from openpyxl import Workbook
from openpyxl.styles import PatternFill
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 定义填充样式
fill = PatternFill(start_color="FFFF00",  # 黄色
                   end_color="FFFF00",
                   fill_type="solid")
# 设置单元格填充颜色
cell = ws['D4']
cell.value = 'Filled Color'
cell.fill = fill
# 保存工作簿
wb.save("formatted_fill_example.xlsx")

# 3-244-5、综合示例
from openpyxl import Workbook
from openpyxl.styles import Font, Border, Side, Alignment, PatternFill
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 定义字体、边框、对齐方式和填充样式
font = Font(name='Arial', size=12, bold=True, color='FF0000')
thin_border = Border(left=Side(style='thin'),
                     right=Side(style='thin'),
                     top=Side(style='thin'),
                     bottom=Side(style='thin'))
alignment = Alignment(horizontal='center', vertical='center')
fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
# 设置单元格格式
cell = ws['E5']
cell.value = 'Formatted Cell'
cell.font = font
cell.border = thin_border
cell.alignment = alignment
cell.fill = fill
# 保存工作簿
wb.save("formatted_cell_example.xlsx")
3-245、设置单元格的对齐方式
# 3-245、设置单元格的对齐方式
from openpyxl import Workbook
from openpyxl.styles import Alignment
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 定义对齐方式
alignment = Alignment(horizontal='center', vertical='center')
# 设置单元格对齐方式
cell = ws['C3']
cell.value = 'Center Aligned'
cell.alignment = alignment
# 保存工作簿
wb.save("formatted_alignment_example.xlsx")
3-246、缩小单元格内容以全部显示
# 3-246、缩小单元格内容以全部显示
from openpyxl import Workbook
from openpyxl.styles import Alignment
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 设置单元格内容
cell = ws['A1']
cell.value = 'This is a very long text that needs to fit into a single cell by shrinking the font size.'
# 设置单元格对齐方式并启用缩小以适应单元格
cell.alignment = Alignment(shrinkToFit=True)
# 保存工作簿
wb.save("shrink_to_fit_example.xlsx")
3-247、设定/删除单元格的输入规则和信息提示(有效性设置)
# 3-247、设定/删除单元格的输入规则和信息提示(有效性设置)
# 3-247-1、设置单元格的输入规则和信息提示
from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 创建一个数据有效性对象,设置为整数类型,限制范围在1到10之间
dv = DataValidation(type="whole", operator="between", formula1=1, formula2=10, showErrorMessage=True)
# 设置输入提示
dv.promptTitle = "输入规则"
dv.prompt = "请输入一个1到10之间的整数。"
dv.showInputMessage = True
# 设置错误提示
dv.errorTitle = "输入错误"
dv.error = "输入值必须在1到10之间。"
dv.showErrorMessage = True
# 将数据有效性对象添加到单元格范围内
ws.add_data_validation(dv)
dv.add(ws["A1"])
# 设置单元格的值以进行测试
ws["A1"] = 5
# 保存工作簿
wb.save("data_validation_example.xlsx")

# 3-247-2、删除单元格的输入规则和信息提示
from openpyxl import load_workbook
# 加载已有的工作簿和工作表
wb = load_workbook("data_validation_example.xlsx")
ws = wb.active
# 查找并删除数据有效性对象
for dv in ws.data_validations.dataValidation:
    if "A1" in dv.cells:
        ws.data_validations.dataValidation.remove(dv)
        break
# 保存工作簿
wb.save("data_validation_removed_example.xlsx")
3-248、为单元格设置条件格式/删除条件格式
# 3-248、为单元格设置条件格式/删除条件格式
# 3-248-1、设置单元格的条件格式
from openpyxl import Workbook
from openpyxl.formatting.rule import ColorScale, Rule
from openpyxl.styles import Color
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 设置一些示例数据
for i in range(1, 11):
    ws[f'A{i}'] = i
# 创建一个颜色渐变规则
color_scale_rule = ColorScale(cfvo=['min', 'max'],
                              color=[Color('FF0000'), Color('00FF00')])
# 创建一个条件格式规则对象
rule = Rule(type='colorScale', colorScale=color_scale_rule)
# 将条件格式应用到单元格范围
ws.conditional_formatting.add('A1:A10', rule)
# 保存工作簿
wb.save("conditional_formatting_example.xlsx")

# 3-248-2、删除单元格的条件格式
from openpyxl import load_workbook
# 加载已有的工作簿和工作表
wb = load_workbook("conditional_formatting_example.xlsx")
ws = wb.active
# 移除条件格式
ws.conditional_formatting.remove('A1:A10')
# 保存工作簿
wb.save("conditional_formatting_removed_example.xlsx")
3-249、为单元格插入指向工作簿内部的超链接/删除超链接
# 3-249、为单元格插入指向工作簿内部的超链接/删除超链接
# 3-249-1、为单元格插入指向工作簿内部的超链接
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
# 创建一个新的工作簿和工作表
wb = Workbook()
ws1 = wb.active
ws1.title = "Sheet1"
# 创建第二个工作表
ws2 = wb.create_sheet(title="Sheet2")
# 在Sheet2中写入一些示例数据
ws2['A1'] = "This is Sheet2"
# 在Sheet1的单元格A1中插入指向Sheet2单元格A1的超链接
ws1['A1'] = "Go to Sheet2"
ws1['A1'].hyperlink = "#Sheet2!A1"
ws1['A1'].style = "Hyperlink"
# 保存工作簿
wb.save("hyperlink_example.xlsx")

# 3-249-2、删除单元格中的超链接
from openpyxl import load_workbook
# 加载已有的工作簿和工作表
wb = load_workbook("hyperlink_example.xlsx")
ws = wb["Sheet1"]
# 删除单元格A1中的超链接
ws['A1'].hyperlink = None
# 保存工作簿
wb.save("hyperlink_removed_example.xlsx")
3-250、为单元格插入指向工作簿外部的超链接/删除超链接
# 3-250、为单元格插入指向工作簿外部的超链接/删除超链接
# 3-250-1、为单元格插入指向工作簿外部的超链接
from openpyxl import Workbook
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
ws.title = "Sheet1"
# 在单元格A1中插入指向外部URL的超链接
ws['A1'] = "OpenAI Website"
ws['A1'].hyperlink = "https://www.openai.com"
ws['A1'].style = "Hyperlink"
# 保存工作簿
wb.save("external_hyperlink_example.xlsx")

# 3-250-2、删除单元格中的超链接
from openpyxl import load_workbook
# 加载已有的工作簿和工作表
wb = load_workbook("external_hyperlink_example.xlsx")
ws = wb["Sheet1"]
# 删除单元格A1中的超链接
ws['A1'].hyperlink = None
# 保存工作簿
wb.save("hyperlink_removed_example.xlsx")
3-251、为单元格添加批注/删除批注
# 3-251、为单元格添加批注/删除批注
# 3-251-1、为单元格添加批注
from openpyxl import Workbook
from openpyxl.comments import Comment
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
ws.title = "Sheet1"
# 创建一个批注并添加到单元格A1
comment_text = "这是一个批注"
comment_author = "Author Name"
comment = Comment(comment_text, comment_author)
ws['A1'].comment = comment
# 保存工作簿
wb.save("comment_added_example.xlsx")

# 3-251-2、删除单元格中的批注
from openpyxl import load_workbook
# 加载已有的工作簿和工作表
wb = load_workbook("comment_added_example.xlsx")
ws = wb["Sheet1"]
# 删除单元格A1中的批注
ws['A1'].comment = None
# 保存工作簿
wb.save("comment_removed_example.xlsx")
3-252、修改单元格的批注
# 3-252、修改单元格的批注
from openpyxl import load_workbook
from openpyxl.comments import Comment
# 加载已有的工作簿和工作表
wb = load_workbook("comment_added_example.xlsx")
ws = wb["Sheet1"]
# 检查单元格A1是否已有批注
if ws['A1'].comment:
    # 获取现有批注
    existing_comment = ws['A1'].comment
    # 修改批注内容
    new_comment_text = "这是修改后的批注"
    existing_comment.text = new_comment_text
else:
    # 如果没有批注,创建一个新的批注
    new_comment_text = "这是一个新的批注"
    comment_author = "New Author"
    new_comment = Comment(new_comment_text, comment_author)
    ws['A1'].comment = new_comment
# 保存工作簿
wb.save("comment_modified_example.xlsx")
3-253、为单元格区域定义名称/删除名称(Name属性)
# 3-253、为单元格区域定义名称/删除名称(Name属性)
# 3-253-1、定义单元格区域名称示例代码
from openpyxl import load_workbook
# 加载已有的工作簿和工作表
wb = load_workbook("example.xlsx")
ws = wb["Sheet1"]
# 为单元格区域定义名称
# 假设我们要为A1:B2区域定义名称为MyNamedRange
wb.create_named_range("MyNamedRange", ws, "A1:B2")
# 保存工作簿
wb.save("example_with_named_range.xlsx")

# 3-253-2、删除单元格区域名称示例代码
from openpyxl import load_workbook
# 加载已有的工作簿
wb = load_workbook("example_with_named_range.xlsx")
# 删除名称
if "MyNamedRange" in wb.defined_names:
    del wb.defined_names["MyNamedRange"]
# 保存工作簿
wb.save("example_without_named_range.xlsx")
3-254、为单元格区域定义名称/删除名称(Add方法)
# 3-254、为单元格区域定义名称/删除名称(Add方法)
# 3-254-1、定义单元格区域名称示例代码
from openpyxl import load_workbook
from openpyxl.workbook.defined_name import DefinedName
# 加载已有的工作簿和工作表
wb = load_workbook("example.xlsx")
ws = wb["Sheet1"]
# 使用add方法为单元格区域定义名称
# 假设我们要为A1:B2区域定义名称为MyNamedRange
named_range = DefinedName(name="MyNamedRange", attr_text="Sheet1!$A$1:$B$2")
wb.defined_names.add(named_range)
# 保存工作簿
wb.save("example_with_named_range.xlsx")

# 3-254-2、删除单元格区域名称示例代码
from openpyxl import load_workbook
# 加载已有的工作簿
wb = load_workbook("example_with_named_range.xlsx")
# 删除名称
if "MyNamedRange" in wb.defined_names:
    del wb.defined_names["MyNamedRange"]
# 保存工作簿
wb.save("example_without_named_range.xlsx")
3-255、自动调整单元格大小
# 3-255、自动调整单元格大小
# 3-255-1、自动调整列宽
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
# 加载工作簿和工作表
wb = load_workbook("example.xlsx")
ws = wb.active
# 遍历所有列并计算最大内容长度
for col in ws.columns:
    max_length = 0
    column = col[0].column_letter # 获取列字母
    for cell in col:
        try:
            if len(str(cell.value)) > max_length:
                max_length = len(cell.value)
        except:
            pass
    adjusted_width = (max_length + 2)
    ws.column_dimensions[column].width = adjusted_width
# 保存工作簿
wb.save("example_adjusted_columns.xlsx")

# 3-255-2、自动调整行高
from openpyxl import load_workbook
# 加载工作簿和工作表
wb = load_workbook("example.xlsx")
ws = wb.active
# 遍历所有行并计算最大内容高度
for row in ws.iter_rows():
    max_height = 0
    for cell in row:
        try:
            if len(str(cell.value)) > max_height:
                max_height = len(cell.value)
        except:
            pass
    adjusted_height = (max_height + 2)
    ws.row_dimensions[row[0].row].height = adjusted_height
# 保存工作簿
wb.save("example_adjusted_rows.xlsx")
3-256、自动调整工作表全部单元格的大小
# 3-256、自动调整工作表全部单元格的大小
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
# 加载工作簿和工作表
wb = load_workbook("example.xlsx")
ws = wb.active
# 初始化列宽和行高的字典
col_widths = {}
row_heights = {}
# 遍历所有单元格
for row in ws.iter_rows():
    for cell in row:
        if cell.value:
            # 获取当前单元格的列字母和行号
            col_letter = get_column_letter(cell.column)
            row_number = cell.row
            # 计算并更新列宽
            col_width = len(str(cell.value)) + 2
            if col_letter in col_widths:
                if col_width > col_widths[col_letter]:
                    col_widths[col_letter] = col_width
            else:
                col_widths[col_letter] = col_width
            # 计算并更新行高
            row_height = (len(str(cell.value)) // 10 + 1) * 15
            if row_number in row_heights:
                if row_height > row_heights[row_number]:
                    row_heights[row_number] = row_height
            else:
                row_heights[row_number] = row_height
# 设置列宽
for col_letter, col_width in col_widths.items():
    ws.column_dimensions[col_letter].width = col_width
# 设置行高
for row_number, row_height in row_heights.items():
    ws.row_dimensions[row_number].height = row_height
# 保存工作簿
wb.save("example_adjusted.xlsx")
3-257、设置单元格的大小(以磅为单位)
# 3-257、设置单元格的大小(以磅为单位)
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
# 加载工作簿和工作表
wb = load_workbook("example.xlsx")
ws = wb.active
# 设置行高,单位为磅
def set_row_height(ws, row, height):
    ws.row_dimensions[row].height = height
# 设置列宽,估算单位为磅
def set_column_width(ws, col, width):
    col_letter = get_column_letter(col)
    # 经验公式:列宽单位约为字符宽度的单位
    ws.column_dimensions[col_letter].width = width
# 示例:设置第1行高度为20磅
set_row_height(ws, 1, 20)
# 示例:设置第1列宽度为10个字符宽度
set_column_width(ws, 1, 10)
# 保存工作簿
wb.save("example_adjusted.xlsx")
3-258、设置单元格的大小(以cm为单位)
# 3-258、设置单元格的大小(以cm为单位)
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
# 加载工作簿和工作表
wb = load_workbook("example.xlsx")
ws = wb.active
# 转换函数:厘米到磅
def cm_to_points(cm):
    return cm * 28.3465
# 转换函数:厘米到列宽(估算)
def cm_to_column_width(cm):
    # 1字符宽度约为0.1726厘米
    return cm / 0.1726
# 设置行高,以厘米为单位
def set_row_height_cm(ws, row, height_cm):
    height_points = cm_to_points(height_cm)
    ws.row_dimensions[row].height = height_points
# 设置列宽,以厘米为单位
def set_column_width_cm(ws, col, width_cm):
    width_chars = cm_to_column_width(width_cm)
    col_letter = get_column_letter(col)
    ws.column_dimensions[col_letter].width = width_chars
# 示例:设置第1行高度为2厘米
set_row_height_cm(ws, 1, 2)
# 示例:设置第1列宽度为2厘米
set_column_width_cm(ws, 1, 2)
# 保存工作簿
wb.save("example_adjusted.xlsx")
3-259、设置单元格的大小(以in为单位)
# 3-259、设置单元格的大小(以in为单位)
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
# 加载工作簿和工作表
wb = load_workbook("example.xlsx")
ws = wb.active
# 转换函数:英寸到磅
def inches_to_points(inches):
    return inches * 72
# 转换函数:英寸到列宽(估算)
def inches_to_column_width(inches):
    # 1字符宽度约为0.68英寸
    return inches / 0.1726
# 设置行高,以英寸为单位
def set_row_height_in(ws, row, height_in):
    height_points = inches_to_points(height_in)
    ws.row_dimensions[row].height = height_points
# 设置列宽,以英寸为单位
def set_column_width_in(ws, col, width_in):
    width_chars = inches_to_column_width(width_in)
    col_letter = get_column_letter(col)
    ws.column_dimensions[col_letter].width = width_chars
# 示例:设置第1行高度为1英寸
set_row_height_in(ws, 1, 1)
# 示例:设置第1列宽度为1英寸
set_column_width_in(ws, 1, 1)
# 保存工作簿
wb.save("example_adjusted.xlsx")
3-260、锁定单元格/解除单元格锁定
# 3-260、锁定单元格/解除单元格锁定
from openpyxl import load_workbook
from openpyxl.worksheet.protection import SheetProtection
# 加载工作簿和工作表
wb = load_workbook("example.xlsx")
ws = wb.active
# 锁定单元格
def lock_cell(ws, cell_coordinate):
    cell = ws[cell_coordinate]
    cell.protection = SheetProtection(locked=True)
# 解除单元格锁定
def unlock_cell(ws, cell_coordinate):
    cell = ws[cell_coordinate]
    cell.protection = SheetProtection(locked=False)
# 锁定A1单元格
lock_cell(ws, 'A1')
# 解除A2单元格锁定
unlock_cell(ws, 'A2')
# 保护工作表,使锁定生效
ws.protection.sheet = True
ws.protection.password = "your_password"  # 可选:设置密码保护
# 保存工作簿
wb.save("example_protected.xlsx")

五、推荐阅读

1、Python筑基之旅
2、Python函数之旅
3、Python算法之旅
4、Python魔法之旅
5、博客个人主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/764135.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【技术杂谈】如何访问Github | 解决无法连接Github的问题

访问网页的过程 什么是域名?什么是IP地址?- 域名是网站的名称。 - IP地址是服务器在互联网上的逻辑地址。域名往往是固定的,但是IP地址很有可能是会改变的。计算机通过Host文件检查本地缓存是否有域名对应IP地址 Host文件路径 C:\Windows\Sy…

6.The hardest part about learing hard things(学一件难的事,难在哪里)

I’ve been recording a lot of podcast interviews for my upcoming book, Ultralearning.One of the reurring themes I’ve noticed in our conversations is that how people feel about learning is the overwhelming cause of the results they experience. 我为我的新书…

解决VSCode无法用ssh连接远程服务器的问题

原因: 因为windows自带的ssh无法连接远程服务器,需要用git底下的ssh.exe。 搜了很久,试过很多方法,包括替换掉环境变量中的ssh,但是都无效,最后发现是要在VSCode中配置需要使用哪个ssh.exe。 步骤&#…

11.优化算法之栈

1.删除字符串中的所有相邻重复项 可以用数组模拟栈结构 class Solution {public String removeDuplicates(String s) {if(s.length()<1){return s;}StringBuffer retnew StringBuffer();for(int i0;i<s.length();i){if(ret.length()<1){ret.append(s.charAt(i));}els…

字符编码-unicode码表

unicode在线码表&#xff1a;https://www.tamasoft.co.jp/en/general-info/unicode.html Unicode Table

Stable Diffusion中放大图像的3种方法

前言 要执行 ControlNet tile upscale&#xff1a; 您想使用 Stable Diffusion 创建包含大量细节的大型图像吗&#xff1f;您将需要使用升频器。在本文中&#xff0c;您将学习 3 种放大图像的方法。 人工智能升级器标清高档ControlNet瓷砖高档 您将看到比较并了解这些方法的优…

【Arduino】小飞鱼通达二开实验ESP32使用红外寻迹传感器 (图文)

在智能小车项目中都会有一个功能就是自动巡线&#xff0c;今天小飞鱼通达来实验的就是这个红外寻迹传感器。 红外寻迹传感器的原理就是有一个小灯发出红外光&#xff0c;光线照到物体后进行反射&#xff0c;有一个接收器进行接收&#xff0c;当在一定距离内会导通电路&#xf…

【AI绘画Stable Diffusion】教你制作 SD 光影文字,保姆级教程建议收藏!(附模型下载)

大家好&#xff0c;我是设计师阿威 最近光影文字又开始火起来了。今天讲讲怎么利用 Stable Diffusion 的 ControlNet 插件来制作光影图片。 1.下载光影模型组件 1.SD主模型&#xff1a;majicMIX realistic V6、xxmix9realistic_v26 2. ControlNet 的模型&#xff1a;Bright…

3、加密算法-AES和RSA

前两节博客主要是针对MD5和哈希算法&#xff0c;数字签名算法做了阐述和总结&#xff1b; 这篇文章主要是针对AES和RSA做一个概况和比较&#xff0c;以及相关的一些概念&#xff1b; 一、对称加密算法 对称加密算法是指加密和解密采用相同的密钥口&#xff0c;是可逆的(即可解…

高等数学在Android开发中的应用:函数极限与算法优化

高等数学在Android开发中的应用:函数极限与算法优化 在Android开发中,高等数学中的许多概念和技术都能够显著提高应用程序的性能和功能。这篇博客将探讨一些具体的数学原理,特别是函数极限在Android中的实际应用。 函数极限的基本概念 函数极限是微积分的基础,广泛应用于…

R可视化:好看的气泡图

加载R包 library(tidyverse) library(camcorder)gg_record(dir "tidytuesday-temp", device "png", width 8, height 8, units "in", dpi 320)导入数据 team_results <- readr::read_csv(https://raw.githubusercontent.com/rfordata…

有手就行,轻松本地部署 Llama、Qwen 大模型,无需 GPU

用 CPU 也能部署私有化大模型&#xff1f; 对&#xff0c;没错&#xff0c;只要你的电脑有个 8G 内存&#xff0c;你就可以轻松部署 Llama、Gemma、Qwen 等多种开源大模型。 非技术人员&#xff0c;安装 Docker、Docker-compose 很费劲&#xff1f; 不用&#xff0c;这些都不…

vue中路由来回切换页面直接卡死

今天发现一个很严重的问题&#xff0c;项目好不容易做好了&#xff0c;结果页面多了&#xff0c;切换之后卡死。页面所有的交互效果都失效了。 排查了许久的错误原因最后发现原来是路由名称重复了。 如上图当页面跳转到riskdetails详细页面之后&#xff0c;框架则被这个详情页…

SSE代替轮询?

什么是 SSE SSE&#xff08;Server-Sent Events&#xff0c;服务器发送事件&#xff09;&#xff0c;为特定目的而扩展的 HTTP 协议&#xff0c;用于实现服务器向客户端推送实时数据的单向通信。如果连接断开&#xff0c;浏览器会自动重连&#xff0c;传输的数据基于文本格式。…

高温下的稳定选择 —— PP消解管,耐化学更耐用

PP消解管&#xff0c;即聚丙烯材质的消解管&#xff0c;是一种常用于化学分析中的实验室设备&#xff0c;主要用于样品的消解处理。以下是PP消解管的一些主要特性和应用&#xff1a; 主要特性&#xff1a; 1. 耐化学腐蚀&#xff1a;PP材料对多数酸、碱和有机溶剂具有良好的耐…

Vue笔记-vue中使用JS创建的函数

主要是公司对前端要求不高&#xff0c;能解决问题就行了&#xff0c;前端不太熟&#xff0c;用js这种处理起来方便&#xff0c;在此记录下。 在src中创建一个api目录&#xff0c;新建custom.js export const getDivHeightByClass (className) > {let divElements docume…

MySQL数据库中文乱码处理

出现中文乱码之后处理方式 1、执行下面语句查看一下关于编码方式 show variables like %char%结果展示&#xff1a;【你应该和我的不一样】 2、如果你的和我查询结果不一致请设置成一致语句&#xff0c;根据自己需要复制语句 如下&#xff1a;【除了最后一条记录哈】 SET G…

mysql中的递归函数recursive

递归部门 WITH recursive dept_tree AS (SELECTsd.mine_id AS mine_id,sd.dept_id AS dept_id,sd.tenant_id AS tenant_id,sd.order_num,sd.dept_name AS topName,sd.dept_id AS topIdFROMsys_dept sdWHERE<!-- 加上or后也会查询出dept节点 sd.parent_id #{deptId} or sd.…

.net core 的缓存方案

这里主要讲两个缓存的使用&#xff0c;MemoryCache和Redis 先讲讲常见的缓存 1、.net framework web中自带有Cache缓存&#xff0c;这种缓存属于粘性缓存&#xff0c;是缓存到项目中的&#xff0c;项目从服务器迁移的时候缓存的内容也能够随着服务器一起迁移 2、MemoryCache缓存…

The First Descendant联机失败?第一后裔联机异常这样做

第一后裔/The First Descendant是一款由nexon开发的免费网游TheFirstDescendant第一后即将正式上线了&#xff0c;游戏的外观自定义系统还是非常不错的&#xff0c;人物角色可以选择不同风格的面部妆容&#xff0c;而且外观不仅可以更改颜色&#xff0c;还可以更改对应的材质和…