首先要直达csv文件其实就是以逗号分隔的文本文件;
那么我们要导出指定java对象的数据的时候该怎么样生成文件发送到指定邮箱或者是通过浏览器导出到本地;
首先是文件的创建,方法如下:
//其中exportData参数表示的为要导出的数据对象集合,大多数情况来自数据库的查询
//outPutPath参数表示你要导出的文件路径
//fileName参数表示你要生成的csv文件的名字
public static File createCSVFile(List<CustomerReportingModel> exportData, String outPutPath, String fileName) { File csvFile = null; BufferedWriter csvFileOutputStream = null; try { File file = new File(outPutPath); if (!file.exists()) { file.mkdir(); } //定义文件名格式并创建 csvFile = new File(outPutPath,fileName+".csv"); System.out.println("csvFile:" + csvFile); // UTF-8使正确读取分隔符"," csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream( csvFile), "GBK"), 102400); System.out.println("csvFileOutputStream:" + csvFileOutputStream); // 写入文件头部 List<String> titleList = new ArrayList<>(); titleList.add("报备客户来源"); //导出文件第一行对应的名称 titleList.add("报备客户总数"); //导出文件第一行对应的名称 writerLine(csvFileOutputStream, titleList); csvFileOutputStream.append("\r\n"); // 写入文件内容 long numberForCam = 0; for (CustomerReportingModel customerReportingModel : exportData) { //customerReportingModel为导出的java对象 numberForCam++; List<String> csvLine = getCsvLine(customerReportingModel); writerLine(csvFileOutputStream, csvLine); csvFileOutputStream.append("\r\n"); if (numberForCam % 10000 == 0) { csvFileOutputStream.flush(); //防止内存溢出 } } csvFileOutputStream.flush(); //刷出数据到文件中 } catch (Exception e) { LOG.info("文件内容写入错误", e); } finally { try { if(csvFileOutputStream!=null){ csvFileOutputStream.close();} } catch (IOException e) { e.printStackTrace(); LOG.info("文件关闭错误", e); } } return csvFile; }
//上述静态方法用来生成csv文件
//writerLine方法用于对已有文件追加一行数据;
//bw参数表示写入文件的缓存区
//csvLine参数表示java对象属性对应的集合
private static void writerLine(BufferedWriter bw, List<String> csvLine) throws IOException { for (int i = 0; i < csvLine.size(); i++) { String line = csvLine.get(i); if (line == null) { line = ""; } bw.append(line).append(",");//通过,来分割不同的列显示 } } //将java对象中要导出的属性列生成一个list集合用于生成文件导出//返回java对象生成的属性列集合 private static List<String> getCsvLine(CustomerReportingModel crm) { //保存数据的对象 List<String> csvLine = new ArrayList(); csvLine.add(crm.getSource()); //要导出的对象属性列 csvLine.add(crm.getTotalNumber()==null?"0":crm.getTotalNumber().toString());//要导出的对象属性列,并设置默认值 return csvLine; }到此你的csv文件就生成完成了,如果你的outPutPath为本地,则通过数据库查询数据集合并将数据集和文件路径和文件名传递给上述方法即可在本地生成csv文件;如果需要浏览器下载到本地,则通过下载请求去后台获取数据集合并将数据写入csv文件,返回给响应,则会默认下载到浏览器的默认下载地址;对于浏览器地址栏下载的设置如下:将outPutPath改为: HttpServletResponse response;并将文件写入请求头中,具体的设置如下;
response.setContentType("application/csv;charset=GBK"); response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8")); PrintWriter out = response.getWriter(); BufferedWriter bw = new BufferedWriter(out);接下来将数据集合遍历写入方法同上面给出的方法// 写入文件头部
。。。。。之后就会将生成的csv文件下载到浏览器的默认路径了。
对于将java对象中要导出的属性值生成集合再导出,效率并不高,可以直接覆盖对象的toString方法来提高效率;
不过在这里就不做实现了。
好了,csv文件的生成和导出已经完成了,有问题的可以留言提问,谢谢。