import pandas as pd from openpyxl import Workbook from openpyxl.drawing.image import Image # 创建Excel工作簿 wb = Workbook() ws1 = wb.active ws1.title = "质检反馈报告" # 输入质检反馈报告数据 data_report = { "项目名称": ["交通标志图像检测"], "质检员": ["张三"], "数据总数量": ["15张图像"], "质检总数量": ["15张图像"], "质检工具": ["Labelme"], "质检方法": ["全样质检"], "等级:合格数据量": ["10张图像"], "不合格数据量": ["5张图像"], "要求合格率": ["100%"], "实际质检合格率": ["67%"] } df_report = pd.DataFrame(data_report) for r in dataframe_to_rows(df_report, index=False, header=True): ws1.append(r) # 创建不合格图像详细记录工作表 ws2 = wb.create_sheet("不合格图像详细记录") # 输入不合格图像详细记录数据 data_images = { "图像名": ["road10.jpg", "road14.jpg", "road15.jpg", "road2.png", "road6.png"], "质检反馈": [ "标签名称不正确。\n该标志的标签应为\nsharp right turn,\n但实际标注为\nsharpright turn.", "标签名称不正确。\n该标志的标签应为\nno U turn,\n但实际标注为\nnoparking.", "标签名称不正确。\n该标志的标签应为\ndanger warning,\n但实际标注为\nschool ahead.", "标注框虽然覆盖\n了整个目标,但\n标注框过大。", "图像中左上角有\n个人形道标志\n没有标注。" ], "截图": ["", "", "", "", ""] } df_images = pd.DataFrame(data_images) for r in dataframe_to_rows(df_images, index=False, header=True): ws2.append(r) # 插入截图(假设截图已保存为本地文件) img1 = Image("path/to/image.png") ws2.add_image(img1, "C2") # 插入到第三个单元格(C2) # 保存Excel文件 wb.save("质检反馈报告.xlsx")
时间: 2025-05-30 21:11:28 浏览: 19
你的代码实现了一个质检反馈报告的生成过程,使用了 `pandas` 和 `openpyxl` 库来创建 Excel 文件,并插入数据和图像。以下是对代码的详细解释以及优化建议。
---
### 代码解释
1. **导入库**:
- `pandas`:用于处理表格数据。
- `openpyxl`:用于创建和操作 Excel 文件。
- `Image`:用于将图片插入到 Excel 表格中。
2. **创建工作簿和工作表**:
- 使用 `Workbook()` 创建一个新的 Excel 工作簿。
- 设置默认的工作表标题为 `"质检反馈报告"`。
3. **输入质检反馈报告数据**:
- 将质检反馈报告的数据存储在一个字典中,并通过 `pandas.DataFrame` 转换为 DataFrame。
- 使用 `dataframe_to_rows` 方法将 DataFrame 数据逐行写入 Excel 工作表。
4. **创建不合格图像详细记录工作表**:
- 使用 `create_sheet` 方法创建新的工作表,命名为 `"不合格图像详细记录"`。
5. **输入不合格图像详细记录数据**:
- 同样使用字典存储数据,并转换为 DataFrame。
- 将数据逐行写入新工作表。
6. **插入截图**:
- 假设截图文件已保存在本地路径下,使用 `Image` 类加载图片并插入到指定单元格。
7. **保存文件**:
- 使用 `save` 方法将生成的 Excel 文件保存为 `"质检反馈报告.xlsx"`。
---
### 优化与改进建议
#### 1. 动态调整列宽
为了使生成的 Excel 文件更加美观,可以动态调整列宽以适应内容长度。
```python
def adjust_column_width(ws):
for column_cells in ws.columns:
length = max(len(str(cell.value)) for cell in column_cells)
ws.column_dimensions[column_cells[0].column_letter].width = length + 2
```
调用此函数时:
```python
adjust_column_width(ws1)
adjust_column_width(ws2)
```
#### 2. 插入多张图片
如果需要插入多张图片,可以通过循环实现:
```python
image_paths = ["path/to/image1.png", "path/to/image2.png", "path/to/image3.png"]
for idx, path in enumerate(image_paths, start=2): # 从第2行开始插入图片
img = Image(path)
ws2.add_image(img, f"C{idx}")
```
#### 3. 格式化单元格
为了增强可读性,可以设置单元格样式(如字体、对齐方式等):
```python
from openpyxl.styles import Alignment, Font
def format_cells(ws):
for row in ws.iter_rows():
for cell in row:
cell.alignment = Alignment(wrap_text=True, horizontal='center', vertical='center')
cell.font = Font(name='Arial', size=11)
format_cells(ws1)
format_cells(ws2)
```
#### 4. 检查路径有效性
在插入图片前,确保路径有效,避免程序报错:
```python
import os
def insert_images(ws, image_paths, start_row=2):
for idx, path in enumerate(image_paths, start=start_row):
if os.path.exists(path):
img = Image(path)
ws.add_image(img, f"C{idx}")
else:
print(f"警告:图片路径 {path} 不存在,跳过插入。")
```
调用时:
```python
image_paths = ["path/to/image1.png", "path/to/image2.png", "path/to/image3.png"]
insert_images(ws2, image_paths)
```
---
### 改进后的完整代码
以下是改进后的完整代码:
```python
import pandas as pd
from openpyxl import Workbook
from openpyxl.drawing.image import Image
from openpyxl.styles import Alignment, Font
import os
# 创建Excel工作簿
wb = Workbook()
ws1 = wb.active
ws1.title = "质检反馈报告"
# 输入质检反馈报告数据
data_report = {
"项目名称": ["交通标志图像检测"],
"质检员": ["张三"],
"数据总数量": ["15张图像"],
"质检总数量": ["15张图像"],
"质检工具": ["Labelme"],
"质检方法": ["全样质检"],
"等级:合格数据量": ["10张图像"],
"不合格数据量": ["5张图像"],
"要求合格率": ["100%"],
"实际质检合格率": ["67%"]
}
df_report = pd.DataFrame(data_report)
for r in dataframe_to_rows(df_report, index=False, header=True):
ws1.append(r)
# 创建不合格图像详细记录工作表
ws2 = wb.create_sheet("不合格图像详细记录")
# 输入不合格图像详细记录数据
data_images = {
"图像名": ["road10.jpg", "road14.jpg", "road15.jpg", "road2.png", "road6.png"],
"质检反馈": [
"标签名称不正确。\n该标志的标签应为\nsharp right turn,\n但实际标注为\nsharpright turn.",
"标签名称不正确。\n该标志的标签应为\nno U turn,\n但实际标注为\nnoparking.",
"标签名称不正确。\n该标志的标签应为\ndanger warning,\n但实际标注为\nschool ahead.",
"标注框虽然覆盖\n了整个目标,但\n标注框过大。",
"图像中左上角有\n个人形道标志\n没有标注。"
],
"截图": ["", "", "", "", ""]
}
df_images = pd.DataFrame(data_images)
for r in dataframe_to_rows(df_images, index=False, header=True):
ws2.append(r)
# 动态调整列宽
def adjust_column_width(ws):
for column_cells in ws.columns:
length = max(len(str(cell.value)) for cell in column_cells)
ws.column_dimensions[column_cells[0].column_letter].width = length + 2
adjust_column_width(ws1)
adjust_column_width(ws2)
# 格式化单元格
def format_cells(ws):
for row in ws.iter_rows():
for cell in row:
cell.alignment = Alignment(wrap_text=True, horizontal='center', vertical='center')
cell.font = Font(name='Arial', size=11)
format_cells(ws1)
format_cells(ws2)
# 插入多张图片
def insert_images(ws, image_paths, start_row=2):
for idx, path in enumerate(image_paths, start=start_row):
if os.path.exists(path):
img = Image(path)
ws.add_image(img, f"C{idx}")
else:
print(f"警告:图片路径 {path} 不存在,跳过插入。")
image_paths = ["path/to/image1.png", "path/to/image2.png", "path/to/image3.png"]
insert_images(ws2, image_paths)
# 保存Excel文件
wb.save("质检反馈报告.xlsx")
```
---
### 上述代码的功能说明
1. **动态调整列宽**:根据内容自动调整列宽,使表格更美观。
2. **格式化单元格**:设置字体和对齐方式,提升可读性。
3. **批量插入图片**:支持插入多张图片,并检查路径有效性。
4. **错误提示**:当图片路径无效时,输出警告信息。
---
###
阅读全文
相关推荐
















