鱼C论坛

 找回密码
 立即注册
查看: 54|回复: 3

[已解决]保存ex表格保错

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式
4鱼币
import xlwings as xw
from openpyxl import load_workbook
import os

file_path = r'C:\Users\huawei\Desktop\上市.xlsx'

# 检查文件是否存在
if not os.path.exists(file_path):
    print(f"文件 {file_path} 不存在!")
    exit()

# 使用 xlwings 打开 Excel 文件
app = xw.App(visible=False)  # 不显示 Excel 窗口
excel_workbook = app.books.open(file_path)
excel_sheet = excel_workbook.sheets['上市']

# 定义要填充公式的列
tjval1 = ['e', 'k']

# 处理每一列
for col in tjval1:
    # 添加 VLOOKUP 公式
    for row in range(4, 19):  # 从第 4 行到第 18 行
        cell = f"{col.upper()}{row}"  # 使用大写字母列名
        formula = f"=VLOOKUP(B{row},Sheet1!A:B,2,FALSE)"
        excel_sheet.range(cell).formula = formula

    # 让 Excel 计算所有公式
    excel_workbook.app.calculate()

    # 将公式结果转换为数值
    for row in range(4, 19):  # 从第 4 行到第 18 行
        cell = f"{col.upper()}{row}"
        value = excel_sheet.range(cell).value  # 获取计算后的值
        excel_sheet.range(cell).value = value  # 将计算后的值写回单元格

    print(f"{col.upper()} 列公式已转换为数值。")

# 清空 'Sheet1' 内容
workbook = load_workbook(file_path)
if 'Sheet1' in workbook.sheetnames:
    sheet1 = workbook['Sheet1']
    for row in sheet1.iter_rows(min_row=1, max_col=sheet1.max_column, max_row=sheet1.max_row):
        for cell in row:
            cell.value = None  # 将每个单元格的值设置为空
    print("Sheet1 的内容已清空。")

# 保存修改后的文件
workbook.save(file_path)

# 保存 Excel 工作簿并退出
excel_workbook.save()
excel_workbook.close()
app.quit()

print("所有公式已成功转换为数值,且 'Sheet1' 内容已清空。")
最佳答案
7 天前
tengke 发表于 2024-12-26 11:14
Traceback (most recent call last):
  File "D:\软 ...


出现这个错误是因为程序在尝试保存 Excel 文件时,文件可能仍然是打开状态,或者由于文件的权限设置,无法对其进行写入。这可能发生在文件刚刚被打开或正在被其他程序(如 Excel)占用的情况下。

以下是一些解决方法:

1. **检查文件是否被占用**:确保文件没有在 Excel 等程序中被打开。如果是,请先关闭该文件。

2. **更改代码先后顺序**:确保先关闭使用 `xlwings` 打开的 Excel 文件,再使用 `openpyxl` 进行保存。

3. **检查文件权限**:确保您的程序对该文件具有写入权限。

4. **使用不同的文件路径进行保存**:在保存文件时,尝试将其保存到一个新的文件路径,确保它不被占用。

根据您的代码应该调整一下顺序,确保 `xlwings` 工作簿关闭后再使用 `openpyxl`:
# 保存 Excel 工作簿并退出
excel_workbook.save()
excel_workbook.close()
app.quit()

# 使用 openpyxl 重新打开以便修改
workbook = load_workbook(file_path)
# 获取 Sheet1 工作表对象
sheet1 = workbook.active  # 假设是第一个工作表
# 清空 'Sheet1' 内容
for row in sheet1.iter_rows(min_row=1, max_col=sheet1.max_column, max_row=sheet1.max_row):
    for cell in row:
        cell.value = None  # 将每个单元格的值设置为空
print("Sheet1 的内容已清空。")

# 保存修改后的文件
workbook.save(file_path)

print("所有公式已成功转换为数值,且 'Sheet1' 内容已清空。")

确保 `xlwings` 相关的内容在使用 `openpyxl` 之前已经完成并关闭。这样您就不会在文件仍被占用时尝试打开它进行保存操作。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

最佳答案

查看完整内容

出现这个错误是因为程序在尝试保存 Excel 文件时,文件可能仍然是打开状态,或者由于文件的权限设置,无法对其进行写入。这可能发生在文件刚刚被打开或正在被其他程序(如 Excel)占用的情况下。 以下是一些解决方法: 1. **检查文件是否被占用**:确保文件没有在 Excel 等程序中被打开。如果是,请先关闭该文件。 2. **更改代码先后顺序**:确保先关闭使用 `xlwings` 打开的 Excel 文件,再使用 `openpyxl` 进行保存 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层    本楼为最佳答案   
tengke 发表于 2024-12-26 11:14
Traceback (most recent call last):
  File "D:\软 ...


出现这个错误是因为程序在尝试保存 Excel 文件时,文件可能仍然是打开状态,或者由于文件的权限设置,无法对其进行写入。这可能发生在文件刚刚被打开或正在被其他程序(如 Excel)占用的情况下。

以下是一些解决方法:

1. **检查文件是否被占用**:确保文件没有在 Excel 等程序中被打开。如果是,请先关闭该文件。

2. **更改代码先后顺序**:确保先关闭使用 `xlwings` 打开的 Excel 文件,再使用 `openpyxl` 进行保存。

3. **检查文件权限**:确保您的程序对该文件具有写入权限。

4. **使用不同的文件路径进行保存**:在保存文件时,尝试将其保存到一个新的文件路径,确保它不被占用。

根据您的代码应该调整一下顺序,确保 `xlwings` 工作簿关闭后再使用 `openpyxl`:
# 保存 Excel 工作簿并退出
excel_workbook.save()
excel_workbook.close()
app.quit()

# 使用 openpyxl 重新打开以便修改
workbook = load_workbook(file_path)
# 获取 Sheet1 工作表对象
sheet1 = workbook.active  # 假设是第一个工作表
# 清空 'Sheet1' 内容
for row in sheet1.iter_rows(min_row=1, max_col=sheet1.max_column, max_row=sheet1.max_row):
    for cell in row:
        cell.value = None  # 将每个单元格的值设置为空
print("Sheet1 的内容已清空。")

# 保存修改后的文件
workbook.save(file_path)

print("所有公式已成功转换为数值,且 'Sheet1' 内容已清空。")

确保 `xlwings` 相关的内容在使用 `openpyxl` 之前已经完成并关闭。这样您就不会在文件仍被占用时尝试打开它进行保存操作。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
根据您提供的代码来看,可能存在以下几个问题:

1. `tjval1` 未定义:这会导致代码无法运行。`tjval1` 应该是一个包含列名的列表,用于表示要在哪些列应用公式。

2. `excel_sheet.range(cell).formula = formula` 用法错误:需要指定工作表。

3. 清空 'Sheet1' 的方法需要获取正确的工作表对象。

以下是一些修复和改进:
import xlwings as xw
from openpyxl import load_workbook
import os

file_path = r'C:\Users\huawei\Desktop\上市.xlsx'

# 检查文件是否存在
if not os.path.exists(file_path):
    print(f"文件 {file_path} 不存在!")
    exit()

# 使用 xlwings 打开 Excel 文件
app = xw.App(visible=False)  # 不显示 Excel 窗口
excel_workbook = app.books.open(file_path)

# 假设第一个工作表
excel_sheet = excel_workbook.sheets[0]

# 定义要填充公式的列
tjval1 = ['C', 'D']  # 这里假设要填充的列是 C 列和 D 列

# 处理每一列
for col in tjval1:
    # 添加 VLOOKUP 公式
    for row in range(4, 19):  # 从第 4 行到第 18 行
        cell = f"{col.upper()}{row}"  # 使用大写字母列名
        formula = f"=VLOOKUP(B{row},Sheet1!A:B,2,FALSE)"
        excel_sheet.range(cell).formula = formula

    # 让 Excel 计算所有公式
    excel_workbook.app.calculate()

    # 将公式结果转换为数值
    for row in range(4, 19):  # 从第 4 行到第 18 行
        cell = f"{col.upper()}{row}"
        value = excel_sheet.range(cell).value  # 获取计算后的值
        excel_sheet.range(cell).value = value  # 将计算后的值写回单元格

    print(f"{col.upper()} 列公式已转换为数值。")

# 使用 openpyxl 重新打开以便修改
workbook = load_workbook(file_path)
# 获取 Sheet1 工作表
sheet1 = workbook['Sheet1']
# 清空 'Sheet1' 内容
for row in sheet1.iter_rows(min_row=1, max_col=sheet1.max_column, max_row=sheet1.max_row):
    for cell in row:
        cell.value = None  # 将每个单元格的值设置为空
print("Sheet1 的内容已清空。")

# 保存修改后的文件
workbook.save(file_path)

# 保存 Excel 工作簿并退出
excel_workbook.save()
excel_workbook.close()
app.quit()

print("所有公式已成功转换为数值,且 'Sheet1' 内容已清空。")

请确保 `tjval1` 中填入了待填公式的列。以上代码假设您要将公式应用于 C 列和 D 列,您可以根据实际需要调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
Traceback (most recent call last):
  File "D:\软件\djangoProject\app\删除shell文件.py", line 52, in <module>
    workbook.save(file_path)
  File "D:\软件\djangoProject\venv\lib\site-packages\openpyxl\workbook\workbook.py", line 386, in save
    save_workbook(self, filename)
  File "D:\软件\djangoProject\venv\lib\site-packages\openpyxl\writer\excel.py", line 291, in save_workbook
    archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True)
  File "C:\Users\huawei\AppData\Local\Programs\Python\Python37\lib\zipfile.py", line 1240, in __init__
    self.fp = io.open(file, filemode)
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\huawei\\Desktop\\上市集团资产.xlsx'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-2 20:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表