以前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