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()
把长数字转换成字符串,并在输在字符串前面增加“\t”。
例如:
String un = list.get(i).get("uniqueid").toString().replaceFirst("#", "");
String[] u = new String[]{"\t"+un};
csvWriter.writeRecord(u,true);
java 导出百万数据到excel的更多相关文章
- PHP导出MySQL数据到Excel文件
PHP导出MySQL数据到Excel文件 转载 常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存 ...
- .NET使用Office Open XML导出大量数据到 Excel
我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...
- Java 导出大批量数据excel(百万级)(转载)
参考资料:http://bbs.51cto.com/thread-1074293-1-1.html http://bbs.51cto.com/viewthread.ph ...
- SpringBoot图文教程10—模板导出|百万数据Excel导出|图片导出「easypoi」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...
- java 对excel操作 读取、写入、修改数据;导出数据库数据到excel
============前提加入jar包jxl.jar========================= // 从数据库导出数据到excel public List<Xskh> outPu ...
- Java导出带格式的Excel数据到Word表格
前言 在Word中创建报告时,我们经常会遇到这样的情况:我们需要将数据从Excel中复制和粘贴到Word中,这样读者就可以直接在Word中浏览数据,而不用打开Excel文档.在本文中,您将学习如何使用 ...
- 导出表格数据到excel并下载(HSSFWorkbook版)
这里主要前面是通过一个全局变量,在layui的done回调里拿到数据,然后将该数据导出到excel,这里要注意一点,下载excel不能用ajax方式,如果采用ajax下载默认会读取response返回 ...
- 导出数据库数据制成Excel和txt
引用ICSharpCode.SharpZipLib.dll 1.编写压缩和解压代码 using System; using System.Collections.Generic; using Syst ...
- C#通过OLEDB导出大数据到Excel
C#导出数据到Excel,基本有两种方法,一种方法是通过Microsoft.Office.Interop.Excel.Application,一行一列的写入Excel中:另一种方法是通过OLEDB,利 ...
随机推荐
- STL中的迭代器的使用
package com.text; import java.lang.reflect.Field;import java.util.ArrayList;import java.util.Iterato ...
- 谈 instanceof 和 typeof 的实现原理
typeof: js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息
- [NOIP2004提高组]虫食算
题目:洛谷P1092.codevs1064.Vijos P1099. 题目大意:给你一个$n$进制.每个数都是$n$位的三个数a,b,c,这些数的数位由字母表示(共$n$个字母,从‘A’开始),所有数 ...
- B-Tree概念
记录下学习B-Tree: concept:(m-阶) 1. 根节点 孩子数 ( 2 <= N <= m) 根节点key数([m/2] - 1 <= n <= m -1) 2 ...
- idea 编辑器 光标问题!(insert键)
今天写代码不小心按了键盘的insert键,光标莫名闪退了 ,重新打开的时候发现 光标变成了 按了insert 的效果 ,简直无语的要命啊! 这敲代码太恶心了!怒搜资料 结果找到了解决办法! 1.打 ...
- ArcEngine 一些实现代码
转自原文 ArcEngine 一些实现代码 ●·● 目录: A1 …………实现:鼠标滑过显示要素 tip A2 …………实现:通过鼠标选择要素并高亮显示(ISelectionEnvironme ...
- java开发必背API
1.java.io.file类,File用于管理文件或目录: 所属套件:java.io File file = new File(fileStringPath); 1)file.mk(),真的会创建一 ...
- HDU 4418 高斯消元法求概率DP
把两种状态化成2*n-2的一条线上的一种状态即可.很容易想到. 高斯列主元法,不知为什么WA.要上课了,不玩了...逃了一次课呢.. #include <iostream> #includ ...
- HDU 2686 Matrix(最大费用最大流+拆点)
题目链接:pid=2686">http://acm.hdu.edu.cn/showproblem.php?pid=2686 和POJ3422一样 删掉K把汇点与源点的容量改为2(由于有 ...
- java语言中的多态概述
多态:一个对象相应着不同类型 多态在代码中的体现:父类或接口的引用指向其子类对象. 多态的优点: 提高了代码的扩展性,前期定义的代码能够使用后期的内容. 多态的弊端: 前期定义的内容不能使用后期子类中 ...