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,利 ...
随机推荐
- ZBrush 笔刷的基础参数
ZBrush®中的笔刷基本参数主要包括3个:Draw Size(绘制大小).Focal Shift(焦点衰减)和Z Intensity(深度强度),通常使用这3个基本参数对笔刷进行调整. 在视图文档区 ...
- 闭包、this、ES6特性
声明一个函数 function fun1 函数内定义一个变量比如 var x=1 如果这时候在function内声明一个函数 fun2 fun2中对这个函数外面的x进行操作 这时候把fun2的地址付给 ...
- 小程序--wepy省市区三级联动选择
产品老哥对项目再一次进行关爱, 新增页面, 新增需求, 很完美........ 不多说, 记录一下新增东西中的省市区联动选择, (这里全国地区信息是在本地, 但不建议这么做, 因为js文件太大.. 建 ...
- POJ 3370 Halloween treats( 鸽巢原理简单题 )
链接:传送门 题意:万圣节到了,有 c 个小朋友向 n 个住户要糖果,根据以往的经验,第i个住户会给他们a[ i ]颗糖果,但是为了和谐起见,小朋友们决定要来的糖果要能平分,所以他们只会选择一部分住户 ...
- man帮助命令
linux系统提供可比较丰富的帮助手册,man是manual(说明书)的缩写,在日常的linux系统管理中经常会用到. 语法: man(选项)(参数) 选项: -a:在所有的man帮助手册中搜索: - ...
- Swoole WebSoctet 使用 zlib 压缩之 PHP 与 pako.js
一些理论知识 先说一下deflate算法吧,deflate是zip压缩文件的默认算法, 其实deflate现在不光用在zip文件中, 在7z, xz等其他的压缩文件中都用, 实际上deflate只是一 ...
- JDBC、事务和连接池
一:JDBC 1.什么是JDBC JDBC(Java Data Base Connectivity)SUN公司提供的一套操作数据库的标准规范.具体来讲是一种用于执行SQL语句的Java API,为多种 ...
- ASP.NET-GUID扩展类使用
在NUGET上有一个GUID的类,安装试用一下它的方法 将string转为guid对象 Guid ad = new Guid("{99009327-15D2-4A69-B015-BEAC11 ...
- HDU 1131
N个节点的不同的树的数目.这样 随便取一个节点作为根,那么他左边和右边的儿子节点个数就确定了,假定根节点标号为x,那么左子树的标号就从1到x-1,共x-1个,右子树的标号就从x+1到n,共n-x个,那 ...
- xftp和xshell的使用
Xftp和Xshell配合使用部署环境. (linux系统) Xftp为可视化工具.主要用来复制文件. xshell则通过输入命令来对server进行操作,如启动服务等等. 一. Xftp的连接 新 ...