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;
}
}
来源:oschina
链接:https://my.oschina.net/u/3574106/blog/3197596