You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
JDAirPort.Ems.Back/docs/Excel图片导入导出使用指南.md

280 lines
6.2 KiB
Markdown

# Excel图片导入导出使用指南
## 技术方案概述
### 技术架构
- **框架**: RuoYi (SpringBoot + Vue + Redis + MyBatis)
- **部署环境**: 麒麟系统
- **数据库**: TiDB
- **Excel处理**: Apache POI 4.1.2
- **图片存储**: 本地文件系统
### 核心功能
1. Excel中嵌入图片的导出
2. Excel中图片的提取和导入
3. 图片文件的本地存储管理
4. 数据库路径信息的维护
## 实现架构
### 1. 核心工具类
#### ImageExcelUtils.java
专门处理Excel图片操作的工具类
**主要功能:**
- `insertImageToCell()`: 向Excel单元格插入图片
- `extractImagesFromSheet()`: 从Excel提取所有图片
- `saveImageFromExcel()`: 保存提取的图片到本地
- `isSupportedImageFormat()`: 验证图片格式
- `cleanupTempImages()`: 清理临时图片文件
**支持格式:**
- JPG/JPEG
- PNG
- GIF (转换为JPEG)
- BMP (转换为JPEG)
#### ExcelUtil.java (增强版)
集成图片处理功能的Excel工具类
**新增功能:**
- 在`setCellVo()`中集成图片插入
- 在`importExcel()`中集成图片提取
- 自动处理图片的导入导出流程
### 2. 实体类配置
```java
public class PowerEnergySparePartsRegistration {
/** 图片位置 */
@Excel(name = "图片位置",
cellType = Excel.ColumnType.IMAGE,
width = 30,
height = 80)
private String imageLocation;
}
```
**注解说明:**
- `cellType = Excel.ColumnType.IMAGE`: 指定为图片类型
- `width = 30`: 单元格宽度
- `height = 80`: 单元格高度
### 3. Controller层实现
#### 新增接口
1. **导入模板下载**
```
POST /ems/info/powerEnergyRegistration/importTemplate
```
2. **数据导入(含图片)**
```
POST /ems/info/powerEnergyRegistration/importData
参数: file (MultipartFile), updateSupport (boolean)
```
3. **数据导出(含图片)**
```
POST /ems/info/powerEnergyRegistration/export
```
## 使用流程
### 导出流程
1. **准备数据**
```java
List<PowerEnergySparePartsRegistration> list = service.selectList(params);
```
2. **设置图片路径**
确保实体对象的`imageLocation`字段包含正确的图片路径
3. **执行导出**
```java
ExcelUtil<PowerEnergySparePartsRegistration> util = new ExcelUtil<>(PowerEnergySparePartsRegistration.class);
util.exportExcel(response, list, "备件登记数据");
```
4. **结果**
- 生成包含图片的Excel文件
- 图片自动嵌入到对应单元格中
- 图片尺寸根据注解自动调整
### 导入流程
1. **上传Excel文件**
- 支持.xlsx和.xls格式
- 文件中可包含嵌入的图片
2. **图片提取**
```java
List<PowerEnergySparePartsRegistration> list = util.importExcel(inputStream);
```
3. **图片处理**
- 自动提取Excel中的图片
- 保存到服务器本地路径: `/profile/excel-images/`
- 生成唯一文件名避免冲突
4. **数据验证**
- 验证必填字段
- 验证图片格式
- 检查重复记录
5. **数据保存**
- 图片路径保存到数据库
- 支持新增和更新模式
## 图片存储结构
### 存储路径
```
{ruoyi.profile}/excel-images/
├── 2025/01/28/
│ ├── uuid1.jpg
│ ├── uuid2.png
│ └── ...
└── ...
```
### 路径格式
- **完整路径**: `/media/tao_iot/ruoyi/uploadPath/excel-images/2025/01/28/uuid.jpg`
- **数据库存储**: `/excel-images/2025/01/28/uuid.jpg`
- **访问URL**: `http://domain/profile/excel-images/2025/01/28/uuid.jpg`
## 配置要求
### 1. 系统配置 (application.yml)
```yaml
ruoyi:
profile: /media/tao_iot/ruoyi/uploadPath
```
### 2. 权限配置
```
ems/info:powerEnergyRegistration:import
ems/info:powerEnergyRegistration:export
ems/info:powerEnergyRegistration:list
```
### 3. 文件系统要求
- 确保上传目录有读写权限
- 预留足够磁盘空间
- 定期清理临时文件
## 错误处理
### 常见错误及解决方案
1. **图片格式不支持**
- 错误: `图片格式不支持: xxx.tiff`
- 解决: 使用支持的格式 (jpg/png/gif/bmp)
2. **文件路径不存在**
- 错误: `图片文件不存在: /path/to/image.jpg`
- 解决: 检查图片路径是否正确
3. **权限不足**
- 错误: `创建图片存储目录失败`
- 解决: 检查文件系统权限
4. **内存不足**
- 错误: `OutOfMemoryError`
- 解决: 增加JVM内存或分批处理
### 异常处理机制
1. **导入失败时自动清理临时图片**
2. **详细的错误信息反馈**
3. **事务回滚保证数据一致性**
4. **日志记录便于问题排查**
## 性能优化建议
### 1. 图片处理优化
- 控制图片尺寸 (建议 < 1MB)
- 批量处理时分页处理
- 使用图片压缩减少存储空间
### 2. Excel处理优化
- 大数据量时使用SXSSFWorkbook流式处理
- 设置合适的缓存行数 (默认500)
- 及时释放资源避免内存泄漏
### 3. 麒麟系统优化
- 使用本地高速存储
- 配置合适的文件系统权限
- 定期清理临时文件
## 安全考虑
### 1. 文件安全
- 验证上传文件类型
- 限制文件大小
- 扫描恶意文件
### 2. 路径安全
- 防止路径遍历攻击
- 使用相对路径存储
- 验证文件扩展名
### 3. 权限控制
- 基于角色的访问控制
- 操作日志记录
- 敏感数据脱敏
## 测试用例
### 1. 功能测试
- [x] 导出带图片的Excel文件
- [x] 导入含图片的Excel文件
- [x] 图片格式验证
- [x] 错误处理机制
### 2. 性能测试
- [ ] 大量数据导出性能
- [ ] 大量图片处理性能
- [ ] 并发访问压力测试
### 3. 兼容性测试
- [x] 不同Excel版本兼容性
- [x] 不同图片格式支持
- [x] 麒麟系统环境测试
## 维护指南
### 1. 日常维护
- 监控磁盘空间使用
- 清理过期临时文件
- 检查错误日志
### 2. 故障排查
- 检查文件系统权限
- 验证图片路径正确性
- 分析异常日志信息
### 3. 性能监控
- 监控内存使用情况
- 跟踪处理时间
- 分析并发性能
## 扩展功能
### 1. 图片处理增强
- 图片压缩
- 格式转换
- 水印添加
### 2. 存储扩展
- 分布式文件存储
- 对象存储集成
- 图片CDN加速
### 3. 功能扩展
- 批量图片处理
- 图片预览功能
- 历史版本管理