csv 导出数据

偶尔善良 提交于 2020-03-18 18:29:51

3 月,跳不动了?>>>

super-csv 版

①依赖

  <dependency>
            <groupId>net.sf.supercsv</groupId>
            <artifactId>super-csv</artifactId>
            <version>2.4.0</version>
        </dependency>

②代码

package com.mybatis.springbootmybatis.util;

import jdk.nashorn.internal.runtime.GlobalConstants;
import org.supercsv.io.CsvBeanWriter;
import org.supercsv.io.ICsvBeanWriter;
import org.supercsv.prefs.CsvPreference;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

public class SuperCsvUtil {


    public static void export(HttpServletResponse response, List<?> datas,Class<?> tClass) throws IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/csv");

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH/mm/ss");
        String current =formatter.format(LocalDateTime.now());
        String filename = URLEncoder.encode("售后单列表-" + current + ".csv", "utf-8");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

        // 防止乱码出现
        Writer writer = new OutputStreamWriter(response.getOutputStream(), "utf-8");
        // 写入字节流,让文档以UTF-8编码
        writer.write('\uFEFF');
        ICsvBeanWriter csvWriter = new CsvBeanWriter(writer, CsvPreference.STANDARD_PREFERENCE);
        String[] header = getHeader(tClass);
        csvWriter.writeHeader(header);

        for (Object data : datas) {
            csvWriter.write(data, header);
        }
        csvWriter.close();
    }


    private static String[] getHeader(final Class<?> cls) {
        final List<Field> allFields =getAllFieldsList(cls);
        String[] headers = new String[allFields.size()];
        int i = 0;
        for (Field field : allFields) {
            headers[i] = field.getName();
            i++;
        }
        return headers;
    }

    private static List<Field> getAllFieldsList(final Class<?> cls) {
        final List<Field> allFields = new ArrayList<Field>();
        Class<?> currentClass = cls;
        while (currentClass != null) {
            final Field[] declaredFields = currentClass.getDeclaredFields();
            for (final Field field : declaredFields) {
                allFields.add(field);
            }
            currentClass = currentClass.getSuperclass();
        }
        return allFields;
    }
}

apache-comon-csv 版

①依赖

       <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.8</version>
        </dependency>

②代码

package com.mybatis.springbootmybatis.util;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.util.*;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;

/**
 * csv导出工具类
 */
public class CommonsCsvUtil {




	public static void exportByList( List<?> dataList, OutputStream os,Class<?> tClass) {
		OutputStreamWriter osw = null;
		CSVFormat csvFormat = null;
		CSVPrinter csvPrinter = null;
		try {
			List<Map<String, String>> maps = converToMap(dataList, tClass);
			Map<String,String> map = maps.get(0);
            String[] headers = new String[map.size()];
			int k = 0;
            for (Map.Entry<String, String> entry : map.entrySet()) {
                headers[k] = entry.getKey();
                k++;
            }
			osw = new OutputStreamWriter(os, "GBK");//如果是UTF-8时,WPS打开是正常显示,而微软的excel打开是乱码,
			csvFormat = CSVFormat.DEFAULT.withHeader(headers);
			csvPrinter = new CSVPrinter(osw, csvFormat);


			List<String> values = new ArrayList<>(headers.length);
			for (Map<String, String> stringMap : maps) {
				for (String header : headers) {
					values.add(stringMap.get(header));
				}
				csvPrinter.printRecord(values);
				values.clear();
			}
            csvPrinter.close(true);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	private static List<Map<String,String>> converToMap(List<?> datas, Class<?> tClass)  {
        List<Map<String,String>> result = new ArrayList<>();
        List<Field> fields = getAllFieldsList(tClass);

        for (Object data : datas) {
            Map<String,String> map = new LinkedHashMap<>();
            for (Field field : fields) {
                try {
                    field.setAccessible(true);
                    map.put(field.getName(), field.get(data).toString());
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            result.add(map);
        }
        return result;
    }
    private static List<Field> getAllFieldsList(final Class<?> cls) {
        final List<Field> allFields = new ArrayList<Field>();
        Class<?> currentClass = cls;
        while (currentClass != null) {
            final Field[] declaredFields = currentClass.getDeclaredFields();
            for (final Field field : declaredFields) {
                allFields.add(field);
            }
            currentClass = currentClass.getSuperclass();
        }
        return allFields;
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!