官方poi地址:

Busy Developers' Guide to HSSF and XSSF Features

HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook的区别:

◎HSSFWorkbook一般用于Excel2003版及更早版本(扩展名为.xls)的导出。

◎XSSFWorkbook一般用于Excel2007版(扩展名为.xlsx)的导出。

◎SXSSFWorkbook一般用于大数据量的导出。

    /*** 导出人事档案目录  组织数据* @param list* @param personnelIdToList* @param qtyMap*/@Overridepublic void exportCatalogue(String year,List<TnPersonnel> list,Map<String, List<TrPersonnelCatalogue>> personnelIdToList,Map<String, Integer> qtyMap) {Map<String, String> headMap = new LinkedHashMap<String, String>();// 存放表头部信息headMap.put("index", "序号");headMap.put("name", "材料名称");headMap.put("year", "年");headMap.put("month", "月");headMap.put("day", "日");headMap.put("total", "页数");headMap.put("remarks", "备注");String zipBucketName = CommonConstants.BUCKET_NAME + year + "excel";sysFileService.createBucket(zipBucketName);String fileName = year + "excel/";File f = new File(CommonConstants.BUCKET_PATH + zipBucketName + "/"+ fileName);   //new的一个File对象//先删除之前的文件夹FileUtils.deleteQuietly(f);sysFileService.craertTreeFile(zipBucketName, fileName);for (TnPersonnel tnPersonnel : list) {String serialNumber = tnPersonnel.getSerialNumber();String name = tnPersonnel.getName();String id = tnPersonnel.getId();String title =  serialNumber + name + ".xlsx";String path = CommonConstants.BUCKET_PATH + zipBucketName + "/"+ fileName + title;try {JSONObject personnelJo = new JSONObject();JSONArray catalogueJa = new JSONArray();List<TrPersonnelCatalogue> trPersonnelCatalogues = personnelIdToList.get(id);//添加大分类-List<TrPersonnelCatalogue> newCata = this.creatTitle(trPersonnelCatalogues);for (int i = 0; i < newCata.size(); i++) {JSONObject jo = new JSONObject();TrPersonnelCatalogue personnelCatalogue = newCata.get(i);String catalogueId = personnelCatalogue.getId();String cataDate = personnelCatalogue.getCataDate();String createYear = "";String month = "";String day = "";if(StringUtils.isNotBlank(cataDate)){Date date = DateUtils.parseDate(cataDate, "yyyy-MM-dd");createYear = DateUtils.formatDate(date, "yyyy");month = DateUtils.formatDate(date, "MM");day = DateUtils.formatDate(date, "dd");}String dateType = personnelCatalogue.getDateType();String no = personnelCatalogue.getNo();jo.put("index", no);jo.put("name", personnelCatalogue.getName());jo.put("year", createYear);if("0".equals(dateType) || "2".equals(dateType) ||StringUtils.isBlank(dateType)){jo.put("month", month);}if("2".equals(dateType) || StringUtils.isBlank(dateType)){jo.put("day", day);}jo.put("total", qtyMap.get(catalogueId));jo.put("remarks", "");catalogueJa.add(jo);}personnelJo.put("name", name);personnelJo.put("catalogueJa", catalogueJa);// 生成文件临时存放目录File destination = new File(path);File dir = destination.getParentFile();if (!dir.exists()) {dir.mkdirs();}if (!destination.exists()) {destination.createNewFile();}OutputStream outXlsx = new FileOutputStream(destination);ExcleUtils.exportCatalogue(headMap, personnelJo, "yyyy-MM-dd", 6, outXlsx);outXlsx.close();} catch (Exception e) {System.out.println("导出异常");e.printStackTrace();}}}
/*** 导出人事档案目录  构建表头和页尾** @param headMap  表头Map* @param personnelJo 表格内容* @param datePattern 日期格式* @param colWidth  列宽* @param out*/public static void exportCatalogue(Map<String, String> headMap, JSONObject personnelJo,String datePattern, int colWidth, OutputStream out) {if (datePattern == null) datePattern = DEFAULT_DATE_PATTERN;// 声明一个工作薄SXSSFWorkbook workbook = new SXSSFWorkbook(1000);//缓存workbook.setCompressTempFiles(true);//加外框样式CellStyle borderstyle = workbook.createCellStyle();borderstyle.setBorderBottom(BorderStyle.THIN); //下边框borderstyle.setBorderLeft(BorderStyle.THIN);//左边框borderstyle.setBorderTop(BorderStyle.THIN);//上边框borderstyle.setBorderRight(BorderStyle.THIN);//右边框borderstyle.setAlignment(HorizontalAlignment.CENTER);//文字居中borderstyle.setWrapText(true);//居中样式CellStyle centerCellStyle = workbook.createCellStyle();centerCellStyle.setAlignment(HorizontalAlignment.CENTER);//设置列宽int minBytes = colWidth < DEFAULT_COLOUMN_WIDTH ? DEFAULT_COLOUMN_WIDTH : colWidth;//至少字节数int[] arrColWidth = new int[headMap.size()];// 产生表格标题行,以及设置列宽String[] properties = new String[headMap.size()];String[] headers = new String[headMap.size()];int ii = 0;// 生成一个表格SXSSFSheet sheet = workbook.createSheet();//默认列宽sheet.setDefaultColumnWidth(5000);for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext(); ) {String fieldName = iter.next();properties[ii] = fieldName;headers[ii] = headMap.get(fieldName);ii++;}sheet.setColumnWidth(1, 8000);// 页边距(左)sheet.setMargin(SXSSFSheet.LeftMargin,( double ) 1 );//设置打印页面为水平居中sheet.setHorizontallyCenter(true);//TODO 在POI的api中没有找到打印页面的得到方式
//        Footer footer = sheet.getFooter();
//        footer.setCenter( "第" + HeaderFooter.page() + "页,共 " + HeaderFooter.numPages()+"页" );
//        footer.setCenter(sheet.);//循环人员Object name = personnelJo.get("name");JSONArray catalogueJa = (JSONArray) JSONObject.toJSON(personnelJo.get("catalogueJa"));//第一行,表名SXSSFRow oneRow = sheet.createRow(0); //列头 rowIndex =1SXSSFCell cell = oneRow.createCell(0);cell.setCellValue("人事档案目录");CellStyle cellStyle = workbook.createCellStyle();Font font = workbook.createFont();font.setFontHeightInPoints((short) 15);font.setBold(true);cellStyle.setFont(font);cellStyle.setAlignment(HorizontalAlignment.CENTER);cell.setCellStyle(cellStyle);//合并单元格sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headers.length - 1));//第二行,姓名SXSSFRow nameRow = sheet.createRow(1); //列头 rowIndex =1SXSSFCell nameCell = nameRow.createCell(0);nameCell.setCellValue("姓名:" + name);//合并单元格sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, headers.length - 1));//第三行,表头SXSSFRow headerOne = sheet.createRow(2); //列头 rowIndex =1SXSSFRow headerTwo = sheet.createRow(3); //列头 rowIndex =1for (int i = 0; i < headers.length; i++) {SXSSFCell cell1 = headerOne.createCell(i);cell1.setCellValue(headers[i]);SXSSFCell cell2 = headerTwo.createCell(i);cell2.setCellValue(headers[i]);cell1.setCellStyle(borderstyle);cell2.setCellStyle(borderstyle);}SXSSFCell dateCell = headerOne.createCell(2);dateCell.setCellValue("材料形成日期");dateCell.setCellStyle(borderstyle);sheet.addMergedRegion(new CellRangeAddress(2, 3, 0, 0));sheet.addMergedRegion(new CellRangeAddress(2, 3, 1, 1));sheet.addMergedRegion(new CellRangeAddress(2, 2, 2, 4));sheet.addMergedRegion(new CellRangeAddress(2, 3, 5, 5));sheet.addMergedRegion(new CellRangeAddress(2, 3, 6, 6));//生成表格内容updateCell(catalogueJa, sheet, properties,datePattern, borderstyle, headers, workbook, name, centerCellStyle);try {workbook.write(out);workbook.close();
//            boolean flag =  workbook.dispose();//释放磁盘空间。处理在磁盘上支持这个工作簿的临时文件。调用该方法将使工作簿不可用。
//            System.out.println(flag);//如果所有临时文件都被成功删除,则为真。} catch (IOException e) {e.printStackTrace();}}
  /*** @param catalogueJa, sheet, properties, datePattern, borderstyle* @return void* @Description :导出人事档案目录-生成表格内容* @author caohong* @date 2021/11/3*/private static void updateCell(JSONArray catalogueJa,SXSSFSheet sheet, String[] properties,String datePattern, CellStyle borderstyle,String[] headers, SXSSFWorkbook workbook,Object name,CellStyle centerCellStyle) {// 遍历集合数据,产生数据行int rowIndex = 4;//记录打印时每页行数int printRow = 0;//记录打印时每页总行数int totalRow = 40;//页码int page = 1;ArrayList<String> noArr = creatTitle();for (Object object : catalogueJa) {JSONObject catalogueJo = (JSONObject) JSONObject.toJSON(object);SXSSFRow dataRow = sheet.createRow(rowIndex);for (int i = 0; i < properties.length; i++) {Object o = catalogueJo.get(properties[i]);String cellValue = "";if (o == null) cellValue = "";else if (o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);else if (o instanceof Float || o instanceof Double)cellValue = new BigDecimal(o.toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString();else cellValue = o.toString();if (i == 0 && noArr.indexOf(cellValue) > -1) {if (printRow < totalRow) {int j = totalRow - printRow;//处理空行for (int k = 1; k < j; k++) {SXSSFRow dataRowBlank = sheet.createRow(rowIndex++);for (int a = 0; a < properties.length; a++) {if (k == 1) {SXSSFCell newCell = dataRow.createCell(a);//设置边框newCell.setCellStyle(borderstyle);}SXSSFCell newCell = dataRowBlank.createCell(a);//设置边框newCell.setCellStyle(borderstyle);}}}//页尾SXSSFRow endRow = sheet.createRow(rowIndex);SXSSFCell pgaeCell = endRow.createCell(0);pgaeCell.setCellValue("第" + page + "页");pgaeCell.setCellStyle(centerCellStyle);//合并单元格sheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 0, headers.length - 1));rowIndex = rowIndex + 1;//设置在特定行的添加分页符sheet.setRowBreak(rowIndex - 1);//添加分页符之后,重置打印行数printRow = 0;//第一行,表名SXSSFRow oneRow = sheet.createRow(rowIndex); //列头 rowIndex =1SXSSFCell cell = oneRow.createCell(0);cell.setCellValue("人事档案目录");CellStyle cellStyle = workbook.createCellStyle();Font font = workbook.createFont();font.setFontHeightInPoints((short) 15);font.setBold(true);cellStyle.setFont(font);cellStyle.setAlignment(HorizontalAlignment.CENTER);cell.setCellStyle(cellStyle);//合并单元格sheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 0, headers.length - 1));//第二行,姓名SXSSFRow nameRow = sheet.createRow(rowIndex + 1); //列头 rowIndex =1SXSSFCell nameCell = nameRow.createCell(0);nameCell.setCellValue("姓名:" + name);//合并单元格sheet.addMergedRegion(new CellRangeAddress(rowIndex + 1, rowIndex + 1, 0, headers.length - 1));//第三行,表头SXSSFRow headerOne = sheet.createRow(rowIndex + 2); //列头SXSSFRow headerTwo = sheet.createRow(rowIndex + 3); //列头for (int b = 0; b < headers.length; b++) {SXSSFCell cell1 = headerOne.createCell(b);cell1.setCellValue(headers[b]);SXSSFCell cell2 = headerTwo.createCell(b);cell2.setCellValue(headers[b]);cell1.setCellStyle(borderstyle);cell2.setCellStyle(borderstyle);}SXSSFCell dateCell = headerOne.createCell(2);dateCell.setCellValue("材料形成日期");dateCell.setCellStyle(borderstyle);sheet.addMergedRegion(new CellRangeAddress(rowIndex + 2, rowIndex + 3, 0, 0));sheet.addMergedRegion(new CellRangeAddress(rowIndex + 2, rowIndex + 3, 1, 1));sheet.addMergedRegion(new CellRangeAddress(rowIndex + 2, rowIndex + 2, 2, 4));sheet.addMergedRegion(new CellRangeAddress(rowIndex + 2, rowIndex + 3, 5, 5));sheet.addMergedRegion(new CellRangeAddress(rowIndex + 2, rowIndex + 3, 6, 6));//加表头行数rowIndex = rowIndex + 4;//生成dataRow = sheet.createRow(rowIndex);page++;}SXSSFCell newCell = dataRow.createCell(i);//填充内容newCell.setCellValue(cellValue);//设置边框newCell.setCellStyle(borderstyle);}rowIndex++;printRow++;}if (printRow < totalRow) {int j = totalRow - printRow;//处理空行for (int k = 1; k < j; k++) {SXSSFRow dataRowBlank = sheet.createRow(rowIndex);for (int a = 0; a < properties.length; a++) {SXSSFCell newCell = dataRowBlank.createCell(a);//设置边框newCell.setCellStyle(borderstyle);}rowIndex++;}}//页尾SXSSFRow endRow = sheet.createRow(rowIndex);SXSSFCell pgaeCell = endRow.createCell(0);pgaeCell.setCellValue("第" + page + "页");pgaeCell.setCellStyle(centerCellStyle);//合并单元格sheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 0, headers.length - 1));//取消excel默认的自动分页,打印时将excel文件打印在pdf的一页中。sheet.setAutobreaks(true);}
项目引用
<poi.version>3.17</poi.version><!-- poi office --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>${poi.version}</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-examples</artifactId><version>${poi.version}</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>${poi.version}</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>${poi.version}</version></dependency>

java SXSSF 导出excel 合并单元格,设置打印分页相关推荐

  1. java POI导出excel,合并单元格边框消失

    业务是导出一个报表,要求有一个跨多列的表头,肯定要用到合并单元格,但合并后边框消失.网上的一些解决办法是重写合并单元格方法,但弄清楚原因后,其实没必要. 原来是这样的: 合并后就第一个有边框,其余全成 ...

  2. springboot项目导出excel 合并单元格表格

    springboot项目导出excel 合并单元格表格 导出效果 业务controller 业务数据 业务实体类 注解MyExcel.java 注解 MyExcels 导出工具类MyExcelUtil ...

  3. Java POI 对Excel合并单元格的数据处理

    Java POI 对Excel合并单元格的数据处理 最近在项目开发过程中,有个一个导入Excel文件处理合并单元格数据的需求,就自己在网上找了一个模板,自己进行二次开发来开发需求. Excel工具类 ...

  4. java导出excel合并单元格

    今天是2018最后一天了,废话就不多说了直接上干货吧! 1.java导出excel用到POI所有jar包 ,大家可以直接到下面地址下载点击打开链接 2.导出excel的方法 package org; ...

  5. poi导出Excel合并单元格、设置打印参数页眉页脚等

    由于生成文件不能落地,使用SXSSFWorkBook来对excel的导出工作 生成excel步骤: 1.创建workbook SXSSFWorkbook workbook=new SXSSFWorkb ...

  6. java导出excel 边框不全_POI 导出Excel合并单元格后部分边框不显示

    用户需要导出自定义表格,其中合并单元格样式遇到的问题,合并后只显示第一行第一列的边框,其他边框不显示,于是遍查百度,寻到一点思路 ①了解Excel绘制原理 ②了解绘制Excel顺序 ③绘制Excel单 ...

  7. jxl操作excel(合并单元格,设置背景色,字体颜色)

    现在正在做的项目中涉及大量的Excel文件导出导入操作,都是使用Java Excel来操作. Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Exce ...

  8. POI导出EXCEL合并单元格对象嵌套List数据

    导出EXCEL 在实际的开发过程当中,我们会遇到一些比较复杂的导出需求,例如需要导出的实体类中需要嵌套集合对象等,正好最近碰到了所以分享出来,希望对大家有帮助 一.POI是什么 简单的说就是Apach ...

  9. JXL导出EXCEL合并单元格、文字对齐方式 .

    public void createNoLotteryAlarmExcel(String filePath,String fileName,List<NoLotteryAlarm> ala ...

最新文章

  1. 求未知数X最临近的能被某个数字N整除的数
  2. 【Eclipse 插件】JD-Eclipse
  3. 通过rsync清除目录的shell脚本
  4. python圆的半径计算圆的周长列表_python计算圆周长、面积、球体体积并画出圆
  5. pip时read time out
  6. C语言从未排序的链接列表中删除重复项的算法(附完整源码)
  7. 第十一章 “她”值多少钱
  8. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十一)地图遮罩层的实现
  9. 1434 区间LCM
  10. IE无法正常显示中文名图片
  11. BackgroundWorker简单实用(简便的异步操作)
  12. chrome样式不生效_Chrome开发者工具的11个使用技巧
  13. ODOO从哪里开始??OpenERP的第一根线头儿
  14. Atitit.一些公司的开源项目 重大知名开源项目attilax总结
  15. 北京有两个百度,李彦宏只有一个陆奇
  16. 接口规范性测试标准规范—详细
  17. python桌面程序臃肿_危险的转变:Python正在从简明转向臃肿,从实用转向媚俗
  18. 基于百度api接口的车辆识别计费系统
  19. 解决电脑某些网站打不开的问题
  20. statfs结构体和函数详解——例程

热门文章

  1. 程序员成语:不好!语文老师的棺材板快要压不住了!
  2. 小四年级下册计算机教学计划,小学信息技术四年级下册教学计划书
  3. 【总结】从视频到图文,代码实战,有三AI-GAN学习资料汇总!
  4. Linux学习笔记07_搜索查找类和管道符
  5. Rmq https://blog.csdn.net/qq_44858230/article/details/114881302
  6. 命,是弱者的借口。运,是强者的谦辞。
  7. spring初始化源码浅析之代码浅析
  8. 鲜为人知的好用网站合集(一)
  9. 海洋主题绘画_海底世界主题绘画教案
  10. tp5.1接入支付宝支付接口