@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的更多相关文章

  1. PHP导出MySQL数据到Excel文件

    PHP导出MySQL数据到Excel文件 转载 常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存 ...

  2. .NET使用Office Open XML导出大量数据到 Excel

    我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...

  3. Java 导出大批量数据excel(百万级)(转载)

    参考资料:http://bbs.51cto.com/thread-1074293-1-1.html                 http://bbs.51cto.com/viewthread.ph ...

  4. SpringBoot图文教程10—模板导出|百万数据Excel导出|图片导出「easypoi」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  5. java 对excel操作 读取、写入、修改数据;导出数据库数据到excel

    ============前提加入jar包jxl.jar========================= // 从数据库导出数据到excel public List<Xskh> outPu ...

  6. Java导出带格式的Excel数据到Word表格

    前言 在Word中创建报告时,我们经常会遇到这样的情况:我们需要将数据从Excel中复制和粘贴到Word中,这样读者就可以直接在Word中浏览数据,而不用打开Excel文档.在本文中,您将学习如何使用 ...

  7. 导出表格数据到excel并下载(HSSFWorkbook版)

    这里主要前面是通过一个全局变量,在layui的done回调里拿到数据,然后将该数据导出到excel,这里要注意一点,下载excel不能用ajax方式,如果采用ajax下载默认会读取response返回 ...

  8. 导出数据库数据制成Excel和txt

    引用ICSharpCode.SharpZipLib.dll 1.编写压缩和解压代码 using System; using System.Collections.Generic; using Syst ...

  9. C#通过OLEDB导出大数据到Excel

    C#导出数据到Excel,基本有两种方法,一种方法是通过Microsoft.Office.Interop.Excel.Application,一行一列的写入Excel中:另一种方法是通过OLEDB,利 ...

随机推荐

  1. P3376 【模板】网络最大流(luogu)

    P3376 [模板]网络最大流(luogu) 最大流的dinic算法模板(采取了多种优化) 优化 时间 inline+当前弧+炸点+多路增广 174ms no 当前弧 175ms no 炸点 249 ...

  2. sklearn学习6----交叉验证

    1.kfold:自己分样本来交叉验证迭代 导入模块:from sklearn.model_selection import KFold 参数: KFold(n_splits=3, shuffle=Fa ...

  3. [spoj] HIGH - Highways (生成树计数)

    传送门 输入格式: 第一行一个整数T,表示测试数据的个数 每个测试数据第一行给出 n,m 分别表示点数与边数 接下来 m 行,每行给出两个数 a,b ,表示 a,b 之间有一条无向边 输出格式: 每个 ...

  4. 小学生都能学会的python(<lamda匿名函数,sorted(),filter(),map(),递归函数>)

    小学生都能学会的python(<<lamda匿名函数,sorted(),filter(),map(),递归函数,二分法>> 1. lambda 匿名函数 lambda 参数: ...

  5. 【codeforces 810C】Do you want a date?

    [题目链接]:http://codeforces.com/contest/810/problem/C [题意] 给你一个集合,它包含a[1],a[2]..a[n]这n个整数 让你求出这个集合的所有子集 ...

  6. 创业笔记-Node.js入门之JavaScript与Node.js

    JavaScript与Node.js JavaScript与你 抛开技术,我们先来聊聊你以及你和JavaScript的关系.本章的主要目的是想让你看看,对你而言是否有必要继续阅读后续章节的内容. 如果 ...

  7. &lt;pre&gt;标签

     <pre>标签最主要的认识就是预格式化文本,被包围在 pre 元素中的文本一般会保留空格和换行符.而文本也会呈现为等宽字体.经经常使用于在网页中显示计算机源码. 1.格式化文本举例 &l ...

  8. webserver的作用!

    常见的webserver:Apache和Nginx(linux平台) IIS(window平台) 非常多小公司小项目眼下不一定使用了webserver,由于流量下,单台应用server能够支撑. 实际 ...

  9. 安全风控的CAP原理和BASE思想

    CAP原理最多实现两个,需要牺牲一个来满足其他两个:

  10. AutoCompleteTextView和Spinner的使用方法

    首先说明AutoCompleteTextView的使用方法.主要是起到自己主动填充的作用.输入keyword,假设存在该字便能够自己主动填充.代码例如以下 activity_main.xml < ...