CVS文件生成下载

Dear 丶 2024-04-01 14:36 188阅读 0赞

@Service
public class ReportExportUtil {

  1. /**
  2. * 生成CVS文件
  3. *
  4. * @param dataset 源数据集合
  5. * @param map csv文件的列表头map
  6. * @param fileName 文件名称
  7. * @return
  8. * @throws IOException
  9. * @throws NoSuchMethodException
  10. * @throws InvocationTargetException
  11. */
  12. public static <T> void createCSVFile(Collection<T> dataset, LinkedHashMap map, String fileName,HttpServletResponse response)
  13. throws IOException, InvocationTargetException, NoSuchMethodException {
  14. BufferedWriter bufferedWriter = null;
  15. File csvFile = null;
  16. // 定义文件名格式并创建
  17. try {
  18. csvFile = File.createTempFile(fileName, ".csv");
  19. bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "UTF-8"),
  20. 1024);
  21. // 写入头部
  22. for (Iterator headIterator = map.entrySet().iterator(); headIterator.hasNext(); ) {
  23. Map.Entry headEntry = (Map.Entry) headIterator.next();
  24. bufferedWriter.write((String) headEntry.getValue() != null ? (String) headEntry.getValue() : "");
  25. if (headIterator.hasNext()) {
  26. bufferedWriter.write(",");
  27. }
  28. }
  29. bufferedWriter.newLine();
  30. Iterator<T> it = dataset.iterator();
  31. while (it.hasNext()) {
  32. T t = (T) it.next();
  33. // 获取类属性
  34. Field[] fields = t.getClass().getDeclaredFields();
  35. String[] csvContent = new String[fields.length];
  36. for (short i = 0; i < fields.length; i++) {
  37. Field field = fields[i];
  38. String fieldName = field.getName();
  39. String fieldType = field.getType().toString();
  40. if ( !isContains(fieldName)&&i == fields.length - 1) {
  41. bufferedWriter.newLine();
  42. }
  43. if (!isContains(fieldName)) {
  44. continue;
  45. }
  46. String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
  47. try {
  48. Class tCls = t.getClass();
  49. Method getMethod = tCls.getMethod(getMethodName, new Class[]{});
  50. Object value = getMethod.invoke(t, new Object[]{});
  51. // 取值并赋给数组
  52. String textvalue = null;
  53. if (value==null){
  54. textvalue = " ";
  55. }else{
  56. if (fieldType.equals("class java.util.Date")) {
  57. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  58. textvalue = sdf.format(value);
  59. }else{
  60. textvalue = value.toString();
  61. }
  62. }
  63. bufferedWriter.write(textvalue);
  64. if (i < fields.length - 1) {
  65. bufferedWriter.write(",");
  66. }
  67. if (i == fields.length - 1) {
  68. bufferedWriter.newLine();
  69. }
  70. } catch (Exception e) {
  71. e.getStackTrace();
  72. }
  73. }
  74. bufferedWriter.flush();
  75. }
  76. } finally {
  77. bufferedWriter.close();
  78. }
  79. byte[] b = new byte[1024];
  80. File fileLoad = new File(csvFile.getCanonicalPath());
  81. response.reset();
  82. response.setContentType("application/csv");
  83. String trueCSVName="PaymentReport_" + DateUtils.getCurrentDateTime() + ".csv";
  84. trueCSVName = new String(trueCSVName.getBytes("GBK"), "ISO8859-1");
  85. response.setHeader("Content-Disposition", "attachment; filename=" + trueCSVName);
  86. FileInputStream in = new FileInputStream(fileLoad);
  87. int len = 0;
  88. byte[] buffer = new byte[1024];
  89. response.setCharacterEncoding("UTF-8");
  90. OutputStream out = response.getOutputStream();
  91. while ((len = in.read(buffer)) > 0) {
  92. out.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});
  93. out.write(buffer, 0, len);
  94. }
  95. in.close();
  96. csvFile.delete();
  97. }
  98. /**
  99. * 下载文件
  100. *
  101. * @param response
  102. * @param csvFilePath 文件路径
  103. * @param fileName 文件名称
  104. */
  105. public static void exportFile(HttpServletResponse response, String csvFilePath, String fileName) {
  106. response.setContentType("application/csv;charset=UTF-8");
  107. InputStream in = null;
  108. try {
  109. response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
  110. in = new FileInputStream(csvFilePath+fileName);
  111. int len = 0;
  112. byte[] buffer = new byte[1024];
  113. response.setCharacterEncoding("UTF-8");
  114. OutputStream out = response.getOutputStream();
  115. while ((len = in.read(buffer)) > 0) {
  116. out.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});
  117. out.write(buffer, 0, len);
  118. }
  119. in.close();
  120. } catch (Exception e) {
  121. e.printStackTrace();
  122. } finally {
  123. if (in != null) {
  124. try {
  125. in.close();
  126. } catch (IOException e) {
  127. throw new RuntimeException();
  128. }
  129. }
  130. }
  131. }
  132. public static LinkedHashMap<String,String> getreportHeaders(){
  133. LinkedHashMap map = new LinkedHashMap();
  134. map.put("1", "日期");
  135. map.put("2", "通证编号");
  136. map.put("3", "签发日期");
  137. map.put("4", "持证方");
  138. map.put("5", "到期悦票金额");
  139. return map;
  140. }
  141. /**
  142. * 判断是否是报表字段
  143. * @param field
  144. * @return
  145. */
  146. public static boolean isContains(String field){
  147. Set reportFields = new HashSet(Arrays.asList("expireDate", "tokenNo","issueDate","toCorpName","amount"));
  148. if (reportFields.contains(field)) {
  149. return true;
  150. }else{
  151. return false;
  152. }
  153. }

}

发表评论

表情:
评论列表 (有 0 条评论,188人围观)

还没有评论,来说两句吧...

相关阅读