JAVA CSV文件導入——代替Excel文件導入

我們經常有通過文件導入數據的需求,比如批量導入會員、導入配置、導入其他系統的數據。
通過Excel方式導入會比較麻煩,要導入類庫,可以考慮把Excel轉成CSV文件。
Excel->另存爲->文件類型 CSV UTF-8(逗號分隔)->然後就變成如下的效果了。
這裏寫圖片描述

在導入前把首行、後面的空白行刪除即可。
Controller裏面寫一個方法,傳入文件的路徑filePath。解析文件用的是apache.commons的FileUtils,當然也可以直接通過文件流讀取。

@RequestMapping("/import/reviewImport")
    public Response<List<String>> importSellerReview(@RequestParam("filePath") String filePath) {
        List<String> unSuccessLineNum = new ArrayList<>();
        try {
            List<String> lines =
                    FileUtils.readLines(new File(filePath), "UTF-8");
            int lineNum = 0;
            for (String line : lines) {
                lineNum++;
                List<String> arrayList = Arrays.asList(line.split(","));
                List<String> afterTreatmentLine = linePretreatment(arrayList);
                // 業務處理
            }
        } catch (IOException e) {
            //錯誤日誌記錄
        }
        return Response.success(unSuccessLineNum);
    }

private List<String> linePretreatment(List<String> lines) {
    List<String> newLines = new ArrayList<>(lines.size());
    for (int i = 0; i < lines.size(); i++) {
        String line = lines.get(i);
        if (line.startsWith("\"") && i != lines.size() - 1 && lines.get(i + 1).endsWith("\"")) {
            String newLine = line + lines.get(i + 1);
            newLines.add(newLine);
            i++;
        } else {
            newLines.add(line);
        }
    }
    return newLines;
}

private String getFromListDefaultNull(List<String> list, int index) {
    String str = null;
    try {
        str = StringUtils.trim(list.get(index));
    } catch (Exception e) {
        ReviewLogUtils.businessWarn(bExceptionLogger, "importItemReview get column error", "REVIEW_SYSTEM_001");
    }
    return str;
}

pom.xml加入

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

注意點:

  1. 如果Excel內容中包含CSV的分隔符(默認逗號),會在內容外層加一對引號,可以先分割然後把錯誤分割的內容再組合起來。see linePretreatment(List lines)。
  2. 如果導出的內容變成 name,age,(空),(空),(空),那麼很容易出現分割後List的長度不一致,get的時候會出現數組越界,統一處理下。see getFromListDefaultNull(List list, int index)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章