报表-对于多数据进行 分sheet以及 分workbook处理
/**
* 创建本地报表文件
* @param tarinList 需要生成的数据
*/
private void createWorkbookInLocal(List<TrainRecordSearchVO> tarinList) {
/**
* sheetcount:返回当前workbook中最大sheet数,是MAX_SHEET的倍数或者是最大sheet数,当超过MAX_SHEET时回自动分文件处理
*/
int sheetcount = 0;
/**
* currentCount:用于sheet分页处理以及workbook分文件处理
*/
int currentCount = 0;
/**
* aleardSheet:workbook分文件后,标记已经分页过的数据 默认已经分页第一页
*/
Map<Integer, Integer> aleardSheet = new HashMap<Integer, Integer>();
aleardSheet.put(0, 0);
/**
* 当sheetcount小于总sheet数量,并且最后一个sheet记录数不等于 MAX_COUNT 时(否则回无限循环创建),新建workBook,进行分文件
*/
int shouldworkCount=(tarinList.size() / MAX_COUNT)+((tarinList.size() % MAX_COUNT)>0?1:0);
while (sheetcount < shouldworkCount) {
currentCount = sheetcount * MAX_COUNT;
SXSSFWorkbook sworkbook = getNewWorkBook();
sheetcount = createWorkbookByPage(tarinList, currentCount, sworkbook, aleardSheet);
System.out.println("生成的sheet:" + sheetcount);
}
}
/**
* 创建workBook,最大sheet数量是 MAX_SHEET
*
* @param tarinList
* @param currentCount
* @param sworkbook
* @param map
* @return
*/
private int createWorkbookByPage(List<TrainRecordSearchVO> tarinList, int currentCount, SXSSFWorkbook sworkbook,
Map<Integer, Integer> map) {
/**
* 标记Sheet 号
*/
int sheetNum = 0;
/**
* 标记rowNum 行号
*/
int rowNum = 0;
/**
* 根据当前记录数判定某个sheet的rowNum行数据
*/
if (currentCount != 0) {
sheetNum = currentCount / MAX_COUNT; // 取莫,获得当前sheet页面标签
rowNum = currentCount % MAX_COUNT;// 取余,获取行标记
}
/**
* 当sheetNum达到最大值,并且不包含已经生成workbook时,生成workbook,返回当前sheetNum,进行下一个workbook的创建
*/
if (sheetNum % MAX_SHEET == 0 && !map.containsKey(sheetNum)) {
/**
* 创建workbook,上传workbook并且保存url
*/
createWorkBookFile(sworkbook);
map.put(sheetNum, sheetNum);
return sheetNum;
}
try {
CellStyle cellStyleDate = getCellStyleDateTime(sworkbook);
CellStyle cellStyleString = getCellStyleString(sworkbook);
Sheet sheet;
/**
* 首次进入获取第一个sheet,需要分页时,创建新的sheet
*/
if (sheetNum > 0 && sheetNum % MAX_SHEET != 0) {
String sheetName = "Sheet" + (sheetNum % MAX_SHEET + 1);
sheet = sworkbook.getSheet(sheetName);
if (sheet == null) {
sheet = sworkbook.createSheet(sheetName);
}
} else {
sheet = sworkbook.getSheetAt(0);
}
/**
* 设置标题样式
*/
CellStyle style = getTitleStyle(sworkbook);
Row targetRow = sheet.createRow(0);
/**
* 创建标题列
*/
copyRowTitle(targetRow, style);
/**
* rowId:根据rowNum和sheetNum记录已经插入的数据 遍历所有数据,根据rowId获取未插入的数据
*/
for (int rowId = rowNum + MAX_COUNT * sheetNum; rowId < tarinList.size(); rowId++) {
/**
* 当已经插入的数据超过最大数据时,进行分sheet处理
*/
if (rowId >= MAX_COUNT * (sheetNum + 1)) {
currentCount = rowId;
return createWorkbookByPage(tarinList, currentCount, sworkbook, map);
}
TrainRecordSearchVO pis = tarinList.get(rowId);
Row newRow = sheet.createRow(rowId % MAX_COUNT + 1);
insertCrouseDataToExcel(newRow, pis, cellStyleDate, cellStyleString);
/**
*
*/
if(rowId==tarinList.size()-1){
sheetNum+=1;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
createWorkBookFile(sworkbook);
return sheetNum;
}
private void createWorkBookFile(SXSSFWorkbook sworkbook) {
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
try {
String fileExtName = name.substring(name.lastIndexOf("."));
String filePreName = name.substring(0, name.lastIndexOf("."));
File uplDir = new File(filePrePath);
// 判断文件夹是否存在 不存在则创建该文件夹树
if (!uplDir.exists()) {
uplDir.mkdirs();
}
String filePath = filePrePath + filePreName + System.nanoTime() + fileExtName;
FileOutputStream fout = new FileOutputStream(filePath);
sworkbook.write(fout);
workbookFile.add(filePath);
} catch (FileNotFoundException e) {
log.error("File not found:", e);
} catch (IOException e) {
log.error("IO error:", e);
} finally {
try {
swapStream.close();
} catch (IOException e) {
log.error("Stream cannot be closed:", e);
}
}
}
//设置头标题样式
private CellStyle getTitleStyle(SXSSFWorkbook sworkbook) {
// TODO Auto-generated method stub
CellStyle style = sworkbook.createCellStyle();
Font ztFont = sworkbook.createFont();
ztFont.setColor(Font.COLOR_NORMAL); // 将字体设置
style.setFont(ztFont);
style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND); // 设置前景填充样式
style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());// 设置颜色
return style;
}
//设置头标题
private void copyRowTitle(Row targetRow, CellStyle style) {
// TODO Auto-generated method stub
for (int i = 0; i < RECORD_TITLE.length; i++) {
Cell targetCell = targetRow.createCell(i);
targetCell.setCellStyle(style);
targetCell.setCellValue(RECORD_TITLE[i]);
}
}
//插入数据
private void insertCrouseDataToExcel(Row newRow, TrainRecordSearchVO pis, CellStyle cellStyleDate,
CellStyle cellStyleString) {
// Auto-generated method stub
insetParentData(newRow, pis, cellStyleDate, cellStyleString);
// 学习对象名称
Cell cell14 = newRow.createCell(14);
cell14.setCellValue("");
if (pis.getObjNameCn() != null) {
cell14.setCellValue(pis.getObjNameCn());
}
}
//获取模板文件
private SXSSFWorkbook getNewWorkBook() {
// TODO Auto-generated method stub
InputStream inputStrem = this.getClass().getResourceAsStream(RPT_TMPL_DIR_PATH);
XSSFWorkbook workbook = null;
try {
workbook = new XSSFWorkbook(inputStrem);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new SXSSFWorkbook(workbook);
}
转载于:https://blog.51cto.com/tianjian/2047942
报表-对于多数据进行 分sheet以及 分workbook处理相关推荐
- EasyExcel 分Sheet实现大数据量导出
EasyExcel 分 Sheet 实现大数据量导出 [场景]平台用户导出数据量达 w 级别的数据时界面白屏或按钮无响应. [解决方案]做异步导出,用户触发点击时创建导出消息并开启单独线程处理导出,处 ...
- 关于60枚一分两分五分硬币凑成一块钱的解决方法
关于60枚一分两分五分硬币凑成一块钱的解决方法 一.强行三重for循环 #include<stdio.h> int main() {int a, b, c;for (a = 1; a &l ...
- /* * 编程题第四题(20分): 用1元5角钱人名币兑换5分、2分和1分的硬币(每一种都要有)共一百枚,问共有几种兑换方案?并输出每种方案。 */
题目: /* 编程题第四题(20分): 用1元5角钱人名币兑换5分.2分和1分的硬币(每一种都要有)共一百枚,问共有几种兑换方案?并输出每种方案. */ 我使用java做的 public class ...
- 3分和30分文章差距在哪里?
好的分析和可视化,可以提供大量的信息,同时兼顾简洁优雅. 今天我们抛开实验设计.方法和工作量等因素,仅从文章最吸引人的图片来讨论3分和30分(顶级)文章差距在哪里? 以2017年8月25日发表在Sci ...
- 微生物组:3分和30分文章差距在哪里?
好的分析和可视化,可以提供大量的信息,同时兼顾简洁优雅. 今天我们抛开实验设计.方法和工作量等因素,仅从文章最吸引人的图片来讨论3分和30分(顶级)文章差距在哪里? 以2017年8月25日发表在Sci ...
- cron表达式 每天0点10分和30分_“提前2小时下班”:学会这10个函数,办公效率提升了10倍!...
✎ 大家好,我是雅客. 今天给大家分享10个非常好用的函数,这几个函数都是我们精挑细选出来的,掌握这些函数,可以帮你提升10倍的工作效率,从此下班提前2个小时不是梦想! 01 VLOOKUP函数 根据 ...
- 期末计算机考试五五开要考多少分,大学平时分加上末考分过了多少算不挂科
大学平时分加上末考分过了多少算不挂科,一.大学平时分加上末考分过了多少算不挂科一般是综合分数60分以上才算通过,低于60都算挂科.70弄二.中国大学都有平时分这种东西吗许多课程都有平时成绩,一般占20 ...
- 计算机专业联考335分,联考专业分、文化分达到多少能过本科线(附2019年美术高考分数线汇总...
原标题:联考专业分.文化分达到多少能过本科线(附2019年美术高考分数线汇总 说明:2019年美术高考录取分数线含美术类各批次文化控制线.专业控制线,美术统考合格线. 控制线指的是,您达到了某个批次的 ...
- mysql 分表后排序_MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计?...
昨天面试新人的时候,遇到了这么一个问题,按照自己的想法大体聊了一些,但大多是感性的,并没有完整的了解why and how. 今天查了一些相关的资料,包括<MySQL性能调优与架构设计>. ...
最新文章
- 超越BERT的模型有哪些?
- 关于Android制作.9.png图片
- oracle9I收缩表,Oracle 9i删除数据表(转)
- KMP算法---字符串匹配
- AtCoder - arc098_b Xor Sum 2(尺取+位运算)
- 壁式框架内力计算_剪力墙结构设计计算要点和实例
- 统计学习方法基础总结
- Unity3D 制作绿草地,草坪,模型表面生成草地,草地效果Shader实现 草着色器 Brute Force - Grass Shader
- boost asio生成lib
- 职业理想规划计算机专业,计算机专业的职业生涯规划书范文
- /和/*的区别和用法
- 002产品经理用户访谈和问卷调查的目的和设计步骤
- jbpm 历史查询笔记
- 儿童交通安全教育宣传手抄报模板
- UE4大场景解决方案 ——Pak的打包与加载
- Ubuntu更新系统源时出现错误提示W: GPG 错误
- mysql实现动态行转列
- lenet 5 代码 matlab,LeNet5的一个MATLAB实现的代码解析(4)
- phpword html转word word转html
- 2023年“华数杯”国际数学建模比赛ICM-问题B:社会稳定预警研究背景-多思路详解(含代码/数据)
热门文章
- centos6.5编译安装php7
- jquery 只能输入汉字
- Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解
- 创建cocos2dx lua 工程
- Hibernate的命名查询(NamedQuery)
- 模块化编程AMDCommonJS
- jetty 切换log4j日志接口
- 用户控件(.ascx)调用网页(.aspx)的方法
- 怎么复制黑苹果config配置_估计是最后一次折腾黑苹果,技嘉 Z490 Vision D 的 OC 配置分享...
- POJ3757 01分数规划