openpyxl load_workbook 错误 expected <class ‘str‘>

博客讲述了在使用openpyxl处理Excel文件时遇到的一个问题,即openpyxl在处理ExternalData时会丢失ID属性,导致初始化类时出现错误。作者提出了一个解决方案,即通过正则表达式删除含有ExternalData的XML元素,从而避免报错。提供的代码示例展示了如何在不修改openpyxl源码的情况下实现这一操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Google很多方法都不行,唯有自己看源码。

发现openpyxl处理ExternalData时会把ID解析为{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id,从而丢失了ID的属性,当初始化类的时候就会因为ID值缺失而报错。

在不修改openpyxl的代码情况下,最可行的是把ExternalData的xml元素删掉。

# 除去图表的externalData属性,以便openpyxl读取
externalData_REGEX = re.compile(b'<c:externalData.*</c:externalData>')

with zipfile.ZipFile(f_电渠日报) as zf:
    excel_obj = {zi.filename:zf.read(zi) for zi in zf.filelist}
    
with zipfile.ZipFile(f_电渠日报,'w') as zf1:
    for zi, duffer in excel_obj.items():
        zf1.writestr(zi,externalData_REGEX.sub(b'',duffer))

``` class ExcelTool(): def __init__(self,tableUrl:str,time) -> None: self.wb = openpyxl.load_workbook(tableUrl) self.path=tableUrl self.timePeriod=time self.images=[] self.red_fill = PatternFill(start_color='FF0000', fill_type='solid') self.yellow_fill=PatternFill(start_color='FFFF00', fill_type='solid') def initialize(self): try: # 表格名称映射 table_mapping = { 'data_sheet': 'Sheet5', 'ap_sheet': 'AP誤測機台追蹤Summary', 'dfu_sheet': 'DFU-NAND-INIT', 'fct_sheet': 'FCT', 'line_graph_sheet': 'By Cell 曲線圖' } # 检查所有必要表格 for sheet_type, expected_name in table_mapping.items(): found = False for sheet_id, sheet_name in enumerate(self.wb.sheetnames): if expected_name in sheet_name: table_mapping[sheet_type] = sheet_name found = True break if not found: messagebox.showwarning("警告", f"缺少表格:{expected_name}") return False except Exception as e: messagebox.showerror("錯誤", f"初始化失敗:{str(e)}") return False def Init(self): table_names = { 'DataName':'Sheet5', 'APName':'AP誤測機台追蹤Summary', 'DFUName':'DFU-NAND-INIT', 'FCTName':'FCT', 'LineGraphName':"By Cell 曲線圖" } for table_name in table_names.values(): sheets_len = len(self.wb.sheetnames) for sheet_id,sheet_name in enumerate(self.wb.sheetnames): if table_name in sheet_name: table_names[table_name] = sheet_name break if sheets_len == sheet_id: messagebox.showwarning("警告", f"该Excel文件缺少{table_name}表") return False # 删除工作表 self.wb.remove(self.wb[table_names['LineGraphName']]) # 创建一个新的工作表 self.wb.create_sheet(table_names['LineGraphName']) self.wb.move_sheet(self.wb.worksheets[-1], offset=1) self.data=self.wb[table_names['DataName']] self.AP = self.wb[table_names['APName']] self.FCT=self.wb[table_names['FCTName']] self.DFU=self.wb[table_names['DFUName']] self.LineGraph=self.wb[table_names['LineGraphName']] return self.Operation()```優化一下這段代碼
03-08
import time import pandas as pd import openpyxl from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.select import Select from selenium.webdriver import ActionChains, Keys from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) chrome_options.add_argument("--disable-blink-features=AutomationControlled") service = Service("D:/Python313/chromedriver.exe") driver = webdriver.Chrome(service=service, options=chrome_options) driver.maximize_window() file_path = 'C:/Users/一羽风/Desktop/机器人python/1.小组件测试文件/Best_Match.xlsx' wb = openpyxl.load_workbook(file_path) sheet1 = wb.worksheets[0] list_text = [] account_list = [] for row in sheet1.iter_rows(min_row=1,values_only=True): account_list.append((row[0])) driver.get("https://www.bilibili.com/") search_box = driver.find_element(By.XPATH, '//*[@id="nav-searchform"]/div[1]/input') for account in account_list[:2]: search_box.send_keys(Keys.CONTROL + 'a') search_box.send_keys(Keys.DELETE) search_box.send_keys(account) search_box.send_keys(Keys.RETURN) time.sleep(2) original_window = driver.current_window_handle new_window = [w for w in driver.window_handles if w != original_window][0] driver.switch_to.window(new_window) for page in range(3): next_page = driver.find_element(By.CLASS_NAME, 'vui_button vui_pagenation--btn') elements = driver.find_elements(By.CLASS_NAME,'bili-video-card__info') for element in elements[:5]: value2 = element.get_attribute("innerText") # print(value2) time.sleep(5) list_text.append(value2) print(list_text) next_page.click() time.sleep(8) driver.close() driver.switch_to.window(original_window) b站搜索内容之后,想点击下一页获取数据,但总是点击不了下一页按钮,总是报错,出错代码为:next_page = driver.find_element(By.CLASS_NAME, 'vui_button vui_pagenation--btn')
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值