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
### 回答1: openpyxl load_workbook是一个Python库中的函数,用于加载Excel工作簿文件。它可以读取Excel文件中的数据和格式,并将其转换为Python对象,以便进行进一步的处理和分析。该函数可以接受Excel文件的路径或文件对象作为参数,并返回一个Workbook对象,该对象包含了Excel文件中的所有工作表和数据。使用openpyxl load_workbook函数可以方便地读取和处理Excel文件中的数据,是Python数据分析和处理中常用的工具之一。 ### 回答2: openpyxl是一个Python库,旨在使用最新的Excel文件格式(xlsx和xlsm)进行操作。其中,load_workbook方法是openpyxl库中用于加载Excel工作簿的方法。在Python中使用openpyxl库,可以将Excel文件中的数据读取到Python程序中,用于数据分析、处理等应用。 load_workbook方法有几个重要的参数,包括文件名、读取数据时的方式、数据只读模式等。其中,最基本的参数是文件名,需要指定要读取的Excel文件的路径和文件名。在Windows操作系统中,可以使用类似于“C:\test.xlsx”的路径格式来指定Excel文件的位置。在Linux或Mac OS操作系统中,需要将路径中的反斜杠“\”替换为正斜杠“/”。 load_workbook方法默认使用“guess_types=True”模式来读取Excel文件中的数据类型。它会尝试猜测Excel表格中的每个单元格的数据类型,并进行相应的转换。如果Excel表格中包含日期、时间或其他特殊格式的数字,通常建议关闭“guess_types”模式,手动指定数据类型。 另一个可选参数是数据只读模式,通过设置“read_only=True”可以打开只读模式。在只读模式下,数据只能从Excel文件中读取,无法进行修改。这对于大型的Excel文件或只需要获取数据的应用程序非常有效。只读模式还可以通过提高加载和读取速度来改善整体性能。 总的来说,openpyxl库非常强大,可读取Excel文件中的所有数据,并在Python代码中进行进一步处理和操作。使用load_workbook方法可以方便地加载Excel工作簿,并获取所需的数据。此外,openpyxl库还提供了其他方法和功能,用于处理和修改Excel文件。因此,它是Python中数据分析和可视化应用的强大工具之一。 ### 回答3: openpyxl是一种Python库,它允许对Excel文件进行读写操作。其中,load_workbook函数是openpyxl库中用于打开一个Excel文件的函数。 在使用load_workbook函数时,首先需要导入openpyxl库: ``` import openpyxl ``` 然后,使用load_workbook函数打开Excel文件: ``` wb = openpyxl.load_workbook('filename.xlsx') ``` 其中,'filename.xlsx'代表要打开的Excel文件名。如果文件不在当前工作目录下,则需要指定文件路径。 打开Excel文件后,就可以对其中的工作表、单元格等进行操作了。比如,可以使用sheetnames属性获取所有工作表的名称: ``` sheet_names = wb.sheetnames ``` 也可以选定特定的工作表进行操作,比如选定名为'Sheet1'的工作表: ``` ws = wb['Sheet1'] ``` 接下来,就可以对选定的工作表进行读写操作。比如,可以使用cell函数获取某个单元格的值: ``` value = ws.cell(row=1, column=1).value ``` 其中,row和column分别代表行和列的编号,从1开始。如果要给某个单元格赋值,可以使用相同的方法: ``` ws.cell(row=1, column=1, value='Hello, World!') ``` 除此之外,openpyxl库还提供了许多其他的函数和属性,可以根据具体的需求进行使用。使用load_workbook函数,可以方便地打开并操作Excel文件,使程序的编写更加高效和简便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值