Java导出CSV文件的方法

本文实例为大家分享了Java导出CSV文件的具体代码,供大家参考,具体内容如下

Java导出csv文件:

控制层:

@Controller
@RequestMapping("/historyReport/")
public class HistoryStockReportController {
  private static final Logger LOGGER = LoggerFactory.getLogger(HistoryStockReportController.class);

  @Autowired
  private HistoryStockReportService historyStockReportService;

 /**
   * 下载历史库存报表
   * @param request
   * @param response
   */
  @RequestMapping("new/downLoadHistoryStockInfo.htm")
  @ResponseBody
  public ResultMsg<Map<String, Object>> downLoadHistoryStockInfo(HttpServletRequest request,
      HttpServletResponse response) {
    String reportName = "PP视频_历史库存效果概况数据_" + DateUtils.getCurrentDateStr("yyyyMMddHHmmss");
    String[] header = Constant.PP_INDEX_DETAIL_HEAD_NAME_LIST;
    try {
      //点位/终端
      String pointLocation = request.getParameter(Constant.POINT_LOCATION_CODE);
      //广告位
      String positionScreenType = request.getParameter(Constant.POSITION_SCREEN_TYPE_CODE);
      String startDate = request.getParameter(Constant.START_DATE);
      String endDate = request.getParameter(Constant.END_DATE);
      // 判断接口参数
      if (!DateUtils.isDate(startDate) || !DateUtils.isDate(endDate)) {
        return ResultMsg.buildErrorMsg(Constant.DATE_ERROR_MSG);
      }
      //封装查询参数
      Map<String, Object> condition = new HashMap<>();
      condition.put(Constant.POINT_LOCATION_CODE, pointLocation);
      condition.put(Constant.POSITION_SCREEN_TYPE_CODE, positionScreenType);
      condition.put(Constant.START_DATE, startDate);
      condition.put(Constant.END_DATE, endDate);
      //导出csv
      exportBatch(response, condition, header, reportName);
    } catch (Exception e) {
      LOGGER.error("导出" + reportName + "发生错误:", e);
    }
    return null;
  }

/**
   * 导出报表
   * @param response
   * @param header
   * @param fileName
   * @throws IOException
   */
  private void exportBatch(HttpServletResponse response, Map<String, Object> condition, String[] header,
      String fileName) throws IOException {
    response.setContentType("application/vnd.ms-excel;charset=GBK");
    response.setHeader("Content-Disposition",
        "attachment;filename=" + new String((fileName).getBytes("GBK"), "ISO8859-1") + "." + "csv");
    StringBuilder sb = new StringBuilder();
    for (String s : header) {
      sb.append(s);
    }
    sb.append("\n");
    PrintWriter out = null;
    try {
      out = response.getWriter();
      out.print(sb.toString());
      int pageNumber = Constant.PAGE_NO;
      int pageSize = Constant.PAGE_SIZE;
      int dataLength = pageSize;
      while (dataLength == pageSize) {
        int startIndex = (pageNumber - 1) * pageSize;
        condition.put("startIndex", startIndex);
        condition.put("maxCount", pageSize);
        List<Map<String, Object>> resultList = historyStockReportService
            .queryDownLoadHistoryStockInfo(condition);
        dataLength = resultList.size();
        String[] columns = Constant.PP_DETAIL_COLUMN.split(",");
        for (int i = 0; i < dataLength; i++) {
          out.print(ExportUtils.handleExportData(resultList.get(i), columns));
        }
        out.flush();
        pageNumber++;
      }
    } catch (IOException e) {
      LOGGER.error("导出" + fileName + "发生错误:", e);
    } finally {
      if (out != null) {
        out.close();
      }
    }
  }
}

备注:这里查询list集合数据是按照分页查询,pageNo=1,pageSize=1000,这样支持大数据量导出,比如导出10万条数据,分页查询是为了防止把库查询挂了,数据量过大会发生导出OOM

业务层:

@Service
public class HistoryStockReportServiceImpl extends BaseImpl implements HistoryStockReportService {
  private static final Logger LOGGER = LoggerFactory.getLogger(HistoryStockReportServiceImpl.class);
  //定义数据库查询字段
  private String[] columnArray = Constant.CHECK_PP_INDEX_COLUMN.split(",");
  @Autowired
  private DalClient dalClient;

/**
   * 下载历史库存报表
   * @param condition
   * @return
   */
  public List<Map<String, Object>> queryDownLoadHistoryStockInfo(Map<String, Object> condition) {
    List<Map<String, Object>> resultList = dalClient
        .queryForList("historyStockData.queryDownLoadHistoryStockInfo", condition);
    if (!CollectionUtil.isEmptyList(resultList)) {
      IndexDataFormatUtils.coverPpInfo(resultList, columnArray);
    }
    return resultList;
  }
}

查询集合处理工具类:IndexDataFormatUtils

public class IndexDataFormatUtils {

  /**
   * 统一处理PP视频历史库存、特殊渠道指标报表的衍生指标数据
   * @param list
   * @param columnArray
   */
  public static void coverPpInfo(List<Map<String, Object>> list, String[] columnArray) {
    for (Map<String, Object> map : list) {
      // 组装处理rate参数
      calculateRate(map, Constant.FEE_PRACTICAL_SHOW_NUM, Constant.THEORY_STOCK_NUM, Constant.FILLFEE_RATE);
      calculateRate(map, Constant.DELIVERY_PRACTICAL_SHOW_NUM, Constant.THEORY_STOCK_NUM,
          Constant.DELIVERY_FILL_RATE);
      calculateRate(map, Constant.SHOW_NUM, Constant.THEORY_STOCK_NUM, Constant.THEORY_STOCK_RATE);
      calculateRate(map, Constant.THEORY_STOCK_REMAINED_NUM, Constant.THEORY_STOCK_NUM,
          Constant.THEORY_STOCK_REMAINED_RATE);
      // 处理数据值为null的单一指标
      coverIndexInfoFromNull(map, columnArray);
    }
  }

   /**
   * 处理占比参数
   *
   * @param map
   * @param dividendKey
   * @param divisorKey
   * @param quotientKey
   */
  public static void calculateRate(Map<String, Object> map, String dividendKey, String divisorKey, String quotientKey) {
    if (StringUtils.isBlank(MapUtils.getString(map,dividendKey)) || StringUtils.isBlank(MapUtils.getString(map,divisorKey))) {
      map.put(quotientKey,"-");
      return;
    }
    BigDecimal dividend = BigDecimal.valueOf(MapUtils.getDoubleValue(map, dividendKey));  // 被除数
    BigDecimal divisor = BigDecimal.valueOf(MapUtils.getDoubleValue(map, divisorKey));   // 除数
    BigDecimal quotient = BigDecimal.valueOf(0.00);
    // =0 相等 >0前者大于后者 ,反之 <0 前者小于后者
    if(dividend.compareTo(BigDecimal.ZERO) != 0 && divisor.compareTo(BigDecimal.ZERO) != 0){
      quotient = dividend.multiply(BigDecimal.valueOf(100)).divide(divisor,2,BigDecimal.ROUND_HALF_UP);
    }
    map.put(quotientKey, quotient.setScale(2) + "");
  }

  /**
   * 处理数据值为null的单一指标
   * @param map
   * @param columnArray
   */
  public static void coverIndexInfoFromNull(Map<String, Object> map, String[] columnArray) {
    for (String columnName : columnArray) {
      String columnValue = MapUtils.getString(map,columnName);
      if (StringUtils.isBlank(columnValue)) {
        map.put(columnName,"-");
      }else {
        map.put(columnName,columnValue);
      }
    }
  }

}

导出数据处理工具类:ExportUtils

public class ExportUtils {

  /**
   * 处理下载指标
   *
   */
  public static String handleExportData(Map<String,Object> reportData, String[] columns){
    StringBuilder sb = new StringBuilder();
    for (String columnName:columns) {
      addStringBuffer(sb,reportData,columnName);
    }
    sb.append("\n");
    return sb.toString();
  }

  public static void addStringBuffer(StringBuilder sb, Map<String, Object> map,String name){
    if(map.get(name) == null ){
      sb.append("-,");
    }else{
      String value = String.valueOf(map.get(name));
      String temp = value.replaceAll("\r", "").replaceAll("\n", "");
      if(temp.contains(",")){
        if(temp.contains("\"")){
          temp=temp.replace("\"", "\"\"");
        }
        //将逗号转义
        temp="\""+temp+"\"";
      }
      sb.append("\t").append(temp).append(",");
    }
  }

}

常量类:

//导出默认分页
public static final int PAGE_NO = 1;
public static final int PAGE_SIZE = 1000;

 /**
 * PP视频
 * 历史存储、特殊渠道数据库查询字段
 */
public static final String CHECK_PP_INDEX_COLUMN =
      "requestNum,advertiserVvNum,responseNum,showNum,clickNum,theoryStockNum,fillFeeNum,"
          + "feePracticalShowNum,deliveryFillNum,deliveryPracticalShowNum,theoryStockRemainedNum,"
          + "systemExceptionLost,userExitLost,income";

 /**
   * 20190509
   * pp视频历史库存、特殊渠道日志数据报表
   * 报表下载模板头部(英文)
   */
  public static final String PP_DETAIL_COLUMN = "countDate,pointLocationCode,pointLocationName,positionScreenTypeCode,positionScreenTypeName," +
      "requestNum,advertiserVvNum,responseNum,showNum,clickNum,theoryStockNum,fillFeeNum,feePracticalShowNum,deliveryFillNum," +
      "deliveryPracticalShowNum,theoryStockRemainedNum,systemExceptionLost,userExitLost,income,fillFeeRate,deliveryFillRate," +
      "theoryStockRate,theoryStockRemainedRate";

/**
 * pp视频历史库存日志数据报表
 * 报表下载模板头部(中文)
 */
public static final String[] PP_INDEX_DETAIL_HEAD_NAME_LIST = {"统计时间,","点位/终端编码,","点位/终端名称,","广告位编码,", "广告位名称,",
      "请求量,", "广告vv量,","返回量,","曝光量,", "点击量,", "理论库存量,", "付费填充量,", "付费实际曝光量,", "配送填充量,",
      "配送实际曝光量,", "理论库存余量,", "系统异常损失,", "用户退出损失,","收入,", "付费使用率,", "配送使用率,", "库存使用率,",
      "库存余量占比,"};

导出效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 应用Java泛型和反射导出CSV文件的方法

    本文实例讲述了应用Java泛型和反射导出CSV文件的方法.分享给大家供大家参考.具体如下: 项目中有需求要把数据导出为CSV文件,因为不同的类有不同的属性,为了代码简单,应用Java的泛型和反射,写了一个函数,完成导出功能. 复制代码 代码如下: public <T> void saveFile(List<T> list, String outFile) throws IOException {         if (list == null || list.isEmpty())

  • java导出csv方法实现讲解

    首先,通过ibatis中的sql语句查询出所要得到的记录,并将其存放在List中: 复制代码 代码如下: List<?> results = this.reportService.getArrayBeanReportDataSource(super.getQuery_sql_csv(), query_obj); 这样的情况下,因为我们是要写公共方法,所以使用?而没有使用一个确定的类型来标注. 所以才需要使用反射从List里取出的对象的属性值. 复制代码 代码如下: String[] Colum

  • JAVA导出CSV文件实例教程

    以前导出总是用POI导出为Excel文件,后来当我了解到CSV以后,我发现速度飞快. 如果导出的数据不要求格式.样式.公式等等,建议最好导成CSV文件,因为真的很快. 虽然我们可以用Java再带的文件相关的类去操作以生成一个CSV文件,但事实上有好多第三方类库也提供了类似的功能. 这里我们使用apache提供的commons-csv组件 Commons CSV 文档在这里 http://commons.apache.org/ http://commons.apache.org/proper/co

  • java实现CSV文件导入与导出功能

    年前在开发功能模块的时候用到了CSV文件导入导出,就此整理一下,便于大家参考. 导入导出功能很多时候用到的都是Excel文件,但是现在越来越多的使用了CSV文件进行此操作,它是一个纯文本文件,可以用记事本打开,也可以用Excel打开.CSV文件不像Excel那样有很多条条框框,它使用硬回车分割每条记录,用逗号分隔每条数据的字段. CSV格式的文件就是用硬回车和文本都好实现的表格,用Excel一读就成了表格.文件名后缀就是 .csv. 直接上代码吧! 导入部分 导入的时候基于Ajax请求,js代码

  • java生成csv文件乱码的解决方法示例 java导出csv乱码

    复制代码 代码如下: import java.io.File;import java.io.IOException;import java.util.List; import com.google.common.base.Charsets;import com.google.common.base.Joiner;import com.google.common.base.Preconditions;import com.google.common.collect.Lists;import com

  • java导出生成csv文件的方法

    首先我们需要对csv文件有基础的认识,csv文件类似excel,可以使用excel打开,但是csv文件的本质是逗号分隔的,对比如下图: txt中显示: 修改文件后缀为csv后显示如下: 在java中我们一般使用poi操作excel,导入,导出都可以,但是poi很消耗内存,尤其在导出时,这个时候我们其实可以选择导出生成csv文件,因为其跟文本差不多,所以效率很高. 简单写了一个实现类,代码如下: /** * * 导出生成csv格式的文件 * @author ccg * @param titles

  • java导出csv格式文件的方法

    本文实例为大家分享了java导出csv格式文件的具体代码,供大家参考,具体内容如下 导出csv格式文件的本质是导出以逗号为分隔的文本数据 import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException

  • Java导出CSV文件的方法

    本文实例为大家分享了Java导出CSV文件的具体代码,供大家参考,具体内容如下 Java导出csv文件: 控制层: @Controller @RequestMapping("/historyReport/") public class HistoryStockReportController { private static final Logger LOGGER = LoggerFactory.getLogger(HistoryStockReportController.class)

  • Java导出txt文件的方法

    本文实例讲述了Java导出txt文件的方法.分享给大家供大家参考.具体如下: 例子一 /** * export导出文件 */ @RequestMapping(value="/grab/export/csv",method={RequestMethod.GET}) public void exportCsv(HttpServletRequest request,HttpServletResponse response){ String userId = ServletRequestUti

  • Java 导出 CSV 文件操作详情

    首先第一步 导入坐标: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.6</version> </dependency> 第二步 引入工具类 说明下 因为这个工具类用到是Listj集合我就顺带吧 实体类和map 之间的转换也说了 import org.apach

  • Java生成CSV文件实例详解

    本文实例主要讲述了Java生成CSV文件的方法,具体实现步骤如下: 1.新建CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputS

  • Java实现将类数据逐行写入CSV文件的方法详解

    目录 1. 需求和思路 2. 现有方法 3. 代码 4. 参考 1. 需求和思路 最近要用java制作一个数据集,每一行是一个样本,格式是csv.用了一下java类的相关概念,把csv文件里的每一行,即每一个样本视为一个类. 2. 现有方法 目前已有的csv包如opencsv,可以支持字符串,也可以支持javabean(即java类).相关教程如下 Java OpenCSV|极客教程 由于墙的原因,我maven老是下载不到opencsv的jar包,没办法我只能手写个平民版的 3. 代码 自定义的

  • Python导出数据到Excel可读取的CSV文件的方法

    本文实例讲述了Python导出数据到Excel可读取的CSV文件的方法.分享给大家供大家参考.具体实现方法如下: import csv with open('eggs.csv', 'wb') as csvfile: #spamwriter = csv.writer(csvfile, delimiter=' ',quotechar='|', #quoting=csv.QUOTE_MINIMAL) spamwriter = csv.writer(csvfile, dialect='excel') s

  • mysql 导出CSV文件 并带表头的方法

    参考官方文档 http://dev.mysql.com/doc/refman/5.7/en/select-into.html mysql> select game,domain,type -> into outfile 'd:\\game.csv' -> fields terminated by ',' -> lines terminated by '\n' -> from game_lists limit 10; 实例如下: mysql> create table t

随机推荐