java导出csv文件工具类

java导出csv文件工具类,第1张

java导出csv文件工具类
import com.csvreader.CsvWriter;
import lombok.extern.slf4j.Slf4j;

import javax.persistence.Column;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Field;
import java.net.URLEncoder;

import java.nio.charset.Charset;
import java.util.List;

@Slf4j
public class CsvUtil {

    // 文件后缀
    public static final String SUFFIX = ".csv";
    // 字符
    public static final String CHARSET = "UTF-8";
    public static final int SIZE = 1024;


    
    public static  String createCsvFile(List exportData, Class clazz, String outPutPath, String fileName) {
        File csvFile;
        CsvWriter csvWtriter = null;
        String csvFileFullName = null;
        try {
            File file = new File(outPutPath);
            if (!file.exists()) {
                if (!file.mkdirs()) {
                    log.info("======================================路径文件创建失败==============================");
                    return null;
                }
            }
            //定义文件名格式并创建
            csvFileFullName = outPutPath + File.separator + fileName + SUFFIX;
            csvFile = new File(csvFileFullName);
            if (csvFile.exists()) {
                if (!csvFile.delete()) {
                    log.info("======================================旧文件删除失败==============================");
                    return null;
                }
            }
            if (csvFile.createNewFile()) {
                log.info("======================================csv文件创建成功==============================");
            }

            csvWtriter = new CsvWriter(csvFile.getCanonicalPath(), ',', Charset.forName(CHARSET));

            // 写入文件内容
            if (!exportData.isEmpty()) {
                // 写入文件头部
                String[] headerColums = getHeaders(exportData.get(0), clazz);
                csvWtriter.writeRecord(headerColums);
                for (T data: exportData) {
                    String[] rowColums = getContentRow(data, clazz);
                    csvWtriter.writeRecord(rowColums,true);
                }
            }
            log.info("======================================csv文件已生成====================================");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (csvWtriter != null) {
                csvWtriter.close();
            }
        }

        return csvFileFullName;
    }

	
    private static  String[] getHeaders(T data, Class clazz) {
        T u = clazz.cast(data);
        Field[] fields = u.getClass().getDeclaredFields();
        String[] headerColums = new String[fields.length];
        for (int i = 0; i < fields.length; i++) {
            fields[i].setAccessible(true);
            // 获取对应的注解值
            String columnName = fields[i].getAnnotation(Column.class).name();
            headerColums[i] = columnName;
        }

        return headerColums;
    }


    private static  String[] getContentRow(T data, Class clazz) throws IllegalAccessException {
        T u = clazz.cast(data);
        Field[] fields = u.getClass().getDeclaredFields();
        String[] rowColums = new String[fields.length];
        // 遍历对象的所有属性
        for (int i = 0; i < fields.length; i++) {
            fields[i].setAccessible(true);
            String value = fields[i].get(u) == null ? "" : String.valueOf(fields[i].get(u));
            // 每个value后面拼接 "u0009"防止日期显示不正常,以及大数字显示成科学计数法
            rowColums[i] = value + "u0009";
        }

        return rowColums;
    }


    public static void export(HttpServletResponse response, String fileFullName) throws IOException, RuntimeException {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(fileFullName);
            int len;
            byte[] buffer = new byte[SIZE];
            out = response.getOutputStream();
            // 防止中文乱码
            out.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});
            response.reset();
            response.setContentType("application/csv;charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileFullName.substring(fileFullName.lastIndexOf("/") + 1), CHARSET));
            response.setCharacterEncoding(CHARSET);
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 删除临时文件
            if (!deleteFile(fileFullName)) {
                log.info("=================================临时文件删除失败=========================");
            }
            if (in != null) {
                try {
                    in.close();
                } catch (Exception e) {
                    log.info("=================================输入流关闭失败=========================");
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {
                    log.info("=================================输出流关闭失败=========================");
                }
            }
        }
    }


    public static boolean deleteFile(String pathName) {
        //根据路径创建文件对象
        File file = new File(pathName);
        //路径是个文件时删除文件
        if (file.isFile()) {
            return file.delete();
        }
        return false;
    }

}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5716436.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存