`

java生成csv文件并通过浏览器下载

    博客分类:
  • java
 
阅读更多

       最近在电信做业务的时候发现有一个导出csv文件的需求,一般导出使用POI直接导出excel即可,excel2007已经支持最多104.8万条记录,基本可以满足需求,为了尝试下导出csv文件,因此采用了导出csv文件的实现,csv即为逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),可以使用excel直接打开预览。

       下面结合所使用的功能进行说明:

        首先创建一个CsvUtil.java类,包括删除已生成的csv文件、测试代码,代码如下:

public class CsvUtils {

 private static final org.apache.commons.logging.Log LOG = LogFactory
   .getLog(CsvUtils.class);

 /**
  * 生成为CVS文件
  *
  * @param exportData
  *            源数据List
  * @param map
  *            csv文件的列表头map
  * @param outPutPath
  *            文件路径
  * @param fileName
  *            文件名称
  * @return
  */
 @SuppressWarnings("rawtypes")
 public static File createCSVFile(List exportData, LinkedHashMap map,
   String outPutPath, String fileName) {
  File csvFile = null;
  BufferedWriter csvFileOutputStream = null;
  try {
   File file = new File(outPutPath);
   if (!file.exists()) {
    file.mkdir();
   }
   // 定义文件名格式并创建
   csvFile = File.createTempFile(fileName, ".csv",
     new File(outPutPath));
   LOG.debug("csvFile:" + csvFile);
   // UTF-8使正确读取分隔符","
   csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(
     new FileOutputStream(csvFile), "GBK"), 1024);
   LOG.debug("csvFileOutputStream:" + csvFileOutputStream);
   // 写入文件头部
   for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator
     .hasNext();) {
    java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator
      .next();
    csvFileOutputStream
      .write("" + (String) propertyEntry.getValue() != null ? (String) propertyEntry
        .getValue() : "" + "");
    if (propertyIterator.hasNext()) {
     csvFileOutputStream.write(",");
    }
   }
   csvFileOutputStream.newLine();
   // 写入文件内容
   for (Iterator iterator = exportData.iterator(); iterator.hasNext();) {
    Object row = (Object) iterator.next();
    for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator
      .hasNext();) {
     java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator
       .next();
     csvFileOutputStream.write((String) BeanUtils.getProperty(
       row, (String) propertyEntry.getKey()));
     if (propertyIterator.hasNext()) {
      csvFileOutputStream.write(",");
     }
    }
    if (iterator.hasNext()) {
     csvFileOutputStream.newLine();
    }
   }
   csvFileOutputStream.flush();
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    csvFileOutputStream.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  return csvFile;
 }

 /**
  * 下载文件
  *
  * @param response
  * @param csvFilePath
  *            文件路径
  * @param fileName
  *            文件名称
  * @throws IOException
  */
 public static void exportFile(HttpServletResponse response,
   String csvFilePath, String fileName) throws IOException {
//  response.setHeader("Content-type", "application-download");

  FileInputStream in = null;
  OutputStream out = response.getOutputStream();
  byte[] buffer = new byte[1024];
  int len = 0;
  response.setContentType("text/csv;charset=UTF-8");
  response.setHeader("Content-Disposition", "attachment;filename="
    + URLEncoder.encode(fileName, "UTF-8"));
  response.setCharacterEncoding("UTF-8");
  try {
   in = new FileInputStream(csvFilePath);
   while ((len = in.read(buffer)) > 0) {
    out.write(buffer, 0, len);
   }
   out.flush();
  } catch (FileNotFoundException e) {
   LOG.error("获取文件错误!");
  } finally {
   if (in != null) {
    try {
     in.close();
     out.close();
    } catch (Exception e) {
     throw new RuntimeException(e);
    }
   }
  }
 }

 /**
  * 导出
  *
  * @param response
  * @param fileName
  * @return
  * @throws IOException
  */
 public static void downloadFile(HttpServletRequest request,
   HttpServletResponse response, String uri) throws IOException {
  // 获取服务其上的文件名称
  File file = new File(uri);
  String name = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
    + ".zip";
  StringBuffer sb = new StringBuffer();
  sb.append("attachment;  filename=").append(name);
  response.setHeader("Expires", "0");
  response.setHeader("Cache-Control",
    "must-revalidate, post-check=0, pre-check=0");
  response.setHeader("Pragma", "public");
  response.setContentType("application/x-msdownload;charset=UTF-8");
  response.setHeader("Content-Disposition", new String(sb.toString()
    .getBytes(), "ISO8859-1"));

  // 将此文件流写入到response输出流中
  FileInputStream inputStream = new FileInputStream(file);
  OutputStream outputStream = response.getOutputStream();
  byte[] buffer = new byte[1024];
  int i = -1;
  while ((i = inputStream.read(buffer)) != -1) {
   outputStream.write(buffer, 0, i);
  }
  outputStream.flush();
  outputStream.close();
  inputStream.close();
 }

 /**
  * 删除该目录filePath下的所有文件
  *
  * @param filePath
  *            文件目录路径
  */
 public static void deleteFiles(String filePath) {
  File file = new File(filePath);
  if (file.exists()) {
   File[] files = file.listFiles();
   for (int i = 0; i < files.length; i++) {
    if (files[i].isFile()) {
     files[i].delete();
    }
   }
  }
 }

 /**
  * 删除单个文件
  *
  * @param filePath
  *            文件目录路径
  * @param fileName
  *            文件名称
  */
 public static void deleteFile(String filePath, String fileName) {
  File file = new File(filePath);
  if (file.exists()) {
   File[] files = file.listFiles();
   for (int i = 0; i < files.length; i++) {
    if (files[i].isFile()) {
     if (files[i].getName().equals(fileName)) {
      files[i].delete();
      return;
     }
    }
   }
  }
 }

 

/**
  * 下载csv文件
  * @param path
  * @param response
  */
 private void download(String path, HttpServletResponse response) {
  try {
   // path是指欲下载的文件的路径。
   File file = new File(path);
   // 取得文件名。
   String filename = file.getName();
   // 以流的形式下载文件。
   InputStream fis = new BufferedInputStream(new FileInputStream(path));
   byte[] buffer = new byte[fis.available()];
   fis.read(buffer);
   fis.close();
   // 清空response
   response.reset();
   // 设置response的Header
   response.addHeader("Content-Disposition", "attachment;filename="
     + new String(filename.getBytes()));
   response.addHeader("Content-Length", "" + file.length());
   OutputStream toClient = new BufferedOutputStream(
     response.getOutputStream());
   response.setContentType("application/vnd.ms-excel;charset=gb2312");
   toClient.write(buffer);
   toClient.flush();
   toClient.close();
  } catch (IOException ex) {
   ex.printStackTrace();
  }
 }

 

 /**
  * 测试数据
  *
  * @param args
  */
 @SuppressWarnings({ "rawtypes", "unchecked" })
 public static void main(String[] args) {
  List exportData = new ArrayList<Map>();
  Map row1 = new LinkedHashMap<String, String>();
  row1 = new LinkedHashMap<String, String>();
  row1.put("1", "11");
  row1.put("2", "12");
  row1.put("3", "13");
  row1.put("4", "14");
  exportData.add(row1);
  row1.put("1", "11");
  row1.put("2", "12");
  row1.put("3", "13");
  row1.put("4", "14");
  exportData.add(row1);
  LinkedHashMap map = new LinkedHashMap();
  map.put("1", "第一列");
  map.put("2", "第二列");
  map.put("3", "第三列");
  map.put("4", "第四列");

  String path = "E:/export/";
  String fileName = "文件导出";
  File file = CsvUtils.createCSVFile(exportData, map, path, fileName);
  String fileName2 = file.getName();
  LOG.debug("文件名称:" + fileName2);
 }

}

         由于在main方法中不能直接调用下载的方法,因此单独创建一个类来完成相关功能,创建类ExportCsvController.java,代码如下

public class ExportCsvController {

 @Autowired
 AccessDetailExportService accessDetailExportService;

 private static final Log LOG = LogFactory.getLog(ExportCsvController.class);

 @RequestMapping(value = "/exportHistory")
 @SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })
 public void exportHistory(HttpServletRequest request,
   HttpServletResponse response, AccessDetailBean accessDetailBean)
   throws IOException {

  HttpSession session = request.getSession();
  UserBean userBean = (UserBean) session.getAttribute("userbean");

  if (!CommonUtil.isAdmin(userBean)) {
   if (userBean == null) {
    throw new RuntimeException("登陆失效,请重新登陆");
   }
   accessDetailBean.setUsername(userBean.getName());
  }
  LOG.debug("-----访问历史监控导出开始-----");
  String realPath = request.getRealPath("/WEB-INF/export"); // 获取绝对路径

   String path = realPath.replace("\\", "/");

  String fileName = "history_"; // 定义文件名称

  List exportData = new ArrayList<Map>();

  Map row = new LinkedHashMap<String, String>();

  LinkedHashMap map = new LinkedHashMap();
  map.put("1", "用户");
  map.put("2", "访问时间");
  map.put("3", "ip");
  map.put("4", "访问的服务");
  map.put("5", "消耗时间(毫秒)");
  map.put("6", "状态");
  map.put("7", "长度");

  int count = accessDetailExportService
    .queryHistoryCount(accessDetailBean);
  LOG.debug("访问历史监控总条数:" + count);

  if (count <= 100000) { // 如果查询总数大于10万条,不予导出
   // 查询访问历史记录
   List<AccessDetailBean> detailList = accessDetailExportService
     .queryHistoryInfo(accessDetailBean);
   LOG.debug("-----访问历史监控数据条数-----" + detailList.size());
   for (AccessDetailBean detail : detailList) { // 执行导出操作
    row = new LinkedHashMap<String, String>();
    row.put("1", detail.getUsername()); // 用户名
    row.put("2", dateConvert(detail.getAccesstime())); // 访问时间
    row.put("3", detail.getClientip()); // 访问ip
    row.put("4", detail.getService()); // 访问的服务
    row.put("5", detail.getCosttime()); // 消耗时间
    row.put("6", statusConvert(detail.getStatus())); // 状态
    row.put("7", detail.getLength()); // 长度
    exportData.add(row);
   }
   File file = CsvUtils.createCSVFile(exportData, map, realPath,
     fileName);
   String fileName2 = file.getName();
   LOG.debug("文件名称:" + fileName2);
   this.download(path + "/" + fileName2, response);
  } else { // 大于10万条不予导出
   CommonUtil.writeResult(response, "记录条数大于10万,导出失败,请添加条件过滤后重试!");
  }
  LOG.debug("-----访问历史监控导出结束-----");
 }

 @RequestMapping(value = "/exportSummary")
 @SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })
 public void exportSummary(HttpServletRequest request,
   HttpServletResponse response,
   AccessDetailSummaryBean accessDetailSummaryBean) throws IOException {

  HttpSession session = request.getSession();
  UserBean userBean = (UserBean) session.getAttribute("userbean");

  if (!CommonUtil.isAdmin(userBean)) {
   if (userBean == null) {
    throw new RuntimeException("登陆失效,请重新登陆");
   }
  }

  LOG.debug("-----访问历史监控导出开始-----");
  String realPath = request.getRealPath("/WEB-INF/export"); // 获取绝对路径
  
  String path = realPath.replace("\\", "/");

  String fileName = "summary_"; // 定义文件名称

  List exportData = new ArrayList<Map>();

  Map row = new LinkedHashMap<String, String>();

  LinkedHashMap map = new LinkedHashMap();
  map.put("1", "访问者");
  map.put("2", "访问的服务");
  map.put("3", "ip");
  map.put("4", "访问key次数");
  map.put("5", "获取数据次数");
  map.put("6", "获取数据成功次数");
  map.put("7", "获取数据失败次数");
  map.put("8", "总次数");
  map.put("9", "数据大小");

  int count = accessDetailExportService
    .querySummaryCount(accessDetailSummaryBean);
  LOG.debug("访问历史统计记录总条数:" + count);

  if (count <= 100000) { // 如果查询总数大于10万条,不予导出
   // 查询访问历史记录
   List<AccessDetailSummaryBean> summaryList = accessDetailExportService
     .querySummaryInfo(accessDetailSummaryBean);
   LOG.debug("-----访问历史监控数据条数-----" + summaryList.size());
   for (AccessDetailSummaryBean summary : summaryList) { // 执行导出操作
    row = new LinkedHashMap<String, String>();
    row.put("1", summary.getVisitor()); // 访问者
    row.put("2", summary.getVisitedServer()); // 访问的服务
    row.put("3", summary.getClientIp()); // ip
    row.put("4", summary.getVisitKeyTime()); // 访问key次数
    row.put("5", summary.getGainDataTime()); // 获取数据次数
    row.put("6", summary.getSuccessTime()); // 获取数据成功次数
    row.put("7", summary.getFailTime()); // 获取数据失败次数
    row.put("8", summary.getSumTime()); // 总次数
    row.put("9", summary.getDataVolume()); // 数据大小
    exportData.add(row);
   }
   File file = CsvUtils.createCSVFile(exportData, map, path, fileName);
   String fileName2 = file.getName();
   LOG.debug("文件名称:" + fileName2);
   this.download(path + "/" + fileName2, response);
  } else { // 大于10万条不予导出
   CommonUtil.writeResult(response, "记录条数大于10万,导出失败,请添加条件过滤后重试!");
  }
  LOG.debug("-----访问历史监控导出结束-----");
 }

 /**
  * 成功失败状态转换
  *
  * @param status
  * @return
  */
 public String statusConvert(Integer status) {
  String flag = null;
  if (status == 0) {
   flag = "成功";
  } else {
   flag = "失败";
  }
  return flag;
 }

 /**
  * 日期格式转换
  *
  * @param date
  * @return
  */
 public String dateConvert(long date) {
  // 设置日期格式
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  // 转为日期格式
  Date newDate = new Date(date);
  // 最终日期
  String finalDate = sdf.format(newDate);
  return finalDate;
 }

 /**
  * 下载csv文件
  * @param path
  * @param response
  */
 private void download(String path, HttpServletResponse response) {
  try {
   // path是指欲下载的文件的路径。
   File file = new File(path);
   // 取得文件名。
   String filename = file.getName();
   // 以流的形式下载文件。
   InputStream fis = new BufferedInputStream(new FileInputStream(path));
   byte[] buffer = new byte[fis.available()];
   fis.read(buffer);
   fis.close();
   // 清空response
   response.reset();
   // 设置response的Header
   response.addHeader("Content-Disposition", "attachment;filename="
     + new String(filename.getBytes()));
   response.addHeader("Content-Length", "" + file.length());
   OutputStream toClient = new BufferedOutputStream(
     response.getOutputStream());
   response.setContentType("application/vnd.ms-excel;charset=gb2312");
   toClient.write(buffer);
   toClient.flush();
   toClient.close();
  } catch (IOException ex) {
   ex.printStackTrace();
  }
 }

 

对于页面可以直接通过jsp+JavaScript来完成:

<a href="javascript:void(0);" class="easyui-linkbutton"
      data-options="iconCls:'icon-save',plain:false"
      onclick="exportHistory();">导出</a>

 

/**导出访问历史记录*/
 function exportHistory() {
  var username = $('#username').val();
  var accesstimeStart=$('#accesstimeStart').datebox('getValue');
  var accesstimeEnd=$('#accesstimeEnd').datebox('getValue');
  var clientip = $('#clientip').val();
  var service = $('#service').val();
  var status = $('#status').val();
  var costtimeStart = $('#costtimeStart').val();
  var costtimeEnd = $('#costtimeEnd').val();
  window.location.href = $("#proPath").val() + "/export/exportHistory?username=" + username + "&accesstimeStart=" + accesstimeStart +
  "&accesstimeEnd=" + accesstimeEnd + "&clientip=" + clientip + "&service=" + service + "&costtimeStart=" +costtimeStart
  + "&costtimeEnd" + costtimeEnd;
 }

至此一个导出并下载csv文件的功能即实现了。

 

 

1
0
分享到:
评论

相关推荐

    java 浏览器导出csv文件

    2.生成csv,中文无乱码,数据不会科学计数法; 3.支持大数据下载; 4.后台服务java语言实现,前端不限制; 5.前端代码: [removed]void(0)" class="layui-btn"&gt; &lt;i class="fa fa-refresh"&gt;&nbsp;导出Excel ...

    java导出csv文件并压缩(含下载提示功能)

    首先,我们需要了解如何在Java中生成CSV文件。CSV文件主要由一系列行组成,每行包含一个或多个以逗号分隔的值。在Java中,我们可以使用`BufferedWriter`或者`PrintWriter`来创建和写入这些文件。例如: ```java ...

    Java生成CSV文件实例详解

    下面将详细解释如何使用Java生成CSV文件,以`CSVUtils`类为例进行说明。 首先,`CSVUtils`类通常包含用于生成CSV文件的核心方法。在给出的代码中,`createCSVFile`方法是生成CSV文件的主要入口。该方法接收四个参数...

    java导出CSV文件,EXCEL文件(不用指定下载路劲)

    在Java编程中,导出CSV(Comma Separated Values)和Excel...总之,Java提供了丰富的库来处理CSV和Excel文件,通过适当的方法,可以轻松地实现在服务器端生成文件并直接下载到客户端,而无需在服务器上保存临时文件。

    java导出生成csv文件的方法

    Java生成CSV文件的核心在于将数据逐行写入文件,每行数据由字段值(通过反射获取)组成,并以逗号分隔。通过使用`OutputStreamWriter`和`FileOutputStream`,我们可以控制文件的编码和输出。这个过程不仅高效,而且...

    Java 导出CSV

    - **灵活性**:Java可以灵活地控制文件的生成过程,例如自定义分隔符、编码、换行符等。 - **可扩展性**:Java代码可以轻松处理大量数据,适合批处理任务。 - **跨平台兼容**:CSV文件在任何操作系统上都能正确...

    Java使用poi jar包读取以及web下载excle文件

    本教程将详细介绍如何使用POI库在Java中读取Excel文件,并通过Web服务器提供给用户下载。 首先,我们需要在项目中引入Apache POI的jar包。你可以通过Maven或Gradle来管理依赖。如果是Maven,可以在pom.xml文件中...

    CSV文件操作

    - 导出数据:从数据库查询结果生成CSV文件,通常涉及遍历查询结果集,然后逐行写入CSV文件。 4. **Servlet实现CSV文件导出**: - 创建HTTP响应:使用Servlet响应对象设置正确的MIME类型(如`text/csv`)和文件...

    PageOffice Java开发 实现Word文件的批量生成

    4. **文件保存与输出**:生成每个文档后,需要将其保存到本地或者服务器的指定位置,或者直接以流的形式发送给客户端下载。PageOffice提供了丰富的文件操作接口,可以方便地完成这一步。 5. **优化性能**:在处理...

    java生成FLASH图表

    - **安装**:首先,你需要下载并安装FusionCharts的Java库,将其添加到项目类路径中。 - **集成**:然后,通过Java代码导入必要的包,初始化FusionCharts对象,并设置图表的属性,如标题、数据源、图例等。 - **...

    一个用servlet实现导出csv文件的实例

    在这个实例中,我们将探讨如何使用Servlet来生成CSV(Comma Separated Values)文件,这是一种常见的数据交换格式,广泛应用于数据导入和导出操作。CSV文件易于读取,支持多种应用程序,如电子表格软件。 首先,...

    获取浏览器上网记录并生成文本

    通过编写Java程序,连接到Chrome的浏览历史数据库,提取数据,然后将其写入文本文件,可以实现“获取浏览器上网记录并生成文本”的目标。在实际应用中,还应考虑到隐私保护和合规性,确保数据的安全使用。

    React获取Java后台文件流并下载Excel文件流程解析

    React获取Java后台文件流并下载Excel文件流程解析是指在React前端应用程序中,通过axios库发送POST请求到Java后台服务器,以获取Excel文件流,并将其下载到本地计算机中。该过程涉及到Java后台服务器的响应头设置、...

    jasperreport 生成pdf实现下载与打印

    标题中的“jasperreport生成pdf实现下载与打印”是指使用JasperReports库来创建PDF报告,并提供下载和打印功能。JasperReports是一个开源的Java报表工具,它允许开发者设计、生成和导出各种类型的报表,包括PDF、...

    struts2文件上传下载

    例如,可以使用Apache POI库来生成Excel文件,或者使用OpenCSV库来生成CSV文件。生成文件后,可以调用上面提到的下载方法来提供下载。 总的来说,"struts2文件上传下载"涵盖了Web开发中的基础功能,对于任何需要...

    利用JAVA操作EXCEL文件

    在描述中提到,通常在Web应用中,通过创建CSV文件并以MIME类型返回给浏览器来间接访问Excel文件,但这并不允许对Excel进行直接操作。文章介绍了一个名为Java Excel API的开源项目,它使得Java开发者能够方便地处理...

    Struts2文件动态上传和动态下载(可自动生成下载内容)

    - **动态生成下载内容**:不同于传统的文件下载,这里的“动态生成”意味着文件内容可能不是预先存在的,而是根据某些条件在服务器端即时生成的,比如从数据库中提取数据,组合成Excel或CSV格式供用户下载。...

    grails导出csv

    使用Grails的`response`对象,设置合适的HTTP头信息,指示浏览器下载文件。然后,使用`response.outputStream`写入CSV内容。例如: ```groovy response.contentType = "text/csv" response.setHeader("Content-...

    java读写文件

    例如,服务器端可能需要生成HTML、JSON或CSV文件并提供给客户端下载。这通常通过HTTP响应头的控制实现,比如设置`Content-Disposition`为`attachment`来触发浏览器的下载行为。 另外,`java.nio`包提供了更高级的...

    使用Ajax生成的Excel文件并下载的实例

    这个Action接收文件名作为参数,并返回一个`FilePathResult`,指示浏览器下载指定路径的文件。同时,我们使用自定义的`DeleteFileAttribute`过滤器确保文件在下载完成后被删除。 ```csharp [HttpGet] ...

Global site tag (gtag.js) - Google Analytics