CSV导出工具类



 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     }

 

posted @ 2022-07-06 18:37  保卫萝卜8  阅读(277)  评论(0)    收藏  举报