爲導入的excel增長信息反饋

問題描述

以前excel導入的時候,當發生錯誤的咱們只是提供一個導入失敗的錯誤提示很不友好,爲此爲導入增長錯誤信息的反饋,設計方案是在導入以後,將導入的結果返回回來,因爲可能涉及到大量的數據導入因此將錯誤信息放在原導入excle的後面,導入完成後從新下載含有反饋信息的excel。google

實現效果以下所示:spa

clipboard.png

clipboard.png

clipboard.png

實現方法

  1. 定義一個類來保存咱們的返回信息,包含成功條數,失敗條數,失敗時要導出的反饋信息。
public class ImportBackMessage {
    /**
     * 成功導入的數量
     */
    private int successCount = 0;
    /**
     * 失敗導入的數量
     */
    private int errorCount = 0;
    /**
     * 失敗反饋文件名
     */
    private String fileName;
}
  1. 將錯誤信息寫入原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損壞,我沒法打開,錯誤以下,excel

clipboard.png

開始查了很久也沒明白爲何會出錯,以後在使用google查找Excel found unreadable content,發現這好像是一個Apache poi的一個bug。code

clipboard.png

clipboard.png

因此最後的解決方法是保留成功數據,在失敗的數據後面添加失敗緣由。以下所示ip

clipboard.png

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

相關文章
相關標籤/搜索