zoukankan      html  css  js  c++  java
  • java 导出百万数据到excel

    @RequestMapping("export")
    	public void write(HttpServletRequest request,HttpServletResponse response,String agent,String starttime,
    			String endtime,int callduration,String dst,String answer) {
    		try {
    			Map<String,Object> param = new HashMap<>();
    			User user = (User) request.getSession().getAttribute(Constant.LOGIN_USER);
    			param.put("agent", agent);
    			param.put("starttime", starttime == "" ? DateUtil.getFirstDayByMonth() : starttime);
    			param.put("endtime", endtime == "" ? DateUtil.getLastDayByMonth() : endtime);
    			param.put("callduration", callduration);
    			param.put("dst",dst);
    			param.put("answer",answer);
    			if(DateUtil.isThisMonth(param.get("starttime").toString()) && DateUtil.isThisMonth(param.get("endtime").toString())){
    				param.put("cdr", "cdr"+user.getPbxid());
    			}else{
    				param.put("cdr", "cdr"+user.getPbxid()+"_"+DateUtil.getYearAndMonth(param.get("starttime").toString()));
    			}
    			// 创建CSV写对象  查询数据
    			List<Map<String, Object>> list = this.cdrService.listCdrs(param);
    			// 写入临时文件
    			File tempFile = File.createTempFile("vehicle", ".csv");
    			CsvWriter csvWriter = new CsvWriter(tempFile.getCanonicalPath(), ',', Charset.forName("UTF-8"));
    			// 写表头
    			String headers[] = new String[]{"id", "主叫", "被叫", "开始时间", "应答时间", "结束时间", "总时长(秒)", "通话时长(秒)", "通话状态","挂断方"};
    			csvWriter.writeRecord(headers);
    			for(int i = 0;i<list.size();i++){
    				csvWriter.write(list.get(i).get("clid").toString()==null? "" :list.get(i).get("clid").toString());
    				csvWriter.write(list.get(i).get("src").toString()==null? "" :list.get(i).get("src").toString());
    				csvWriter.write(list.get(i).get("dst").toString()==null? "" :list.get(i).get("dst").toString());
    				csvWriter.write(list.get(i).get("start").toString()==null? "" :list.get(i).get("start").toString());
    				csvWriter.write(list.get(i).get("answer").toString()==null? "" :list.get(i).get("answer").toString());
    				csvWriter.write(list.get(i).get("end").toString()==null? "" :list.get(i).get("end").toString());
    				Integer billsec = Integer.parseInt(list.get(i).get("billsec").toString());
    				Integer duration =  Integer.parseInt(list.get(i).get("duration").toString());
    				csvWriter.write(String.valueOf(billsec+duration));
    				csvWriter.write(list.get(i).get("billsec").toString()==null? "" :list.get(i).get("billsec").toString());
    				String disposition = list.get(i).get("disposition").toString();
    					if (disposition.equals("ANSWERED")) {
    						csvWriter.write("已接通");
    					} else if (disposition.equals("NO ANSWER")) {
    						csvWriter.write("未接通");
    					} else if (disposition.equals("BUSY")) {
    						csvWriter.write("忙碌");
    					} else if (disposition.equals("FILED")) {
    						csvWriter.write("失败");
    					} else {
    						csvWriter.write("");
    					}
    					String hanger = list.get(i).get("hanger").toString();
    					if (Integer.parseInt(hanger)==-1) {
    						csvWriter.write("客户挂断");
    					} else {
    						csvWriter.write("坐席挂断");
    					}
    				csvWriter.endRecord();
    			}
    			csvWriter.close();
    			/**
    			 * 写入csv结束,写出流
    			 */
    			java.io.OutputStream out = response.getOutputStream();
    			byte[] b = new byte[10240];
    			java.io.File fileLoad = new java.io.File(tempFile.getCanonicalPath());
    			response.setContentType("application/csv");
    			response.setHeader("content-disposition", "attachment; filename="+ DateUtil.getDate()+".csv");
                   out.write("ufeff".getBytes()); long fileLength = fileLoad.length(); String length1 = String.valueOf(fileLength); response.setHeader("Content_Length", length1); java.io.FileInputStream in = new java.io.FileInputStream(fileLoad); int n; while ((n = in.read(b)) != -1) { out.write(b, 0, n); // 每次写入out1024字节 } in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } }

      注意:如果是数字类型太长超过16位写入到excel会丢失

      解决办法 将 csvWriter.write 改成 csvWriter.writeRecord()  

          把长数字转换成字符串,并在输在字符串前面增加“ ”。

          例如:

    String un = list.get(i).get("uniqueid").toString().replaceFirst("#", "");
    					String[] u = new String[]{"	"+un};
    					csvWriter.writeRecord(u,true);
    

      

  • 相关阅读:
    UpdateParameterUtils
    从WAVE头文件里获取压缩方式
    oracle rac下调节redo log file 文件大小
    centos下yum安装lamp和lnmp轻松搞定
    回车登录(支持IE 和 火狐等浏览器)
    图结构练习——推断给定图是否存在合法拓扑序列(拓扑排序推断环)
    HDU 2181 DFS
    Android 运行 gson.toJson(object) 报java.lang.StackOverflowError异常
    Spring-SpringJdbcTemlate配置介绍
    Cocos2D-x设计模式发掘之中的一个:单例模式
  • 原文地址:https://www.cnblogs.com/xdcr/p/9316323.html
Copyright © 2011-2022 走看看