首页 新闻 会员 周边 捐助

python-openpyxl 设置所有列打印到一页,只能运行一次,运行第二次就会报no attribute 'sheet_properties'

0
[已解决问题] 解决于 2024-11-27 21:05

代码如下
wb = load_workbook(path)
ws = wb["Sheet"]

# 设置页面方向为横向
ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE

# 设置纸张大小为A4
ws.page_setup.paperSize = ws.PAPERSIZE_A4

# 设置页边距openpyxl.worksheet.page.PageMargins
ws.page_margins = PageMargins(
    top=0.5, bottom=0.5, left=0.2, right=0.2, header=0.1, footer=0.1
)

# 将所有列调整为一页
ws.page_setup.fitToPage = True
ws.page_setup.fitToHeight = 0
ws.page_setup.fitToWidth = 1
# ws.page_setup.scale = 90

wb.save(path)

运行第一次是正常的,但是运行第二次就报下面的错:
AttributeError: 'NoneType' object has no attribute 'sheet_properties'

选择冒泡的主页 选择冒泡 | 菜鸟二级 | 园豆:202
提问于:2024-11-24 15:34
< >
分享
最佳答案
0

这应该是个bug,excel解析时候self = super(PrintPageSetup, cls).from_tree(node)不会传parent参数.改下代码把parent加上就好了.

ws = wb["Sheet"]
ws.page_setup._parent = ws #加上这一句
奖励园豆:5
www378660084 | 小虾三级 |园豆:1248 | 2024-11-25 10:39

太厉害了。一下子就解决了,虽然我没明白是什么意思,但是很有效果。赞👍。

选择冒泡 | 园豆:202 (菜鸟二级) | 2024-11-27 21:04
其他回答(1)
0

在您提供的代码中,您使用 openpyxl 库进行 Excel 文件的操作,看起来在设置工作表的页面布局时遇到了问题。错误信息 AttributeError: 'NoneType' object has no attribute 'sheet_properties' 表示在某次运行时 ws 变量被赋值为 None,这通常意味着工作表实例可能没有正确加载或者文件在某种情况下被关闭或清空。

問題分析

  1. 重复运行问题:

    • load_workbook 函数在第二次调用时可能会再次加载文件并进行某些更改,但文件的状态可能不再有效。
    • 如果在第一次运行时保存文件之后没有适当释放或重新加载工作表,可能会导致 ws 变量中的引用出错。
  2. 对象状态:

    • 每次运行代码时,ws 应该指向有效的工作表实例。如果在第一次运行时对 ws 做了某些不可逆的更改,下一次再尝试访问可能会出现错误。

解决方案

以下是一些建议来避免此类错误:

1. 每次都重新加载工作簿

在每次需要操作工作簿时,从新加载工作簿,而不是依赖旧的实例。例如:

from openpyxl import load_workbook
from openpyxl.worksheet.page import PageMargins

path = "your_file.xlsx"  # 替换为您的文件路径

# 每次都重新加载文件
wb = load_workbook(path)
ws = wb["Sheet"]

# 设置页面方向为横向
ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE

# 设置纸张大小为A4
ws.page_setup.paperSize = ws.PAPERSIZE_A4

# 设置页边距
ws.page_margins = PageMargins(
    top=0.5, bottom=0.5, left=0.2, right=0.2, header=0.1, footer=0.1
)

# 将所有列调整为一页
ws.page_setup.fitToPage = True
ws.page_setup.fitToHeight = 0
ws.page_setup.fitToWidth = 1

# 保存工作簿
wb.save(path)

2. 检查工作表是否有效

确保在加载工作表后检查 ws 是否有效,避免在操作无效对象时出现错误:

if ws is None:
    print("工作表加载失败,请检查工作表名称.")
else:
    # 进行后续操作
    # 设置页面布局代码

3. 确保文件未损坏

确保在第一次运行时,文件没有受到损坏或未以其他模式(如只读)打开。这可以用文件管理器打开检查一下文件状态。

4. 使用正确的页面设置对象

确保使用 ws.page_setup 的时候,这个对象在每次运行时都是新的并且是有效的。

示例完整代码

from openpyxl import load_workbook
from openpyxl.worksheet.page import PageMargins

def configure_excel(path):
    # 每次加载工作簿
    wb = load_workbook(path)
    ws = wb["Sheet"]

    # 检查工作表是否加载成功
    if ws is None:
        print("工作表加载失败,请检查工作表名称.")
        return

    # 设置页面方向为横向
    ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE

    # 设置纸张大小为A4
    ws.page_setup.paperSize = ws.PAPERSIZE_A4

    # 设置页边距
    ws.page_margins = PageMargins(
        top=0.5, bottom=0.5, left=0.2, right=0.2, header=0.1, footer=0.1
    )

    # 将所有列调整为一页
    ws.page_setup.fitToPage = True
    ws.page_setup.fitToHeight = 0
    ws.page_setup.fitToWidth = 1

    # 保存工作簿
    wb.save(path)

# 使用函数
path = "your_file.xlsx"  # 替换为您的文件路径
configure_excel(path)

结论

请尝试上述建议并对代码进行适当的调整。如果问题仍然存在,您还可以提供更多的上下文(比如运行顺序、环境信息等),以便进一步帮助您排查问题。

Technologyforgood | 园豆:7688 (大侠五级) | 2024-11-27 15:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册