讀寫csv,xlsx文件的工具類

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;
    }

}

 

發佈了114 篇原創文章 · 獲贊 785 · 訪問量 114萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章