共计 1732 个字符,预计需要花费 5 分钟才能阅读完成。
问题描述
之前 excel 导入的时候,当发生错误的我们只是提供一个导入失败的错误提示很不友好,为此为导入增加错误信息的反馈,设计方案是在导入之后,将导入的结果返回回来,由于可能涉及到大量的数据导入所以将错误信息放在原导入 excle 的后面,导入完成后重新下载含有反馈信息的 excel。
实现效果如下所示:
实现方法
定义一个类来保存我们的返回信息,包含成功条数,失败条数,失败时要导出的反馈信息。
public class ImportBackMessage {
/**
* 成功导入的数量
*/
private int successCount = 0;
/**
* 失败导入的数量
*/
private int errorCount = 0;
/**
* 失败反馈文件名
*/
private String fileName;
}
将错误信息写入原 excel
// 保存学生信息
// 成功:将反馈的信息中成功数量加 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 损坏,我无法打开, 错误如下,
开始查了好久也没明白为什么会出错,之后在使用 google 查找 Excel found unreadable content,发现这好像是一个 Apache poi 的一个 bug。
所以最后的解决方法是保留成功数据,在失败的数据后面添加失败原因。如下所示
3. 将更改内容重新写入导入的 excel 文件中
OutputStream os=null;
os=new FileOutputStream(file);//file 是导入的文件
workbook.write(os);
os.flush();
os.close();
4.angular 显示反馈信息
前台只是负责信息的显示使用了 nz-modal, 并增加判断如果失败条数大于 0 则显示导出失败原因的按钮。
<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>
总结
现在这种实现,比之前好了一些,但感觉有些地方实现还是不好,欢迎大家提出改进意见。