excel 数据量较大边查询边输入到excel表格中
public Resultmodel getexpenseMessagx(HttpServletResponse response, String date1, String date2) {
long startTime = System.currentTimeMillis(); Log.info("开始:费用表" + "///类.方法:" + this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName() + "///开始时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); Log.info("入参date1:" + date1 + "///date2=" + date2); // 定义两个date型变量 d1为3月2日d2是2月1日 //先求出两个日期之间的天数(d2.getTime() - d1.getTime()) / (3600L * 1000 * 24) Date Date1 = null; Date Date2 = null; try { Date1 = DateTimeUtil.stringToDate(date1); Date2 = DateTimeUtil.stringToDate(date2); } catch (ParseException e) { Log.info("日期转换错误"); e.printStackTrace(); } long days = (Date2.getTime() - Date1.getTime()) / (3600L * 1000 * 24); SXSSFWorkbook wb = new SXSSFWorkbook(); String[] listTitle = getlistTitle();//标题 String[] listTitle2 = getlistTitle2();//标题 String excelName = date1 + "至" + date2 + "费用表";//Excel名
String sheet1 = "xxx"; creatSheet1(wb, sheet1, listTitle, Date1, days); try { SXSSExcelUtil.outExcel(response, wb, excelName); } catch (Exception e) { Log.error("输出异常" + e.getMessage()); return new Resultmodel(400, "返回异常"); } //结束 long endTime = System.currentTimeMillis(); //获取结束时间 Log.info("结束:费用表" + "程序运行时间:" + (endTime - startTime) + "ms"); return null;}
public void creatSheet1(SXSSFWorkbook wb, String sheetx, String[] listTitle, Date Date1, Long days) { //1.创建Excel //整体 //整体 CellStyle cellStyle = wb.createCellStyle(); // cellStyle.setAlignment(SXSSFCellStyle.ALIGN_CENTER); // 水平居中 cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 水平居中 cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); // 垂直居中
//第一行 CellStyle titleCellStyle = wb.createCellStyle(); Font font = wb.createFont(); font.setColor(HSSFColor.GREEN.index); titleCellStyle.setFont(font); titleCellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 水平居中 titleCellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); // 垂直居中
Sheet sheet = wb.createSheet(sheetx); //冻结首行 sheet.createFreezePane(0, 1, 0, 1); //sheet.createFreezePane(1, 1, 1, 1);//
Row row0 = sheet.createRow(0);
//listSize 总列数 标题列=正文列 int listSize = listTitle.length; //输入标题栏 for (int j = 0; j < listSize; j++) {// 5列 Cell cell = row0.createCell((short) j); cell.setCellValue(listTitle[j].toString()); cell.setCellStyle(titleCellStyle); } CellRangeAddress region = new CellRangeAddress(0, 0, 10, 13); sheet.addMergedRegion(region);
int rowSize = 0; for (int x = 0; x < days; x++) {
Date dateSubDay = DateTimeUtil.getDateSubDay(Date1, x); String date = DateTimeUtil.getyyyyMMddTime(dateSubDay); //查询数据库 List<workerMessage> workerMessageList1 = WkOrderWorkerFeeMapper.selectworkerMessageByDay(date);//数据 ArrayList<Map<Integer, String>> list = getlist(workerMessageList1); rowSize += list.size();//总行数 int y = rowSize - list.size();
// 从第二行输入 或者说输入数据的第一行 先创建再放值 for (int i = y; i < rowSize; i++) { // 几行 Map<Integer, String> map = list.get(i - y); //存在合并 Row row = sheet.createRow(i + 1);//创建同一个序列号的第一行 for (int p = 0; p < map.size(); p++) { Cell cell = row.createCell(p); cell.setCellValue(map.get(p));//填充数值 包含合并列 后面在合并 cell.setCellStyle(cellStyle); } //=========================前 前17列合并 int j = 0;//相同行 String serial = map.get(0); for (int k = i + 1; k < rowSize; k++) {//查前17列重 Map<Integer, String> _map = list.get(k - y); String _serial = _map.get(0); if (serial.equals(_serial)) { j++; } else { break; } } if (j > 0) { for (int p = 0; p < 17; p++) { CellRangeAddress cra = new CellRangeAddress(i + 1, i + j + 1, p, p); sheet.addMergedRegion(cra);//合并 }
} //===========================中 创建中间段 17--到倒数1列 for (int k = 0; k < j; k++) { Map<Integer, String> _map1 = list.get(i + 1 + k - y); Row _row = sheet.createRow(i + 1 + k + 1);//创建行
for (int p = 17; p < _map1.size() - 1; p++) { Cell cell = _row.createCell(p);
cell.setCellValue(_map1.get(p)); cell.setCellStyle(cellStyle); } } //===========================后 最后一行的合并 if (j > 0) { CellRangeAddress cra = new CellRangeAddress(i + 1, i + j + 1, map.size() - 1, map.size() - 1); sheet.addMergedRegion(cra);//合并 } i += j;
//无合并行 /* Row row = sheet.createRow(i + 1);//创建同一个序列号的第一行 for (int p = 0; p < map.size(); p++) { Cell cell = row.createCell(p); cell.setCellValue(map.get(p));//填充数值 包含合并列 后面在合并 cell.setCellStyle(cellStyle); }*/
}
} System.out.println("===============正常====================="); setSheet(sheet, listSize);}
public String[] getlistTitle() { String[] listTitle = new String[]{"工单号", "旺旺ID", "创建日期", "金额", "类型", "是否支付(1:支付;0:未支付)", "商家", "店铺", "客户姓名", "客户电话", "地址", "地址", "地址", "地址", "销售单号", "工人名称", "工人电话", "商品类名", "商品名称", "高度", "长度", "数量", "工人商品单价", "工人商品价格", "商家商品单价", "商家商品价格", "完成时间"}; return listTitle;
}
private static void setSheet(Sheet sheet, int size) { for (int columnNum = 0; columnNum < size; columnNum++) { int columnWidth = sheet.getColumnWidth(columnNum) / 256; for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) { Row currentRow; //当前行未被使用过 if (sheet.getRow(rowNum) == null) { currentRow = sheet.createRow(rowNum); } else { currentRow = sheet.getRow(rowNum); }
if (currentRow.getCell(columnNum) != null) { Cell currentCell = currentRow.getCell(columnNum); if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) { int length = currentCell.getStringCellValue().getBytes().length; if (columnWidth < length) { columnWidth = length; } } } } sheet.setColumnWidth(columnNum, columnWidth * 256); }}
excel 数据量较大边查询边输入到excel表格中的更多相关文章
- poi导出excel数据量过大
问题:使用poi导出excel,数据量过大导致内存溢出 解决思路:1.多sheet导出 2.生成多个excel打包下载 3.生成csv下载 本文使用的是第二个思路,代码如下: poiUtil工具类 p ...
- sql查询未走索引问题分析之查询数据量过大
前因: 客户咨询,有一个业务sql(代表经常被执行且重要),全表扫描在系统占用资源很高(通过ash报告查询得到信息) 思路: 1.找到sql_text,sql_id 2.查看执行计划 3.查询sql涉 ...
- 系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法
系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法
- Mysql中使用JDBC流式查询避免数据量过大导致OOM
一.前言 java 中MySQL JDBC 封装了流式查询操作,通过设置几个参数,就可以避免一次返回数据过大导致 OOM. 二.如何使用 2.1 之前查询 public void selectData ...
- sql server 大数据, 统计分组查询,数据量比较大计算每秒钟执行数据执行次数
-- 数据量比较大的情况,统计十分钟内每秒钟执行次数 ); -- 开始时间 ); -- 结束时间 declare @num int; -- 结束时间 set @begintime = '2019-08 ...
- Oracle数据库--解决单张表中数据量巨大(大数据、数据量上百万级别,后查询,更新数据等耗时剧增)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/QQ578473688/article/details/54561397 思路1:采用备份表 备份表中 ...
- Mysql数据量较大时分页查询优化
据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id 是主键,vtype是int,vtype是索引. 最后co ...
- el-select数据量过大引发卡顿,怎么办?
本文分享自华为云社区<解决el-select数据量过大的卡顿的两种思路与一种实施方案>,作者: KevinQ. 经典问题:在测试环境好好的,怎么到正式环境就不行了? --本文:数据量变了. ...
- 针对数据量较大的表,需要进行跨库复制,采用navcat 实现sqlite数据库跨数据库的数据表迁移 [转载]
2014年12月13日 14:36 新浪博客 (转自http://www.cnblogs.com/nmj1986/archive/2012/09/17/2688827.html) 需求: 有两个不同的 ...
随机推荐
- py库: pyautogui (自动测试模块,模拟鼠标、键盘动作)
PyAutoGUI 是一个人性化的跨平台 GUI 自动测试模块 pyautogui 库 2017-10-4 pip install pyautogui python pip.exe install p ...
- 《汇编语言 基于x86处理器》第十章 - 运行一个 16位实地址汇编程序
▶ 书上第 10 章,主要讲了宏,引用了一个 16 位实地址的程序,从代码开始到运行 ● 代码 ; main.asm INCLUDE Macros.inc IF IsDefined( RealMode ...
- add_polygon_to_map
var poly = new esri.geometry.Polygon({ "rings": [ [[117.008726, 30.931672], [117.009635, 3 ...
- MySQL 5.7.20 ONLY_FULL_GROUP_BY
< SQL_MODE 的配置方式 > 01,默认情况下 5.7.20 MySQL 开启该模式,我们可以用指 SQL 预计查看 => select @@global.sql_mode; ...
- leetcode1017
这道题目很巧妙,似乎是有些过于巧妙了,属于我未知领域的类型,把原作者的解决方案放这里.(看大家都在给差评,我也顺手给个差评吧--) 参考:https://leetcode.com/problems/c ...
- guava 对集合的支持
- 07-border(边框)
边框 边框有三个要素: 粗细.线性样式.颜色 border: solid 如果颜色不写,默认是黑色. 如果粗细不写,不显示边框. 如果只写线性样式,默认的有上下左右 3px的宽度,实体样式,并且黑色的 ...
- mysql Lock wait timeout exceeded; try restarting transaction解决
前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处理: ...
- JS中,如何判断一个被转换的数是否是NaN
var x="abc"; //isNaN()函数判断是否是NaN if (isNaN(parseInt(x))) { alert("非数字"); } else{ ...
- C# 利用反射调用类下的方法
namespace TestReflection { public partial class Form1 : Form { public Form1() { InitializeComponent( ...