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,利 ...
随机推荐
- Python中int,bool,str,格式化,少量is,已经for循环练习
1.整数 十进制转化为二进制 xxx.bit_length(). #求十进制数转化成二进制时所占用的位数 2.布尔值 bool # 布尔值 - - 用于条件使用 True 真 Fa ...
- JavaScript:理解执行环境、作用域链和活动对象
作用域的原理,对JS将如何解析标识符做出了解答.而作用域的形成与执行环境和活动对象紧密相关. 我们对于JS标识符解析的判断,存在一个常见误区 首先,看一个关于JS标识符解析的问题 ,源于风雪之隅提出的 ...
- [USACO18FEB] Snow Boots G (离线+并查集)
题目大意:略 网上各种神仙做法,本蒟蒻只想了一个离线+并查集的做法 对所有靴子按最大能踩的深度从大到小排序,再把所有地砖按照积雪深度从大到小排序 一个小贪心思想,我们肯定是在 连续不能踩的地砖之前 的 ...
- debian 9 安装后的配置,debian 9 开发环境。
注意:以下命令用sudo或者以root用户进行 一.Xterm(在安装KDE桌面情况下)的配置(可以黏贴,复制): 首先在根目录下编辑文件.Xresources(没有可以创建) root@debian ...
- WPF原生环形图表
原文:WPF原生环形图表 版权声明:欢迎转载.转载请注明出处,谢谢 https://blog.csdn.net/wzcool273509239/article/details/56480963 主要利 ...
- 集成swagger2构建Restful API
集成swagger2构建Restful API 在pom.xml中进行版本管理 <swagger.version>2.8.0</swagger.version> 给taosir ...
- nodejs 中使用 ftp
转自原文 nodejs 中使用 ftp 1. npm install ftp 项目 https://github.com/mscdex/node-ftp 2. 转自 http://www.open ...
- 讲一讲java异常及自定义异常
1.异常,说白了.两种,一种就是就是不能让代码通过编译的异常.另一种就是程序运行期间出现的异常.异常就是错误,只要出现异常,程序就不会向下运行了.就不会执行后面的代码了.这时候就可以通过显示statc ...
- Android自己定义TabActivity(实现仿新浪微博底部菜单更新UI)
现在Android上非常多应用都採用底部菜单控制更新的UI这样的框架,比如新浪微博 点击底部菜单的选项能够更新界面.底部菜单能够使用TabHost来实现,只是用过TabHost的人都知道自己定义Tab ...
- python实战之编码问题:中文!永远的痛
编码的思维图谱: 也就是说文件没有编码之说,事实上都是按二进制格式保存在硬盘中的.不过在写入读取时须使用相应的编码进行处理,以便操作系统配合相关软件/字体,绘制到屏幕中给人看.所以关键问题是得知道原先 ...