Created
April 24, 2017 11:03
-
-
Save dotkebi/c1f379ce3ae8672a1d56ba2596272b9d to your computer and use it in GitHub Desktop.
CSVWriter with reflection
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class CSVWriter { | |
private static final String UTF8_BOM = "\uFEFF"; | |
public void convert(HttpServletResponse response, List<?> datas, String name) { | |
write(response, transform(datas), name); | |
} | |
private List<String[]> transform(List<?> objects) { | |
List<String[]> dataToWrite = new ArrayList<>(); | |
if (objects.size() == 0) { | |
return dataToWrite; | |
} | |
dataToWrite.add(makeHeader(objects.get(0).getClass())); | |
int i; | |
Field[] fields; | |
String[] columns; | |
for (Object dto : objects) { | |
i = 0; | |
fields = dto.getClass().getDeclaredFields(); | |
columns = new String[fields.length]; | |
for (Field field : fields) { | |
field.setAccessible(true); | |
try { | |
columns[i] = field.get(dto) == null ? "" : String.valueOf(field.get(dto)); | |
} catch (IllegalAccessException e) { | |
e.printStackTrace(); | |
} | |
++i; | |
} | |
dataToWrite.add(columns); | |
} | |
return dataToWrite; | |
} | |
private String[] makeHeader(Class title) { | |
Field[] fields = title.getDeclaredFields(); | |
String[] columns = new String[fields.length]; | |
int i = 0; | |
for (Field field : fields) { | |
columns[i] = field.getName(); | |
++i; | |
} | |
return columns; | |
} | |
private void write(HttpServletResponse response, List<String[]> datas, String name) { | |
response.addHeader("Content-disposition", "attachment;filename=" + name + ".csv"); | |
response.setContentType("text/plain"); | |
response.setCharacterEncoding("UTF-8"); | |
try ( | |
OutputStream outputStream = response.getOutputStream(); | |
CSVWriter writer = new CSVWriter(new OutputStreamWriter(outputStream)) | |
) { | |
//add BOM | |
outputStream.write(UTF8_BOM.getBytes()); | |
writer.writeAll(datas); | |
response.flushBuffer(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
private String removeUTF8BOM(String s) { | |
if (s.startsWith(UTF8_BOM)) { | |
s = s.substring(1); | |
} | |
return s; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment