Java對csv文件和xlsx文件進行讀寫的工具類,簡單易用,代碼如下:
需要引用的依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<!--讀取大批數據-->
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.11.0</version>
</dependency>
工具類:
package com.example.demo;
import com.alibaba.fastjson.JSON;
import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.Charset;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
public class FileUtils {
private static final Logger logger = LoggerFactory.getLogger(FileUtils.class);
//2003- 版本的excel
private final static String excel2003L ="xls";
//2007+ 版本的excel
private final static String excel2007U ="xlsx";
private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
public void writeCSV(String csvFilePath, List<KeyLabel> exportKeys, List<Map<String, String>> dataList) {
try {
// 創建CSV寫對象 例如:CsvWriter(文件路徑,分隔符,編碼格式);
CsvWriter csvWriter = new CsvWriter(csvFilePath, ',', Charset.forName("Utf-8"));
// 寫內容
String[] headers = exportKeys.stream().map(a -> a.getLabel()).collect(Collectors.toList())
.toArray(new String[exportKeys.size()]);
String[] keys = exportKeys.stream().map(a -> a.getKey()).collect(Collectors.toList())
.toArray(new String[exportKeys.size()]);
csvWriter.writeRecord(headers);
for (Map<String, String> map : dataList) {
String[] writeLine = new String[keys.length];
for (int j = 0; j < keys.length; j++) {
if ("updateTime".equals(keys[j])) {
if (map.get(keys[j]) == null || "".equals(map.get(keys[j]))) {
writeLine[j] = "";
} else {
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
Date date = sdf.parse(String.valueOf(map.get(keys[j])));
writeLine[j] = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
}
} else {
writeLine[j] = map.get(keys[j]);
}
}
csvWriter.writeRecord(writeLine);
}
csvWriter.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
public List<Map> readCSV(String filePath) {
List<Map> resultInfo = new ArrayList<>();
try {
// 創建CSV讀對象
CsvReader csvReader = new CsvReader(filePath, ',', Charset.forName("Utf-8"));
// 讀表頭
csvReader.readHeaders();
// 獲取表頭
String[] headers = csvReader.getHeaders();
String[] fields = csvReader.getHeaders();
StringBuilder sb = new StringBuilder();
sb.append("[");
while (csvReader.readRecord()) {
sb.append("{");
for (int i = 0; i < fields.length; i++) {
sb.append("\"").append(fields[i]).append("\":\"").append(csvReader.get(headers[i])).append("\"");
if (i < fields.length - 1) {
sb.append(",");
}
}
sb.append("},");
}
if (sb.lastIndexOf(",") > 0) {
sb.deleteCharAt(sb.lastIndexOf(",")).append("]");
}
resultInfo = JSON.parseArray(sb.toString(), Map.class);
} catch (IOException e) {
e.printStackTrace();
}
return resultInfo;
}
/**
* 生成excel文件
* @param fileFullName 保存文件的地址(eg C:\xsls\abc.xls)
* @param titles 文件頭
* @param values 需要寫入的數據 Map<rowNo, <colNo, String>>
* @return
* @throws IOException
*/
public void saveExcel(String fileFullName, List<String> titles, Map<Integer, Map<Integer, String>> values) throws IOException {
Workbook workbook = generateWorkbook(StringUtils.getFilenameExtension(fileFullName), titles, values);
File file = new File(fileFullName);
if (!file.exists()){
file.createNewFile();
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
workbook.write(fileOutputStream);
fileOutputStream.flush();
}
/**
* 指定header名和map格式數據,生成Workbook
* @param fileExtension
* @param titles
* @param values
* @return
* @throws IOException
*/
public static Workbook generateWorkbook(String fileExtension, List<String> titles, Map<Integer, Map<Integer, String>> values) throws IOException {
Workbook workbook = createWorkBook(fileExtension);
// 生成一個sheet表格
Sheet sheet = workbook.createSheet();
// 設置表格默認列寬度爲15個字節
sheet.setDefaultColumnWidth((short) 15);
// 創建標題行
Row row = sheet.createRow(0);
for (int i = 0; i < titles.size(); i++) {
row.createCell(i).setCellValue(titles.get(i));
}
//標題行數
int headRow = 1;
//寫入正文
for (Integer key : values.keySet()) {
row = sheet.createRow(headRow + key);
Map<Integer, String> keySet = values.get(key);
for (int j = 0; j < keySet.size(); j++) {
Cell cell = row.createCell(j);
cell.setCellValue(keySet.get(j));
}
}
return workbook;
}
/**
* 讀取Excel爲Json字符串,客戶端反序列化即可得到List
* @param inputStream
* @param filenameExtension
* @param headerMapper 【列序號】和【Json的Key名】組成Key-Value
* @return
* @throws Exception
*/
public static String getJson(InputStream inputStream, String filenameExtension, Map<Integer, String> headerMapper) throws Exception {
Workbook wb = createWorkBook(filenameExtension ,inputStream);
Sheet sheetAt = wb.getSheetAt(0);
int lastRowNum = sheetAt.getLastRowNum();
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i <= lastRowNum; i++) {
Row row = sheetAt.getRow(i);
if (i == 0) {
continue;
}
sb.append("{");
int physicalNumberOfCells = row.getPhysicalNumberOfCells();
for (int j = 0; j < physicalNumberOfCells; j++) {
Object value = getCellValue(row.getCell(j));
sb.append("\"").append(headerMapper.get(j)).append("\":\"").append(value).append("\"");
if (j < physicalNumberOfCells - 1) {
sb.append(",");
}
}
sb.append("}");
if (i < lastRowNum) {
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
/**
* 根據inputStream創建一個Workbook
* 10W一下讀取
* @param fileType
* @param inputStream
* @return
* @throws Exception
*/
private static Workbook createWorkBook(String fileType, InputStream inputStream) throws Exception {
Workbook wb;
if (excel2003L.equals(fileType)) {
//2003-
wb = new HSSFWorkbook(inputStream);
} else if (excel2007U.equals(fileType)) {
//2007+
wb = new XSSFWorkbook(inputStream);
} else {
throw new Exception("解析的文件格式有誤!");
}
return wb;
}
/**
* 創建一個Workbook
* @param fileType
* @return
* @throws Exception
*/
private static Workbook createWorkBook(String fileType) throws IOException {
Workbook wb;
if (excel2003L.equals(fileType)) {
//2003-
wb = new HSSFWorkbook();
} else if (excel2007U.equals(fileType)) {
//2007+ 內存留存數據
wb = new SXSSFWorkbook(10000);
} else {
throw new IOException("解析的文件格式有誤!");
}
return wb;
}
/**
* 讀取Excel,返回Map
* @param inputStream
* @param filenameExtension
* @param columnNos
* @return
* @throws Exception
*/
public Map<Integer,Map<Integer,Object>> getMapFromWorkBook(InputStream inputStream, String filenameExtension, List<Integer> columnNos) throws Exception {
//Map<rowNo, Map<columnNo, columnValue>>
Map<Integer, Map<Integer, Object>> sheetMap = new HashMap<>();
Workbook wb = createWorkBook(filenameExtension ,inputStream);
Sheet sheetAt = wb.getSheetAt(0);
int lastRowNum = sheetAt.getLastRowNum();
for (int i = 0; i <= lastRowNum; i++) {
Row row = sheetAt.getRow(i);
if(i == 0) {
//skip header
continue;
}
Map<Integer, Object> columnValMap = new HashMap<>();
//按列展開
for (Integer index : columnNos) {
Object value = getCellValue(row.getCell(index));
columnValMap.put(index, value);
}
sheetMap.put(i,columnValMap);
}
return sheetMap;
}
/**
* 獲取cell值
* @param cell
* @return
*/
public static Object getCellValue(Cell cell) {
Object value = "";
if (cell != null){
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BLANK:
value = "";
break;
case Cell.CELL_TYPE_BOOLEAN:
value = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_ERROR:
case Cell.CELL_TYPE_FORMULA:
break;
case Cell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
break;
} else {
value = new DecimalFormat("0").format(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
}
}
return value;
}
/**
* 文本寫入txt
* @param file
* @param infos
*/
public void writeTxt(File file,List<String> infos){
try {
FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter osw=new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw=new BufferedWriter(osw);
for (String info:infos){
bw.write(info+"\t\n");
}
bw.close();
osw.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public HttpServletResponse downloadFile(File file, HttpServletResponse response) {
if (file.exists() == false) {
logger.info("待下載的文件:" + file + "不存在.");
} else {
try {
// 以流的形式下載文件。
InputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
// 如果輸出的是中文名的文件,在此處就要用URLEncoder.encode方法進行處理
response.setHeader("Content-Disposition",
"attachment;filename=" + new String(file.getName().getBytes("GB2312"), "ISO8859-1"));
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
File f = new File(file.getPath());
f.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return response;
}
/**
* 對字符串裏的中文符號轉換爲英文括號
* @param msg
* @return
*/
public String converBracket(String msg){
if (msg != null || !"".equals(msg)){
msg = msg.replaceAll("(", "(").replaceAll(")", ")");
}
return msg;
}
}
package com.example.demo;
public class KeyLabel {
//字段
private String key;
//字段名
private String label;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}