首页 > 解决方案 > 使用 openpyxl 保存已编辑的 .xslx 工作表

问题描述

我一直在尝试使用 python 编辑 .xslx 工作表,并且我已经成功地能够更改单元格的值,但是当我使用 openpyxl 中的保存命令,关闭程序并打开 excel 电子表格时,没有保存任何更改。我附上了下面的代码,如果你能帮助我,我将不胜感激。我已经尝试阅读其他 stackoverflow 帖子,但是当我尝试他们建议的内容时它仍然不起作用,所以我转向在这里创建我的第一篇帖子。

def editStock(choice, edit, stockSymbol):
    sheet = setup()
    stockRow = getStockRow(stockSymbol)
    if choice == 7 or choice == 3 or choice == 2 or choice == 1:
        print("Before")
        print(sheet.cell(row = stockRow, column = choice).value)
        sheet.cell(row = stockRow, column = choice).value = edit
        print("After")
        print(sheet.cell(row = stockRow, column = choice).value)
    else:
        sheet.cell(row = stockRow, column = choice).value = float(edit)

    workbook = getWorkBook()
    workbook.save(filename="Stocks.xlsx")

这是我的setup()

def setup():
    directory = "C:\\Users\\shrey\\Desktop"
    directory = directory.lower()
    os.chdir(directory)
    spreadname = "Stocks.xlsx"
    workbook = openpyxl.load_workbook(spreadname)
    sheet = workbook["Sheet1"]
    return sheet

这是我getWorkBook()的参考:

def getWorkBook():
    directory = "C:\\Users\\shrey\\Desktop"
    directory = directory.lower()
    os.chdir(directory)
    spreadname = "Stocks.xlsx"
    workbook = openpyxl.load_workbook(spreadname)
    return workbook

这是我打电话时的输出editStock()

Before
None
After
Dec-21-2021

并证明它不起作用:日期没有改变

抱歉,图像不是很清晰,但 2021 年 12 月 21 日应该在“TSLA”之后

标签: pythonexcel

解决方案


实际上,您可能应该制作一个单独的测试脚本并共享整个内容,因为您可能发布了完全正确工作的方法,并且人们通常会在堆栈溢出时要求它(我不能只是抓取您的代码并运行它;通常应该是这样)

我写了这个小脚本来看看是怎么回事,对我来说它工作得很好。但我注意到有两张名为 Sheet1 的工作表。因此,请确保您正在查看不同的工作表(选项卡)。一旦我弄清楚了,数据就显示得很好。

此代码在我运行时有效(包括文件是否已存在):

import os
import openpyxl

spreadname = "Stocks.xlsx"
sheetname = "THISONE"
if not os.path.exists(spreadname):
    workbook = openpyxl.Workbook()
    workbook.create_sheet(title=sheetname)
else:
    workbook = openpyxl.load_workbook(spreadname)
sheet = workbook[sheetname]

c1 = sheet.cell(row=3, column=6)
c1.value = 123.456

c2 = sheet['B9']
c2.value = 456.321

workbook.save(spreadname)

具体来说,它会创建一个名为“THISONE”的工作表,并且数据就在那里。


推荐阅读