4 import org.apache.commons.lang3.StringUtils;
5 import org.slf4j.Logger;
6 import org.slf4j.LoggerFactory;
7
8 import java.io.BufferedWriter;
9 import java.io.IOException;
10 import java.io.OutputStream;
11 import java.io.OutputStreamWriter;
12 import java.lang.reflect.Field;
13 import java.nio.charset.StandardCharsets;
14 import java.util.Arrays;
15 import java.util.List;
16
17 public class ExportCsvUtil {
18
19 private static final Logger logger = LoggerFactory.getLogger(ExportCsvUtil.class);
20 /**
21 * Solve the garbled problem
22 *
23 * @see <a href="http://www.cnblogs.com/tangkai/p/3818084.html">...</a>
24 */
25 private static final byte[] BOM = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF};
26
27 private ExportCsvUtil() {
28 }
29
30 /**
31 * @param fields
32 * @param list
33 * @param out
34 * @return
35 */
36 public static <T> void writeCSVFile(Field[] fields, List<T> list, String pattern, OutputStream out) {
37 try (BufferedWriter csvWtriter = new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8), 1024)) {
38 csvWtriter.write(new String(BOM, StandardCharsets.UTF_8));
39 String[] titles = Arrays.stream(fields).map(Field::getName).toArray(String[]::new);
40
41 // set title
42 writeHead(titles, csvWtriter);
43
44 // set data
45 for (T row : list) {
46 writeRow(fields, row, pattern, csvWtriter);
47 }
48 csvWtriter.flush();
49 } catch (Exception e) {
50 logger.error("writeCSVFile exception", e);
51 }
52 }
53
54 private static void writeHead(String[] titles, BufferedWriter csvWriter) throws IOException {
55 // set title
56 for (String title : titles) {
57 StringBuilder sb = new StringBuilder();
58 String rowStr = sb.append("\"").append(title).append("\",").toString();
59 csvWriter.write(rowStr);
60 }
61 csvWriter.newLine();
62 }
63
64 private static <T> void writeRow(Field[] fields, T row, String pattern, BufferedWriter csvWriter) throws Exception {
65 // set data
66 for (int i = 0; i < fields.length; i++) {
67 StringBuilder sb = new StringBuilder();
68 fields[i].setAccessible(true);
69 Object value = fields[i].get(row);
70 String formatString = ObjectUtil.convertToFormatString(value, pattern);
71 if (StringUtils.isNotBlank(formatString)) {
72 // Replace double quotes in values
73 if (formatString.contains("\"")) {
74 formatString = formatString.replace("\"", "");
75 }
76 // \t Solve the problem that the string starting with the number 0 cannot be displayed, such as the postal code
77 if (formatString.startsWith("0") && !formatString.contains(".")) {
78 formatString = formatString + "\t";
79 }
80 }
81 String rowStr = sb.append(formatString == null ? "" : formatString).append(",").toString();
82 csvWriter.write(rowStr);
83 }
84 csvWriter.newLine();
85 }
86 }
4 public void exportCSVPositionMongo( @Context HttpServletResponse response) throws Exception {
5 List<PositionMongo> positions = positionMongoProcessor.getCurrentDatePosition();
6 if (CollectionUtils.isEmpty(positions)) {
7 return;
8 }
9
10 logger.info("Mongo return position size:{}", positions.size());
11 String fileName = "MongoPosition";
12 response.reset();
13 response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".csv");
14 response.setContentType("application/x-xls");
15 Field[] declaredFields = PositionMongo.class.getDeclaredFields();
16 declaredFields =
17 Arrays.stream(declaredFields).filter(a -> !"serialVersionUID".equals(a.getName())).toArray(Field[]::new);
18 ExportCsvUtil.writeCSVFile(declaredFields, positions, "yyyy-MM-dd HH:mm:ss", response.getOutputStream());
19 response.flushBuffer();
20 }