使用openpyxl写入字符串至Excel报错,Pandas操作文件损坏求助
问题解决:Kindle高亮导出的两个Excel处理问题
一、openpyxl写入报错的修复
你遇到的TypeError是因为ws.append()要求传入列表、元组这类可迭代对象,而你最后传入的是单个字符串,代码里还有两个明显问题:
- 循环里每次用
highlights = note.text覆盖变量,最后highlights只保留最后一条高亮内容 wb.save没加括号,根本没执行保存操作
修正后的代码:
from bs4 import BeautifulSoup from openpyxl import load_workbook with open("test.html", "r", encoding="utf-8") as html_file: content = html_file.read() soup = BeautifulSoup(content, "lxml") note_tags = soup.find_all("div", class_="noteText") # 把所有高亮存到列表里 highlights_list = [note.text.strip() for note in note_tags] wb = load_workbook('highlights.xlsx') ws = wb.active # 逐条写入Excel,每条占一行 for highlight in highlights_list: # 把字符串包装成列表,符合append的要求 ws.append([highlight]) # 执行保存,必须加括号 wb.save('highlights.xlsx')
二、Pandas处理时Excel损坏的解决
“at least one sheet must be visible”错误大多是因为保存Excel时,所有工作表被意外设置为隐藏状态,或者文件读写操作冲突导致的。给你几个可行的解决办法:
1. 直接新建DataFrame写入,避免修改原有文件
不要直接加载旧Excel追加,先把高亮数据整理成DataFrame,去重后直接写入(如果需要保留历史数据,可以先读入历史数据合并后去重):
from bs4 import BeautifulSoup import pandas as pd with open("test.html", "r", encoding="utf-8") as html_file: content = html_file.read() soup = BeautifulSoup(content, "lxml") note_tags = soup.find_all("div", class_="noteText") highlights_list = [note.text.strip() for note in note_tags] # 转成DataFrame df = pd.DataFrame(highlights_list, columns=["Kindle高亮"]) # 去重,保留第一条出现的内容 df = df.drop_duplicates(subset=["Kindle高亮"], keep="first") # 写入Excel,指定openpyxl引擎避免格式问题 df.to_excel('highlights_clean.xlsx', index=False, engine='openpyxl')
2. 如果需要追加历史数据
如果要在已有Excel里追加,确保指定正确的引擎和模式,同时检查原有文件的工作表是否可见:
# 读入历史数据 history_df = pd.read_excel('highlights.xlsx', engine='openpyxl') # 合并新数据并去重 combined_df = pd.concat([history_df, df]).drop_duplicates(subset=["Kindle高亮"], keep="first") # 覆盖写入 combined_df.to_excel('highlights.xlsx', index=False, engine='openpyxl')
3. 排查文件本身问题
- 如果原有
highlights.xlsx之前被手动修改过(比如隐藏了工作表),先新建一个空白Excel文件再试 - 更新Pandas和openpyxl到最新版本,避免版本兼容问题:
pip install --upgrade pandas openpyxl
内容的提问来源于stack exchange,提问作者Ren Tremendous
相关产品推荐
相关产品推荐

