修正一下字典的返回结构,我要求字典的value是cell.coordinate组成的list,key去除jinja2语法的初始值
时间: 2023-11-27 20:49:08 浏览: 160
好的,那么修正后的代码如下:
```python
import openpyxl
import re
def load_excel(file_path):
wb = openpyxl.load_workbook(file_path)
ws = wb.active
data = {}
for row in ws.iter_rows(min_row=1, values_only=True):
key = row[0]
if isinstance(key, str) and key.startswith('{{') and key.endswith('}}'):
key = re.sub(r'{{.*?}}', '', key).strip()
values = []
for cell in row[1:]:
if cell is not None:
values.append(cell.coordinate)
data[key] = values
return data
```
这样返回的字典,key是去除了jinja2语法的初始值,value是由非空cell的coordinate组成的list。
相关问题
修改代码,可以合并多个Excel文件from openpyxl import load_workbook from openpyxl.utils import get_column_letter # 打开第一个Excel文件 wb1 = load_workbook('file1.xlsx') ws1 = wb1.active # 打开第二个Excel文件 wb2 = load_workbook('file2.xlsx') ws2 = wb2.active # 创建一个新的工作簿 wb3 = Workbook() ws3 = wb3.active # 复制第一个文件的内容到新的工作簿 for row in ws1.iter_rows(): for cell in row: ws3[cell.coordinate].value = cell.value # 复制第二个文件的内容到新的工作簿 for row in ws2.iter_rows(): for cell in row: column_letter = get_column_letter(cell.column) ws3[column_letter + str(cell.row)].value = cell.value # 保存新的工作簿 wb3.save('merged_file.xlsx')
您的代码基本上已经完成了多个Excel文件的合并,但是在复制第二个文件的内容时,有一个小错误。在使用`get_column_letter()`时,应该将其导入自openpyxl.utils而不是openpyxl模块。
以下是修改后的代码,以合并多个Excel文件:
```python
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
from openpyxl import Workbook
# 打开第一个Excel文件
wb1 = load_workbook('file1.xlsx')
ws1 = wb1.active
# 打开第二个Excel文件
wb2 = load_workbook('file2.xlsx')
ws2 = wb2.active
# 创建一个新的工作簿
wb3 = Workbook()
ws3 = wb3.active
# 复制第一个文件的内容到新的工作簿
for row in ws1.iter_rows():
for cell in row:
ws3[cell.coordinate].value = cell.value
# 复制第二个文件的内容到新的工作簿
for row in ws2.iter_rows():
for cell in row:
column_letter = get_column_letter(cell.column)
ws3[column_letter + str(cell.row)].value = cell.value
# 保存新的工作簿
wb3.save('merged_file.xlsx')
```
在上述代码中,我们首先打开两个Excel文件(file1.xlsx和file2.xlsx),然后创建一个新的工作簿wb3。接下来,我们使用两个嵌套的循环遍历每个单元格,并将其值复制到新工作簿ws3中。注意在复制第二个文件内容时,我们使用了`get_column_letter()`来获取列字母。
最后,我们保存合并后的工作簿为merged_file.xlsx。
希望这次的修改能满足您的需求!如果还有其他问题,请随时提问。
from openpyxl import load_workbook, Workbook from openpyxl.styles import PatternFill class ExcelMerger: def __init__(self, input_path, output_path): self.input_path = input_path self.output_path = output_path self.workbook = Workbook() self.sheet = self.workbook.active self.fill = PatternFill(fill_type='solid', start_color='FFFFFF', end_color='FFFFFF') self.row_index = 1 def merge(self): for filename in os.listdir(self.input_path): if not filename.endswith('.xlsx'): continue filepath = os.path.join(self.input_path, filename) workbook = load_workbook(filepath, data_only=True) if '功能点拆分表' not in workbook.sheetnames: continue sheet = workbook['功能点拆分表'] for row in sheet.rows: self.sheet.row_dimensions[self.row_index].height = sheet.row_dimensions[row[0].row].height for cell in row: if cell.value is not None: self.sheet.cell(row=self.row_index, column=cell.column, value=cell.value) self.sheet.cell(row=self.row_index, column=cell.column).fill = cell.fill else: self.sheet.cell(row=self.row_index, column=cell.column).fill = self.fill self.row_index += 1 self.workbook.save(self.output_path)上述修改后的代码仍然出现TypeError: unhashable type: 'StyleProxy'的错误,怎么解决
这个问题通常是由于样式对象(Style)是不可哈希的导致的。在这种情况下,你需要将样式对象转换为可哈希的对象,或者使用其他数据结构来代替字典。
你可以尝试将样式对象转换为字符串,然后将字符串作为键来使用。例如,可以使用`str(style)`来获取样式对象的字符串表示形式,并将其用作字典的键,如下所示:
```
cell_style = {}
...
if cell.has_style:
cell_style[cell.coordinate] = str(cell.style)
...
```
这样就可以避免`TypeError: unhashable type: 'StyleProxy'`错误。
当然,这只是一种解决方案,具体如何修改代码需要根据具体情况而定。
阅读全文