AttributeError: Cell is read only
时间: 2023-11-26 11:04:10 浏览: 236
这个错误通常是因为试图在只读模式下修改 Excel 文件中的单元格引起的。可以使用 `openpyxl` 库中的 `write_only` 模式来避免这个错误。在 `load_workbook()` 方法中设置 `write_only=True` 参数即可:
```
wb = load_workbook(filename=xlsx_file, read_only=True, data_only=True, write_only=True)
```
需要注意的是,使用 `write_only` 模式读取 Excel 文件时,只能使用 `append()` 方法向工作表中添加数据,而不能使用 `cell()` 方法或者 `[]` 运算符来访问或修改单元格。如果需要在读取 Excel 文件的同时修改单元格,就需要使用 `read_only=False` 模式,但是这会导致读取速度变慢。
相关问题
import os import pandas as pd from openpyxl import load_workbook # 指定要合并的文件夹路径 folder_path = r"E:\aaaa\aaaa" fields_to_write = ['aaaa', 'aaaa'] # 获取文件夹中所有的 xlsx 文件路径 xlsx_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.xlsx')] # 创建一个空的 DataFrame 用于存储合并后的数据 merged_data = pd.DataFrame() # 循环读取每个 xlsx 文件,将它们合并到 merged_data 中 for xlsx_file in xlsx_files: # 使用 pandas 读取 xlsx 文件,并清理无效字符引用 wb = load_workbook(filename=xlsx_file, read_only=True, data_only=True) for sheet_name in wb.sheetnames: ws = wb[sheet_name] for row in ws.rows: for cell in row: cell.value = cell.value if cell.value is None else str(cell.value).strip() df = pd.read_excel(wb) # 将读取到的数据追加到 merged_data 中 merged_data = merged_data.append(df, ignore_index=True) # 在 merged_data 中添加新的一列数据 merged_data['new_column'] = 'new_value' # 将合并后的数据写入到新的 xlsx 文件中 merged_data[fields_to_write + ['new_column']].to_excel(r"E:\aaaa\aaaa\merged_file.xlsx", index=False)这个代码会出现AttributeError: Cell is read only报错,请优化下
`AttributeError: Cell is read only` 错误通常发生在尝试修改 `openpyxl` 中的只读单元格时。只读单元格是指在读取工作簿时设置了 `read_only=True` 参数的情况下,`openpyxl` 将工作簿中的所有单元格标记为只读,以提高性能并减少内存占用。
你可以尝试将读取工作簿时的参数 `read_only` 设置为 `False`,并且使用 `write_only` 参数来提高写入性能,例如:
```python
import os
import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
# 指定要合并的文件夹路径
folder_path = r"E:\aaaa\aaaa"
fields_to_write = ['aaaa', 'aaaa']
# 获取文件夹中所有的 xlsx 文件路径
xlsx_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.xlsx')]
# 创建一个空的 DataFrame 用于存储合并后的数据
merged_data = pd.DataFrame()
# 循环读取每个 xlsx 文件,将它们合并到 merged_data 中
for xlsx_file in xlsx_files:
# 使用 pandas 读取 xlsx 文件,并清理无效字符引用
wb = load_workbook(filename=xlsx_file, read_only=False, data_only=True, keep_vba=False, keep_links=False, keep_protection=False)
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
for row in ws.rows:
for cell in row:
cell.value = cell.value if cell.value is None else str(cell.value).strip()
df = pd.read_excel(wb)
# 将读取到的数据追加到 merged_data 中
merged_data = merged_data.append(df, ignore_index=True)
# 在 merged_data 中添加新的一列数据
merged_data['new_column'] = 'new_value'
# 创建一个新的工作簿
wb_new = load_workbook(write_only=True)
ws_new = wb_new.create_sheet('merged_data')
# 将 DataFrame 中的数据逐行写入到新的工作簿中
rows = dataframe_to_rows(merged_data[fields_to_write + ['new_column']], index=False)
for row in rows:
ws_new.append(row)
# 保存合并后的数据到新的 xlsx 文件中
wb_new.save(r"E:\aaaa\aaaa\merged_file.xlsx")
```
在上面的代码中,我们将读取工作簿时的参数 `read_only` 设置为 `False`,并且使用 `write_only` 参数来提高写入性能。我们也将 `keep_vba`、`keep_links`和`keep_protection`这些参数设置为 `False`,以确保在读取工作簿时不会受到不必要的限制。最后,我们使用 `write_only` 模式创建了一个新的工作簿,并将 DataFrame 中的数据逐行写入到新的工作簿中,然后保存到新的 xlsx 文件中。
AttributeError: 'MergedCell' object attribute 'value' is read-only
这个错误是因为你正在尝试修改一个合并单元格(MergedCell)的值,但合并单元格的值是只读的,不能直接修改。
如果你想在一个合并单元格中设置值,你需要选择合并单元格的起始单元格,然后将值设置在该单元格上。以下是一个示例代码,演示如何在合并单元格中设置值:
```python
from openpyxl import load_workbook
# 打开工作簿
workbook = load_workbook('your_workbook.xlsx')
# 选择合并单元格的起始单元格
merged_cell = workbook['Sheet1']['A1']
# 设置值在起始单元格上
merged_cell.value = 'New value'
# 保存工作簿
workbook.save('your_workbook.xlsx')
```
在这个示例中,我们选择了`Sheet1`工作表中的合并单元格`A1`作为起始单元格,并将其值设置为`New value`。
请确保根据你实际的需求和数据结构进行相应的修改。希望这能帮到你!如果还有其他问题,请随时提问。
阅读全文