JAVA匯入/匯出EXCEL檔案,自定義校驗,錯誤回寫excel,使用簡單快捷

2020-10-11 11:00:41

github地址: https://github.com/alan-et/alanpoi/tree/develop/alanpoi-analysis

專案中使用:

  <dependency>
      <groupId>com.alanpoi</groupId>
      <artifactId>alanpoi-analysis</artifactId>
      <version>1.3.0</version>
  </dependency>

功能介紹

IMPORT

  1. ExcelHandle 核心處理器

  2. ExcelWorkbookManage excel所有工作表管理

  3. ExcelInitConfig 組態檔初始化

  4. AbstractFileParser 檔案轉換類

alanpoi import有何優勢?

  1. 使用者不需要額外引入poi等繁瑣的jar
  2. 毫秒級解析大檔案,支援一鍵解析多sheet頁籤,不需要自己按照一定的格式迴圈匹配解析所有資料
  3. 不管你的系統多麼複雜,有多少個匯入,alanpoi全部支援,而且準確返回你需要的物件,減輕開發者工作量
  4. 目前外界業務越來越複雜,對各個功能要求也越來越嚴格,當然匯入也不例外,alanpoi支援錯誤一鍵回寫到excel,對應到每一行
  5. alanpoi靈活可延伸,提供了ExcelConsumeInterface介面,可繼承它,實現valid、error、end三個方法編寫自己的業務
    A. valid: 方法引數返回excel所有資料,使用者可進行自我校驗
    B. error: 匯入錯誤會回撥
    C. end: 方法引數返回校驗成功的資料,valid校驗失敗的資料不會返回,使用者可以自己操作持久化或者其他業務

怎麼使用alanpoi實現匯入

簡單一句話:一設定一繼承一呼叫

一設定

在專案resources目錄中新建excel-config.xml檔案,cosume中設定自己的消費類路徑,繼承ExcelConsumeInterface介面,sheet中的vo是把當前sheet序列化的物件路徑,column中當然就是設定vo中的屬性了, 其中name可選欄位,填了就是按照這個匹配excel列名,不填就是按照offset順序;匯入包含多個sheet就設定多個

   <?xml version = "1.0" encoding = "GB2312"?>
   <exg name="excelId" version="1.0" file-type="excel">
     <excel id="ACCOUNT" consume="com.xxx.FinAccountImportHandler">
        <sheet index="0" row-start="1" column-start="0"
               vo="com.xxx.vo.FinAccountImportVO">
            <column name="公司/供應商編號" offset="1">companyCode</column>
            <column name="公司/供應商名稱" offset="2">companyName</column>
            <column name="銀行賬號" offset="3">bankAccount</column>
            <column name="開戶銀行" offset="4">bankName</column>
        </sheet>
    </excel>
   </exg>

一繼承

consume類繼承ExcelConsumeInterface介面,實現方法

/**
 * when error will 呼叫
 *
 * @param excelError
 */
void error(ExcelError excelError);

/**
 * custom valid data
 *
 * @param workbookId
 * @param sheetDataList
 */
void validData(String workbookId, List<ExcelSheetData> sheetDataList, Map<Serializable, Object> excelParam);

/**
 * @param sheetDataList return success data
 */
void end(List<ExcelSheetData> sheetDataList, Map<Serializable, Object> excelParam);

一呼叫

使用者呼叫ExcelExportUtil類的customImportData即可,引數excelId就是excel-conifg.xml中設定的id

Export

描敘

能夠用一行程式碼實現絕不用第二行,如果一行不行,那就再加一行!

模式

註解模式匯出

ExcelSheet註解:用於匯入類上,可制定sheet名,列頭的顏色、字型、高度、寬度

ExcelColum註解: 用於匯入類的屬性上,可指定列頭的名稱,單元格的樣式

DateFormat註解: 用於匯入類的屬性上, 可以按照指定格式輸出到excel,預設"yyyy/MM/dd"
NumFormat註解: 用於匯入類的屬性上,可以按照指定格式輸出到excel,預設"00.00"

樣例:

@ExcelSheet(name = "測試", backColor = AlanColors.GREEN, font = "宋體", fontSize = 25)
@Data
public class ExportVO {
    @ExcelColumn(name = "名稱", width = 32, link = "${url}")
    private String name;

    @ExcelColumn(name = "值")
    private String value;

    @ExcelColumn(name = "金額")
    @NumFormat(value = "0000.00##")
    private BigDecimal amount;

    @ExcelColumn(name = "時間格式化")
    @DateFormat(value = "yyyy-MM-dd hh:mm:ss")
    private Date dateTime;

    @DateFormat
    @ExcelColumn(name = "日期格式化")
    private java.sql.Date date;
    
    @ExcelColumn(isExist = false)
    private String url;
}

使用

方式一. 直接匯出到瀏覽器

ExcelExportUtil.export(Colletion<?>,Class,HttpServletRequest,HttpServletResponse,fileName);


方式二. 呼叫getWorkbook獲取工作表,自行處理workbook

ExcelExportUtil.getWorkbook(Collection<?> singleSheetData, Class<?> c)

高階使用

範例一:匯出指定列(動態匯出列)

    List<ExportVO> list = new ArrayList<>();
    for (int i = 0; i < 500; i++) {
        ExportVO exportVO = new ExportVO();
        exportVO.setName("name" + i);
        exportVO.setValue(new BigDecimal(123.11 + i * 0.09));
        exportVO.setAmount(new BigDecimal(6666.666 + i * 10));
        exportVO.setDate(new Date(132324343 + i * 100));
        exportVO.setDateTime(new java.util.Date());
        list.add(exportVO);
    }
    List<String> colList = new ArrayList<>();
    //按照順序僅匯出add的列
    colList.add("name");
    colList.add("value");
    //呼叫獲取workbook物件;也可以直接呼叫exportSpecifyCol方法匯出到瀏覽器
    Workbook workbook = ExcelExportUtil.getWorkbookSpecifyCol(list, ExportVO.class, colList);

範例二:多sheet頁籤匯出

    List<ExportVO> list = new ArrayList<>();
    List<Export2VO> list2 = new ArrayList<>();
    for (int i = 0; i < 500; i++) {
        ExportVO exportVO = new ExportVO();
        exportVO.setName("name" + i);
        exportVO.setValue(new BigDecimal(123.11 + i * 0.09));
        exportVO.setAmount(new BigDecimal(6666.666 + i * 10));
        exportVO.setDate(new Date(132324343 + i * 100));
        exportVO.setDateTime(new java.util.Date());
        list.add(exportVO);
        Export2VO export2VO = new Export2VO();
        export2VO.setName("name" + i);
        export2VO.setValue("value" + i);
        export2VO.setAmount(new BigDecimal(6666.666 + i * 10));
        export2VO.setDate(new Date(132324343 + i * 100));
        export2VO.setDateTime(new java.util.Date());
        list2.add(export2VO);
    }
    Map<Class<?>, Collection<?>> map = new HashMap<>();
    map.put(ExportVO.class, list);
    map.put(Export2VO.class, list2);
    //呼叫獲取workbook物件;也可以直接呼叫exportByMultiSheet方法匯出到瀏覽器
    Workbook workbook = ExcelExportUtil.getWorkbookByMultiSheet(map);

程式碼已經開源,歡迎各位前來提出意見,謝謝!