/**

* 创建本地报表文件

* @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处理相关推荐

  1. EasyExcel 分Sheet实现大数据量导出

    EasyExcel 分 Sheet 实现大数据量导出 [场景]平台用户导出数据量达 w 级别的数据时界面白屏或按钮无响应. [解决方案]做异步导出,用户触发点击时创建导出消息并开启单独线程处理导出,处 ...

  2. 关于60枚一分两分五分硬币凑成一块钱的解决方法

    关于60枚一分两分五分硬币凑成一块钱的解决方法 一.强行三重for循环 #include<stdio.h> int main() {int a, b, c;for (a = 1; a &l ...

  3. /* * 编程题第四题(20分): 用1元5角钱人名币兑换5分、2分和1分的硬币(每一种都要有)共一百枚,问共有几种兑换方案?并输出每种方案。 */

    题目: /* 编程题第四题(20分): 用1元5角钱人名币兑换5分.2分和1分的硬币(每一种都要有)共一百枚,问共有几种兑换方案?并输出每种方案. */ 我使用java做的 public class ...

  4. 3分和30分文章差距在哪里?

    好的分析和可视化,可以提供大量的信息,同时兼顾简洁优雅. 今天我们抛开实验设计.方法和工作量等因素,仅从文章最吸引人的图片来讨论3分和30分(顶级)文章差距在哪里? 以2017年8月25日发表在Sci ...

  5. 微生物组:3分和30分文章差距在哪里?

    好的分析和可视化,可以提供大量的信息,同时兼顾简洁优雅. 今天我们抛开实验设计.方法和工作量等因素,仅从文章最吸引人的图片来讨论3分和30分(顶级)文章差距在哪里? 以2017年8月25日发表在Sci ...

  6. cron表达式 每天0点10分和30分_“提前2小时下班”:学会这10个函数,办公效率提升了10倍!...

    ✎ 大家好,我是雅客. 今天给大家分享10个非常好用的函数,这几个函数都是我们精挑细选出来的,掌握这些函数,可以帮你提升10倍的工作效率,从此下班提前2个小时不是梦想! 01 VLOOKUP函数 根据 ...

  7. 期末计算机考试五五开要考多少分,大学平时分加上末考分过了多少算不挂科

    大学平时分加上末考分过了多少算不挂科,一.大学平时分加上末考分过了多少算不挂科一般是综合分数60分以上才算通过,低于60都算挂科.70弄二.中国大学都有平时分这种东西吗许多课程都有平时成绩,一般占20 ...

  8. 计算机专业联考335分,联考专业分、文化分达到多少能过本科线(附2019年美术高考分数线汇总...

    原标题:联考专业分.文化分达到多少能过本科线(附2019年美术高考分数线汇总 说明:2019年美术高考录取分数线含美术类各批次文化控制线.专业控制线,美术统考合格线. 控制线指的是,您达到了某个批次的 ...

  9. mysql 分表后排序_MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计?...

    昨天面试新人的时候,遇到了这么一个问题,按照自己的想法大体聊了一些,但大多是感性的,并没有完整的了解why and how. 今天查了一些相关的资料,包括<MySQL性能调优与架构设计>. ...

最新文章

  1. 超越BERT的模型有哪些?
  2. 关于Android制作.9.png图片
  3. oracle9I收缩表,Oracle 9i删除数据表(转)
  4. KMP算法---字符串匹配
  5. AtCoder - arc098_b Xor Sum 2(尺取+位运算)
  6. 壁式框架内力计算_剪力墙结构设计计算要点和实例
  7. 统计学习方法基础总结
  8. Unity3D 制作绿草地,草坪,模型表面生成草地,草地效果Shader实现 草着色器 Brute Force - Grass Shader
  9. boost asio生成lib
  10. 职业理想规划计算机专业,计算机专业的职业生涯规划书范文
  11. /和/*的区别和用法
  12. 002产品经理用户访谈和问卷调查的目的和设计步骤
  13. jbpm 历史查询笔记
  14. 儿童交通安全教育宣传手抄报模板
  15. UE4大场景解决方案 ——Pak的打包与加载
  16. Ubuntu更新系统源时出现错误提示W: GPG 错误
  17. mysql实现动态行转列
  18. lenet 5 代码 matlab,LeNet5的一个MATLAB实现的代码解析(4)
  19. phpword html转word word转html
  20. 2023年“华数杯”国际数学建模比赛ICM-问题B:社会稳定预警研究背景-多思路详解(含代码/数据)

热门文章

  1. centos6.5编译安装php7
  2. jquery 只能输入汉字
  3. Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解
  4. 创建cocos2dx lua 工程
  5. Hibernate的命名查询(NamedQuery)
  6. 模块化编程AMDCommonJS
  7. jetty 切换log4j日志接口
  8. 用户控件(.ascx)调用网页(.aspx)的方法
  9. 怎么复制黑苹果config配置_估计是最后一次折腾黑苹果,技嘉 Z490 Vision D 的 OC 配置分享...
  10. POJ3757 01分数规划