以前excel导入的时候,当发生错误的咱们只是提供一个导入失败的错误提示很不友好,为此为导入增长错误信息的反馈,设计方案是在导入以后,将导入的结果返回回来,因为可能涉及到大量的数据导入因此将错误信息放在原导入excle的后面,导入完成后从新下载含有反馈信息的excel。google
实现效果以下所示:spa
public class ImportBackMessage { /** * 成功导入的数量 */ private int successCount = 0; /** * 失败导入的数量 */ private int errorCount = 0; /** * 失败反馈文件名 */ private String fileName; }
// 保存学生信息 // 成功:将反馈的信息中成功数量加1 // 失败:将反馈的信息中失败数量加1,而且检查实体属性,将错误的信息加在该excel行后面 try { studentRepository.save(student); importBackMessage.setSuccessCount(importBackMessage.getSuccessCount() + 1); } catch (Exception e) { String backMessage = checkStudentMessage(student); Cell cell = row.createCell(importMessage.size()); if (backMessage.length() != 0) { cell.setCellValue("错误缘由:" + backMessage); } else { cell.setCellValue("错误缘由:未知错误"); } importBackMessage.setErrorCount(importBackMessage.getErrorCount() + 1); }
在这里遇到了一些问题,并无理想的将问题解决掉,理想的实现是将导入成功的信息删除掉,在导入错误的信息以后增长错误提示。但在咱们在excel中删除成功的行时,遇到了一些问题。
最开始使用removeRow(Row row)
方法发现该方法只能删除行内容,但还会保留该行的位置
后来查询这使用了shiftRows(int startRow,int endRow,int n)
这个方法用法是将startrow到endrow行之间的内容向下移动n行,当n为负数时向上移动。设计
但当咱们使用这个方法后在咱们导出的文件产生了excel损坏,我没法打开,错误以下,excel
开始查了很久也没明白为何会出错,以后在使用google查找Excel found unreadable content
,发现这好像是一个Apache poi的一个bug。code
因此最后的解决方法是保留成功数据,在失败的数据后面添加失败缘由。以下所示ip
3.将更改内容从新写入导入的excel文件中rem
OutputStream os=null; os=new FileOutputStream(file);//file是导入的文件 workbook.write(os); os.flush(); os.close();
4.angular显示反馈信息get
前台只是负责信息的显示使用了nz-modal
,并增长判断若是失败条数大于0则显示导出失败缘由的按钮。it
<nz-modal [(nzVisible)]="backMessage.showMessage" nzTitle="导入信息反馈" (nzOnCancel)="handleCancel()" (nzOnOk)="handleCancel()" > <p>成功{{backMessage.successCount}}条,失败{{backMessage.errorCount}}条</p> <button nz-button *ngIf="backMessage.errorCount > 0" [nzSize]="small" (click)="exportErrorExcle()">导出失败缘由</button> </nz-modal>
如今这种实现,比以前好了一些,但感受有些地方实现仍是很差,欢迎你们提出改进意见。io