尝试使用Python 3.11向Excel的下一个空单元格添加值

0 投票
2 回答
84 浏览
提问于 2025-04-12 23:19

我最近开始学习Python,把它当作一种爱好。现在我想做一个密码管理器,但为了保存一些变量,我需要打开Excel文件,把变量的数据复制到A列和B列的下一个空行里。

我现在尝试了这个方法,但没有成功:

value3 = v3.get()
value2 = v2.get()

folderPath = "C:\Password Manager"
if not os.path.exists(folderPath):
    os.makedirs(folderPath)
filename = "Encrypted_Passwords.xlsx"
filePath = os.path.join(folderPath, filename)
print(filePath)
open(filePath, "w+")
wb = openpyxl.load_workbook(filePath)
ws = wb.active
for i in range (ws.max_row):
    if ws.cell(row=i, column=1).value == None:
        ws.cell(row=i, column=1).value = value2
        ws.cell(row=i, column=2).value = value3

如果有人能帮我,我会非常感激,因为我已经为这个问题纠结了好几天。

2 个回答

0

这里是关于openpyxl中worksheet.max_row的文档链接:worksheet.max_row

worksheet.max_row

如果你想在空行中写入值,你需要从 rowIndex = ws.max_row + 1 开始,而不是从 0 循环到 ws.max_row

例如,下面的代码可以正常工作:

       ws.cell(row=ws.max_row + 1, column=1).value = value2
       ws.cell(row=ws.max_row + 1, column=2).value = value3

如果你真的需要用一个循环来检查每一行,你可以把 for i in range(ws.max_row) 改成 for i in range(1, 1000)

import openpyxl
import os

value3 = v3.get()
value2 = v2.get()

folderPath = "C:\Password Manager"
# if not os.path.exists(folderPath):
#     os.makedirs(folderPath)
filename = "Encrypted_Passwords.xlsx"
filePath = os.path.join(folderPath, filename)
print(filePath)
# open(filePath, "w+")
wb = openpyxl.load_workbook(filePath)
ws = wb.active

for i in range(1, 1000):
    if ws.cell(row=i, column=1).value is None:
        ws.cell(row=i, column=1).value = value2
        ws.cell(row=i, column=2).value = value3
        break

wb.save(filePath)

如果你需要交替输入一组密码到A列和B列,可以试试下面的循环:

import openpyxl
import os

passwords = ["password1", "password2", "passw@rd3", "password4", "passowrd5"]

folderPath = "C:\Password Manager"
filename = "Encrypted_Passwords.xlsx"
filePath = os.path.join(folderPath, filename)
print(filePath)
wb = openpyxl.load_workbook(filePath)
ws = wb.active

rowIdx = ws.max_row + 1
for i in range(0, len(passwords), 2):
    ws.cell(row=rowIdx, column=1).value = passwords[i]
    if i >= len(passwords) - 1:
        break
    ws.cell(row=rowIdx, column=2).value = passwords[i+1]
    rowIdx += 1

wb.save(filePath)
1

如果你使用Openpyxl的'append'功能,它会把值添加到电子表格中下一个未使用的行。

比如说,你可以多次运行这段代码,每次运行时,value2和value3的值都会被添加到表格的末尾。

import os
import openpyxl

folderPath = "C:\Password Manager"
filename = "Encrypted_Passwords.xlsx"

value3 = 'password1'
value2 = 'password2'

if not os.path.exists(folderPath):
    os.makedirs(folderPath)
filename = "Encrypted_Passwords.xlsx"
filePath = os.path.join(folderPath, filename)
print(filePath)
wb = openpyxl.load_workbook(filePath)
ws = wb.active

### Append the values as a list
ws.append([value3, value2])

wb.save(filePath)

在这里输入图片描述

使用Openpyxl的append功能时,值需要放在一个列表(或字典)里。当你用列表时,每个元素会被放到下一个列里,所以对于 [value3, value2] 来说,value3 会放在A列,value2 会放在B列,依此类推,列表中的所有元素都会这样处理。而且总是放在下一个空行上。

顺便提一下,ws.max_row和append会把“最大行”视为最后一行中有值的单元格,而这个值不能是(Python中的)None。所以如果你只在A列填了5行,但Z列填了10行,那么下一个未使用的行就是第11行(ws.max_row会等于10)。

撰写回答