我們經常有通過文件導入數據的需求,比如批量導入會員、導入配置、導入其他系統的數據。
通過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>
注意點:
- 如果Excel內容中包含CSV的分隔符(默認逗號),會在內容外層加一對引號,可以先分割然後把錯誤分割的內容再組合起來。see linePretreatment(List lines)。
- 如果導出的內容變成 name,age,(空),(空),(空),那麼很容易出現分割後List的長度不一致,get的時候會出現數組越界,統一處理下。see getFromListDefaultNull(List list, int index)