POI导出复杂的excel;excel公共样式类;excel拼接定制类;数据科学计数法转为普通值
Posted abc8023
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POI导出复杂的excel;excel公共样式类;excel拼接定制类;数据科学计数法转为普通值相关的知识,希望对你有一定的参考价值。
一、excel公共样式类(包含数据科学计数法转为普通值)
package com.thinkgem.jeesite.common.utils.excel; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.hssf.util.Region; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.DataFormatter; import org.apache.poi.ss.usermodel.Font; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.text.DecimalFormat; /** * EXCEL报表工具类. * * @author Jeelon */ public class ExportComplexExcel { private HSSFWorkbook wb = null; private HSSFSheet sheet = null; public HSSFSheet getSheet() { return sheet; } public void setSheet(HSSFSheet sheet) { this.sheet = sheet; } public HSSFWorkbook getWb() { return wb; } public void setWb(HSSFWorkbook wb) { this.wb = wb; } /** * @param wb * @param sheet */ public ExportComplexExcel(HSSFWorkbook wb, HSSFSheet sheet) { // super(); sheet.setColumnWidth((short)0, (short)(10)); sheet.setColumnWidth((short)1, (short)(10)); sheet.setColumnWidth((short)2, (short)(400*10)); sheet.setColumnWidth((short)3, (short)(300*10)); sheet.setColumnWidth((short)4, (short)(400*10)); sheet.setColumnWidth((short)5, (short)(400*10)); sheet.setColumnWidth((short)6 ,(short)(300*10)); sheet.setColumnWidth((short)7 ,(short)(300*10)); sheet.setColumnWidth((short)8 ,(short)(300*10)); sheet.setColumnWidth((short)9, (short)(300*10)); sheet.setColumnWidth((short)10, (short)(300*10)); sheet.setColumnWidth((short)11, (short)(300*10)); sheet.setColumnWidth((short)12, (short)(300*10)); sheet.setColumnWidth((short)13, (short)(300*10)); sheet.setColumnWidth((short)14, (short)(300*10)); sheet.setZoom(4,5); this.wb = wb; this.sheet = sheet; } /** * 创建通用EXCEL头部 --居中 加粗字体 合并单元格 * @param headString 头部字符 * @param colfrom 起始列 * @param colto 结束列 * @param rowfrom 起始行数,最小从0开始 * @param rowto 结束行数,最小从0开始 * @author lushiqin */ public void createNormalHead(String headString, int colfrom,int colto,int rowfrom ,int rowto,int intfont) { HSSFRow row = sheet.createRow(rowfrom); //row.setHeightInPoints(20); // 设置第一行 HSSFCell cell = row.createCell(colfrom); row.setHeight((short) intfont); // 定义单元格为字符串类型 cell.setCellType(HSSFCell.ENCODING_UTF_16);// 中文处理 cell.setCellValue(new HSSFRichTextString(headString)); // 指定合并区域 /** * public Region(int rowFrom, short colFrom, int rowTo, short colTo) */ sheet.addMergedRegion(new Region((short)rowfrom, (short)colfrom, (short)rowto, (short) colto)); // 定义单元格格式,添加单元格表样式,并添加到工作簿 HSSFCellStyle cellStyle = wb.createCellStyle(); // 设置单元格水平对齐类型 cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT); // 指定单元格居中对齐 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐 cellStyle.setWrapText(true);// 指定单元格自动换行 // 设置单元格字体 HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setFontName("微软雅黑"); font.setFontHeightInPoints((short)12); font.setFontHeight((short)intfont); cellStyle.setFont(font); cell.setCellStyle(cellStyle); } /** * 创建通用EXCEL头部 --居左 加粗字体 合并单元格 * @param headString 头部字符 * @param colfrom 起始列 * @param colto 结束列 * @param rowfrom 起始行数,最小从0开始 * @param rowto 结束行数,最小从0开始 * @author lushiqin */ public void createHead(String headString, int colfrom,int colto,int rowfrom ,int rowto,int intfont) { HSSFRow row = sheet.createRow(rowfrom); //row.setHeightInPoints(20); // 设置第一行 HSSFCell cell = row.createCell(colfrom); row.setHeight((short) intfont); // 定义单元格为字符串类型 cell.setCellType(HSSFCell.ENCODING_UTF_16);// 中文处理 cell.setCellValue(new HSSFRichTextString(headString)); // 指定合并区域 /** * public Region(int rowFrom, short colFrom, int rowTo, short colTo) */ sheet.addMergedRegion(new Region((short)rowfrom, (short)colfrom, (short)rowto, (short) colto)); // 定义单元格格式,添加单元格表样式,并添加到工作簿 HSSFCellStyle cellStyle = wb.createCellStyle(); // 设置单元格水平对齐类型 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐 cellStyle.setWrapText(true);// 指定单元格自动换行 // 设置单元格字体 HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setFontName("微软雅黑"); font.setFontHeightInPoints((short)12); font.setFontHeight((short)intfont); cellStyle.setFont(font); cell.setCellStyle(cellStyle); } /** * 设置报表标题 * * @param rowfrom 标题字符串数组 * @param colfrom 列起始 * @param colto 列终止 * @param top 单元格的top-border值 * @param bottom 单元格的bottom-border值 * @param left 单元格的left-border值 * @param right 单元格的right-border值 * @param color 背景颜色的index值 0为不设置,10为红色,8为黑色 具体的值可以参考HSSFColor类 * @author lushiqin */ //---unused--- public void setRowCellStyle(int rowfrom, int colfrom, int colto, int top, int bottom, int left, int right, int color) { HSSFRow row = sheet.createRow(rowfrom); row.setHeightInPoints(20); // 定义单元格格式,添加单元格表样式,并添加到工作簿 HSSFCellStyle cellStyle = wb.createCellStyle(); // 设置单元格水平对齐类型 /*cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐 cellStyle.setWrapText(true);// 指定单元格自动换行*/ cellStyle.setBorderBottom((short) bottom); cellStyle.setBorderTop((short) top); cellStyle.setBorderLeft((short) left); cellStyle.setBorderRight((short) right); if (color != 0) { cellStyle.setFillBackgroundColor((short) color); } // 多一行的多列,进行设置格式 for (int i = colfrom; i <= colto; i++) { HSSFCell cell = row.createCell(i); cell.setCellStyle(cellStyle); } } /** * 设置数据报表的头部行 --灰色底 字体加粗 居中 * @param columHeader 标题字符串数组 * @param row 文数据从哪一行开始 * @author lushiqin */ public void createColumHeader(String[] columHeader,int row, int colfrom,int colto) { // 设置列头 在第三行 HSSFRow row2 = sheet.createRow(row); // 指定行高 row2.setHeight((short) 350); HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐 cellStyle.setWrapText(true);// 指定单元格自动换行 // 单元格字体 HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setFontName("宋体"); font.setFontHeight((short) 150); cellStyle.setFont(font); // 设置单元格背景色 cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); HSSFCell cell3 = null; for (int i = colfrom; i <=colto; i++) { cell3 = row2.createCell(i); cell3.setCellType(HSSFCell.ENCODING_UTF_16); cell3.setCellStyle(cellStyle); cell3.setCellValue(new HSSFRichTextString(columHeader[i-colfrom])); } } /** * 创建单元格 可指定颜色的index 居左-加粗 * @param row 标题字符串数组 * @param col 列 * @param value 单元格的值 * @param color 字体颜色设置 // 常用颜色的index值 red:10 green:17 normal:32767 * @author lushiqin */ public HSSFCell createCell(HSSFRow row, int col,Object value,int color,int celltype) { HSSFCell cell = row.createCell(col); HSSFCellStyle datastyle = wb.createCellStyle(); HSSFFont font = wb.createFont(); font.setFontName("微软雅黑"); font.setFontHeight((short)180); font.setColor((short)color); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); datastyle.setFont(font); //字体样式设置 datastyle.setAlignment(HSSFCellStyle.ALIGN_LEFT); // 指定单元格居中对齐 cell.setCellType(HSSFCell.ENCODING_UTF_16); cell.setCellStyle(datastyle); //cell.setCellType(celltype); cell.setCellValue(String.valueOf(value)); return cell; } /** * 数据科学计数转Double * @param data * @return */ public static Double scientificJudge(Object data){ String str =data.toString(); if(str.contains(".") && str.contains("E")){ BigDecimal db = new BigDecimal(str); System.out.println("--db.toPlainString()--"+db.doubleValue()); return db.doubleValue(); }else{ return Double.valueOf(str); } } /** * 科学记数转整数 * @param str * @return */ public static String scientificJudge(String str){ if(str.contains(".") && str.contains("E")){ BigDecimal db = new BigDecimal(str); return db.toPlainString(); }else{ return str; } } /** * 创建单元格 可指定单元格的样式 转换数据显示格式 整数和小数的显示样式 * @param row 标题字符串数组 * @param col 列 * @param data 单元格的值 * @param contextstyle 传入样式 * @author lushiqin */ public HSSFCell createCell(HSSFRow row, int col,Object data,CellStyle contextstyle,int celltype) { HSSFCell contentCell = row.createCell(col); contentCell.setCellType(HSSFCell.CELL_TYPE_STRING); //System.out.println("--data--"+data); //System.out.println("--data.toString()--"+data.toString()); Boolean isNum = false;//data是否为数值型 Boolean isInteger=false;//data是否为整数 Boolean isPercent=false;//data是否为百分数 int length=0; if (data != null || "".equals(data)) { //判断data是否为数值型 isNum = data.toString().matches("^(-?\\d+)(\\.\\d+)?$"); //判断data是否为整数(小数部分是否为0) isInteger=data.toString().matches("^[-\\+]?[\\d]*$"); //判断data是否为百分数(是否包含“%”) isPercent=data.toString().contains("%"); } //如果单元格内容是数值类型,涉及到金钱(金额、本、利),则设置cell的类型为数值型,设置data的类型为数值类型 if (isNum && !isPercent) { HSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式 if (isInteger) { contextstyle.setDataFormat(df.getBuiltinFormat("#,##0"));//数据格式只显示整数 /*contextstyle.setDataFormat(df.getFormat("@"));//数据格式只显示整数 DecimalFormat df2 = new DecimalFormat("0"); String whatYourWant = df2.format(contentCell.getNumericCellValue()); contentCell.setCellValue(whatYourWant);*/ contentCell.setCellStyle(contextstyle); } // else if (Double.parseDouble(data.toString())<1) { // contextstyle.setDataFormat(df.getBuiltinFormat("0.00%"));//数据格式只显示整数 // // 设置单元格格式 // contentCell.setCellStyle(contextstyle); // // 设置单元格内容为double类型 // contentCell.setCellValue(Double.parseDouble(data.toString())); // // } else if (Double.parseDouble(data.toString())>=1){ // contextstyle.setDataFormat(df.getFormat("@"));//text类型 contextstyle.setDataFormat(df.getBuiltinFormat("#,##0.00"));//保留两位小数点 // 设置单元格格式 contentCell.setCellStyle(contextstyle); // 设置单元格内容为double类型 contentCell.setCellValue(Double.parseDouble(data.toString())); /* DataFormatter formatter = new DataFormatter(); String var_name = formatter.formatCellValue(contentCell); //System.out.println("--var_name--"+var_name); contentCell.setCellValue(var_name);*/ /* DecimalFormat df2 = new DecimalFormat("#,##0.00"); String whatYourWant = df2.format(contentCell.getNumericCellValue()); //contentCell.setCellStyle(contextstyle); contentCell.setCellValue(whatYourWant);*/ } } else if(data.toString().contains(".") && data.toString().contains("E")){ BigDecimal db = new BigDecimal(data.toString()); HSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式 contextstyle.setDataFormat(df.getBuiltinFormat("#,##0.00"));//保留两位小数点 // 设置单元格格式 contentCell.setCellStyle(contextstyle); // 设置单元格内容为double类型 //contentCell.setCellValue(Double.parseDouble(data.toString())); contentCell.setCellValue(scientificJudge(data)); } else { contentCell.setCellStyle(contextstyle); // 设置单元格内容为字符型 contentCell.setCellValue(data.toString()); } return contentCell; } public HSSFCell createPonitCell(HSSFRow row, int col,Object data,HSSFCellStyle contextstyle,int celltype) { HSSFCell contentCell = row.createCell(col); //HSSFCellStyle contextstyle = wb.createCellStyle(); // 设置单元格字体 HSSFFont font = wb.createFont(); font.setFontName("微软雅黑"); font.setFontHeight((short)180); contextstyle.setFont(font); //字体样式设置 contextstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐 contentCell.setCellType(HSSFCell.ENCODING_UTF_16); Boolean isNum = false;//data是否为数值型 Boolean isInteger=false;//data是否为整数 Boolean isPercent=false;//data是否为百分数 int length=0; if (data != null || "".equals(data)) { //判断data是否为数值型 isNum = data.toString().matches("^(-?\\d+)(\\.\\d+)?$"); //判断data是否为整数(小数部分是否为0) isInteger=data.toString().matches("^[-\\+]?[\\d]*$"); //判断data是否为百分数(是否包含“%”) isPercent=data.toString().contains("%"); } if (isNum && !isPercent) { HSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式 contextstyle.setDataFormat(df.getBuiltinFormat("0.00%"));//数据格式只显示整数 // 设置单元格格式 contentCell.setCellStyle(contextstyle); // 设置单元格内容为double类型 contentCell.setCellValue(Double.parseDouble(data.toString())); } else { contentCell.setCellStyle(contextstyle); // 设置单元格内容为字符型 contentCell.setCellValue(data.toString()); } return contentCell; } public HSSFCell createPonitCell(HSSFRow row, int col,Object data,int celltype) { HSSFCell contentCell = row.createCell(col); HSSFCellStyle contextstyle = wb.createCellStyle(); // 设置单元格字体 HSSFFont font = wb.createFont(); font.setFontName("微软雅黑"); font.setFontHeight((short)180); contextstyle.setFont(font); //字体样式设置 contextstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐 contentCell.setCellType(HSSFCell.ENCODING_UTF_16); Boolean isNum = false;//data是否为数值型 Boolean isInteger=false;//data是否为整数 Boolean isPercent=false;//data是否为百分数 int length=0; if (data != null || "".equals(data)) { //判断data是否为数值型 isNum = data.toString().matches("^(-?\\d+)(\\.\\d+)?$"); //判断data是否为整数(小数部分是否为0) isInteger=data.toString().matches("^[-\\+]?[\\d]*$"); //判断data是否为百分数(是否包含“%”) isPercent=data.toString().contains("%"); } if (isNum && !isPercent) { HSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式 contextstyle.setDataFormat(df.getBuiltinFormat("0.00%"));//数据格式只显示整数 // 设置单元格格式 contentCell.setCellStyle(contextstyle); // 设置单元格内容为double类型 contentCell.setCellValue(Double.parseDouble(data.toString())); } else { contentCell.setCellStyle(contextstyle); // 设置单元格内容为字符型 contentCell.setCellValue(data.toString()); } return contentCell; } /** * 写入EXCEL文件 * @param fileName 文件名 * @author lushiqin */ public void outputExcel(String fileName) { FileOutputStream fos = null; try { fos = new FileOutputStream(new File(fileName)); wb.write(fos); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 创建通用报表第二行 * * @param params * 统计条件数组 * @param colfrom * 需要合并的起始列 * @param colfrom * 需要合并的结束列 * @param rowfrom * 指定起始行 * @param rowto * 指定结束行 */ @SuppressWarnings("deprecation") public void createNormalTwoRow(String[] params, int colfrom,int colto,int rowfrom ,int rowto) { // 创建第二行 HSSFRow row1 = sheet.createRow(rowfrom); row1.setHeight((short) 400); HSSFCell cell2 = row1.createCell(0); cell2.setCellType(HSSFCell.ENCODING_UTF_16); cell2.setCellValue(new HSSFRichTextString("时间:" + params[0] + "至" + params[1])); // 指定合并区域 /** * public Region(int rowFrom, short colFrom, int rowTo, short colTo) */ sheet.addMergedRegion(new Region(rowfrom, (short) colfrom, rowto, (short) colto)); HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐 cellStyle.setWrapText(true);// 指定单元格自动换行 // 设置单元格字体 HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setFontName("宋体"); font.setFontHeight((short) 250); cellStyle.setFont(font); cell2.setCellStyle(cellStyle); } /** * 创建内容单元格 * * @param wb * HSSFWorkbook * @param row * HSSFRow * @param col * short型的列索引 * @param align * 对齐方式 * @param val * 列值 */ public void createCell(HSSFWorkbook wb, HSSFRow row, int col, short align, String val) { HSSFCell cell = row.createCell(col); cell.setCellType(HSSFCell.ENCODING_UTF_16); cell.setCellValue(new HSSFRichTextString(val)); HSSFCellStyle cellstyle = wb.createCellStyle(); cellstyle.setAlignment(align); cell.setCellStyle(cellstyle); } /** * 创建合计行 * * @param colSum * 需要合并到的列索引 * @param cellValue */ @SuppressWarnings("deprecation") public void createLastSumRow(int colSum, String[] cellValue) { HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐 cellStyle.setWrapText(true);// 指定单元格自动换行 // 单元格字体 HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setFontName("宋体"); font.setFontHeight((short) 250); cellStyle.setFont(font); // 获取工作表最后一行 HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1)); HSSFCell sumCell = lastRow.createCell(0); sumCell.setCellValue(new HSSFRichTextString("合计")); sumCell.setCellStyle(cellStyle); // 合并 最后一行的第零列-最后一行的第一列 sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short) 0, sheet.getLastRowNum(), (short) colSum));// 指定合并区域 for (int i = 2; i < (cellValue.length + 2); i++) { // 定义最后一行的第三列 sumCell = lastRow.createCell(i); sumCell.setCellStyle(cellStyle); // 定义数组 从0开始。 sumCell.setCellValue(new HSSFRichTextString(cellValue[i - 2])); } } }
二、excel拼接公共类
public void importExcelTest(String gameId,String gameName ,String filepath,String date,String date1 ,String date2,String month){ //创建excel对象和sheet表单 HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); ExportComplexExcel exportExcel = new ExportComplexExcel(wb, sheet); // 单元格样式 HSSFCellStyle datastyle = wb.createCellStyle(); HSSFCellStyle boldstyle = wb.createCellStyle(); // 设置单元格字体 HSSFFont font = wb.createFont(); font.setFontName("微软雅黑"); font.setFontHeight((short)180); datastyle.setFont(font); //字体样式设置 datastyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐 HSSFFont font2 = wb.createFont(); font2.setFontName("微软雅黑"); font2.setFontHeight((short)180); font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); boldstyle.setFont(font2); boldstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐 HSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式 //datastyle.setDataFormat(df.getBuiltinFormat("#.00"));//保留两位小数点 //获取excel表格数据 // 创建表单头部 exportExcel.createHead(gameName,2,18,1,1,600); // 创建表单中部 /*exportExcel.createNormalHead("数据说",10,11,4,6,400); exportExcel.setRowCellStyle(3,10,11,0,20,0,0,0); exportExcel.setRowCellStyle(5,4,9,0,10,0,0,0); exportExcel.setRowCellStyle(5,12,21,0,10,0,0,0);*/ //设置小标题 exportExcel.createNormalHead("关键数据",2,3,4,4,300); HSSFRow row5 = sheet.createRow(5); // exportExcel.createCell(row5,4,"日期:",32767,1); //exportExcel.createCell(row5,5,date1,datastyle,1); DayStats todayDay=dayStatsService.queryTodayDayStats(gameId,date1); DayStats lastDay=dayStatsService.queryTodayDayStats(gameId,date2); HSSFRow row6 = sheet.createRow(6); HSSFRow row7 = sheet.createRow(7); HSSFRow row8 = sheet.createRow(8); exportExcel.createCell(row5,5,"新增设备:",32767,1); exportExcel.createCell(row5,8,"登录用户:",32767,1); exportExcel.createCell(row5,11,"充值金额:",32767,1); exportExcel.createCell(row6,4,date1,32767,1); exportExcel.createCell(row6,7,date1,32767,1); exportExcel.createCell(row6,10,date1,32767,1); exportExcel.createCell(row7,4,date2,32767,1); exportExcel.createCell(row7,7,date2,32767,1); exportExcel.createCell(row7,10,date2,32767,1); exportExcel.createCell(row8,4,"环比",32767,1); exportExcel.createCell(row8,7,"环比",32767,1); exportExcel.createCell(row8,10,"环比",32767,1); if (todayDay!=null){ exportExcel.createCell(row6,5,todayDay.getDayDeviceRegNum()==null?"":todayDay.getDayDeviceRegNum(),32767,1); exportExcel.createCell(row6,8,todayDay.getDayLoginNum()==null?"":todayDay.getDayLoginNum(),32767,1); exportExcel.createCell(row6,11,todayDay.getDayPayment()==null?"":todayDay.getDayPayment(),32767,1); exportExcel.createCell(row7,5,lastDay.getDayDeviceRegNum()==null?"":lastDay.getDayDeviceRegNum(),32767,1); exportExcel.createCell(row7,8,lastDay.getDayLoginNum()==null?"":lastDay.getDayLoginNum(),32767,1); exportExcel.createCell(row7,11,lastDay.getDayPayment()==null?"":lastDay.getDayPayment(),32767,1); if(lastDay!=null){ double divDevice=(todayDay.getDayDeviceRegNum()==null?0:todayDay.getDayDeviceRegNum())-(lastDay.getDayDeviceRegNum()==null?0:lastDay.getDayDeviceRegNum()); double divLoginNum=(todayDay.getDayLoginNum()==null?0:todayDay.getDayLoginNum())-(lastDay.getDayLoginNum()==null?0:lastDay.getDayLoginNum()); double divPayment=(todayDay.getDayPayment()==null?0:todayDay.getDayPayment())-(lastDay.getDayPayment()==null?0:lastDay.getDayPayment()); String divDevicePoint="0.01%"; String divLoginNumPoint="0.01%"; String divPaymentPoint="0.01%"; String flag1=""; String flag2=""; String flag3=""; NumberFormat nt = NumberFormat.getPercentInstance(); //设置百分数精确度2即保留两位小数 nt.setMinimumFractionDigits(2); if(lastDay.getDayDeviceRegNum()!=null&&lastDay.getDayDeviceRegNum()>0){ divDevicePoint=nt.format(divDevice/lastDay.getDayDeviceRegNum()); } if(lastDay.getDayLoginNum()!=null&&lastDay.getDayLoginNum()>0){ divLoginNumPoint=nt.format(divLoginNum/lastDay.getDayLoginNum()); } if(lastDay.getDayPayment()!=null&&lastDay.getDayPayment()>0){ divPaymentPoint=nt.format(divPayment/lastDay.getDayPayment()); } if(divDevice>0){ flag1="+"; exportExcel.createCell(row8,5,flag1+divDevicePoint,10,1); }else if(divDevice<=0){ flag1=""; exportExcel.createCell(row8,5,flag1+divDevicePoint,17,1); } if(divLoginNum>0){ flag2="+"; exportExcel.createCell(row8,8,flag2+divLoginNumPoint,10,1); }else if(divLoginNum<=0){ flag2=""; exportExcel.createCell(row8,8,flag2+divLoginNumPoint,17,1); } if(divPayment>0){ flag3="+"; exportExcel.createCell(row8,11,flag3+divPaymentPoint,10,1); }else if(divPayment<=0){ flag3=""; exportExcel.createCell(row8,11,flag3+divPaymentPoint,17,1); } } } exportExcel.createNormalHead("基础数据",2,3,9,9,300); //设置表格的表头 String[] params={"日期","新增设备","登录用户","充值金额","ARPPU","付费率","ARPU","新用户ARPPU","老用户ARPPU" ,"新用户付费率","老用户付费率","次日留存率","3日留存率","7日留存率","14日留存率","30日留存率","30日LTV"}; exportExcel.createColumHeader(params,10,2,18); //按天汇总数据 List<DayStats> list=dayStatsService.queryDayStats(gameId,date); logger.info("--按天汇总数据条数--"+list.size()); int rows= list.size(); for(int i = 0; i < rows; i++ ){ boolean isHidden=false; DayStats item=list.get(i); HSSFRow row =row = sheet.createRow(i+11); String mydate=item.getStatDate(); //2018-06-14 logger.info("-----month-----"+month); logger.info("-----mydate.startsWith(month)-----"+mydate.startsWith(month)); if(!mydate.startsWith(month)&&mydate.length()==10){ row.setZeroHeight(true); exportExcel.createCell(row,2,mydate,datastyle,0); exportExcel.createCell(row,3,item.getDayDeviceRegNum()==null?"":item.getDayDeviceRegNum(),datastyle,1); exportExcel.createCell(row,4,item.getDayLoginNum()==null?"":item.getDayLoginNum(),datastyle,1); exportExcel.createCell(row,5,item.getDayPayment()==null?"":item.getDayPayment(),datastyle,1); exportExcel.createCell(row,6,item.getArppu()==null?"":item.getArppu(),datastyle,1); //exportExcel.createPonitCell(row,7,item.getPermeability()==null?"":item.getPermeability(),datastyle,1); exportExcel.createCell(row,7,item.getPermeability()==null?"": String.format("%.2f",item.getPermeability()*100)+"%",datastyle,1); exportExcel.createCell(row,8,item.getArpu()==null?"":item.getArpu(),datastyle,1); exportExcel.createCell(row,9,item.getArppuNewuser()==null?"":item.getArppuNewuser(),datastyle,1); exportExcel.createCell(row,10,item.getArppuOlduser()==null?"":item.getArppuOlduser(),datastyle,1); exportExcel.createCell(row,11,item.getPermNewuser()==null?"":String.format("%.2f",item.getPermNewuser()*100)+"%",datastyle,1); exportExcel.createCell(row,12,item.getPermOlduser()==null?"":String.format("%.2f",item.getPermOlduser()*100)+"%",datastyle,1); exportExcel.createCell(row,13,item.getOneDayResidentNum()==null?"":String.format("%.2f",item.getOneDayResidentNum()*100)+"%",datastyle,1); exportExcel.createCell(row,14,item.getThreeDayResidentNum()==null?"":String.format("%.2f",item.getThreeDayResidentNum()*100)+"%",datastyle,1); exportExcel.createCell(row,15,item.getSevenDayResidentNum()==null?"":String.format("%.2f",item.getSevenDayResidentNum()*100)+"%",datastyle,1); exportExcel.createCell(row,16,item.getFourteenDayResidentNum()==null?"":String.format("%.2f",item.getFourteenDayResidentNum()*100)+"%",datastyle,1); exportExcel.createCell(row,17,item.getThirtyDayResidentNum()==null?"":String.format("%.2f",item.getThirtyDayResidentNum()*100)+"%",datastyle,1); exportExcel.createCell(row,18,item.getLtv30()==null?"":String.format("%.2f",item.getLtv30()*100)+"%",datastyle,1); } else if(mydate.length()==7){ mydate=mydate.substring(0,4)+"年"+mydate.substring(5,7)+"月汇总"; exportExcel.createCell(row,2,mydate,boldstyle,0); exportExcel.createCell(row,3,item.getDayDeviceRegNum()==null?"":item.getDayDeviceRegNum(),boldstyle,1); exportExcel.createCell(row,4,item.getDayLoginNum()==null?"":item.getDayLoginNum(),boldstyle,1); exportExcel.createCell(row,5,item.getDayPayment()==null?"":item.getDayPayment(),boldstyle,1); exportExcel.createCell(row,6,item.getArppu()==null?"":item.getArppu(),boldstyle,1); //exportExcel.createPonitCell(row,7,item.getPermeability()==null?"":item.getPermeability(),boldstyle,1); exportExcel.createCell(row,7,item.getPermeability()==null?"": String.format("%.2f",item.getPermeability()*100)+"%",boldstyle,1); exportExcel.createCell(row,8,item.getArpu()==null?"":item.getArpu(),boldstyle,1); exportExcel.createCell(row,9,item.getArppuNewuser()==null?"":item.getArppuNewuser(),boldstyle,1); exportExcel.createCell(row,10,item.getArppuOlduser()==null?"":item.getArppuOlduser(),boldstyle,1); exportExcel.createCell(row,11,item.getPermNewuser()==null?"":String.format("%.2f",item.getPermNewuser()*100)+"%",boldstyle,1); exportExcel.createCell(row,12,item.getPermOlduser()==null?"":String.format("%.2f",item.getPermOlduser()*100)+"%",boldstyle,1); exportExcel.createCell(row,13,item.getOneDayResidentNum()==null?"":String.format("%.2f",item.getOneDayResidentNum()*100)+"%",boldstyle,1); exportExcel.createCell(row,14,item.getThreeDayResidentNum()==null?"":String.format("%.2f",item.getThreeDayResidentNum()*100)+"%",boldstyle,1); exportExcel.createCell(row,15,item.getSevenDayResidentNum()==null?"":String.format("%.2f",item.getSevenDayResidentNum()*100)+"%",boldstyle,1); exportExcel.createCell(row,16,item.getFourteenDayResidentNum()==null?"":String.format("%.2f",item.getFourteenDayResidentNum()*100)+"%",boldstyle,1); exportExcel.createCell(row,17,item.getThirtyDayResidentNum()==null?"":String.format("%.2f",item.getThirtyDayResidentNum()*100)+"%",boldstyle,1); exportExcel.createCell(row,18,item.getLtv30()==null?"":String.format("%.2f",item.getLtv30()*100)+"%",boldstyle,1); } else if("总计".equals(mydate)||mydate.contains("测")){ exportExcel.createCell(row,2,mydate,boldstyle,0); exportExcel.createCell(row,3,item.getDayDeviceRegNum()==null?"":item.getDayDeviceRegNum(),boldstyle,1); exportExcel.createCell(row,4,item.getDayLoginNum()==null?"":item.getDayLoginNum(),boldstyle,1); exportExcel.createCell(row,5,item.getDayPayment()==null?"":item.getDayPayment(),boldstyle,1); exportExcel.createCell(row,6,item.getArppu()==null?"":item.getArppu(),boldstyle,1); //exportExcel.createPonitCell(row,7,item.getPermeability()==null?"":item.getPermeability(),boldstyle,1); exportExcel.createCell(row,7,item.getPermeability()==null?"": String.format("%.2f",item.getPermeability()*100)+"%",boldstyle,1); exportExcel.createCell(row,8,item.getArpu()==null?"":item.getArpu(),boldstyle,1); exportExcel.createCell(row,9,item.getArppuNewuser()==null?"":item.getArppuNewuser(),boldstyle,1); exportExcel.createCell(row,10,item.getArppuOlduser()==null?"":item.getArppuOlduser(),boldstyle,1); exportExcel.createCell(row,11,item.getPermNewuser()==null?"":String.format("%.2f",item.getPermNewuser()*100)+"%",boldstyle,1); exportExcel.createCell(row,12,item.getPermOlduser()==null?"":String.format("%.2f",item.getPermOlduser()*100)+"%",boldstyle,1); exportExcel.createCell(row,13,item.getOneDayResidentNum()==null?"":String.format("%.2f",item.getOneDayResidentNum()*100)+"%",boldstyle,1); exportExcel.createCell(row,14,item.getThreeDayResidentNum()==null?"":String.format("%.2f",item.getThreeDayResidentNum()*100)+"%",boldstyle,1); exportExcel.createCell(row,15,item.getSevenDayResidentNum()==null?"":String.format("%.2f",item.getSevenDayResidentNum()*100)+"%",boldstyle,1); exportExcel.createCell(row,16,item.getFourteenDayResidentNum()==null?"":String.format("%.2f",item.getFourteenDayResidentNum()*100)+"%",boldstyle,1); exportExcel.createCell(row,17,item.getThirtyDayResidentNum()==null?"":String.format("%.2f",item.getThirtyDayResidentNum()*100)+"%",boldstyle,1); exportExcel.createCell(row,18,item.getLtv30()==null?"":String.format("%.2f",item.getLtv30()*100)+"%",boldstyle,1); } else{ exportExcel.createCell(row,2,mydate,datastyle,0); exportExcel.createCell(row,3,item.getDayDeviceRegNum()==null?"":item.getDayDeviceRegNum(),datastyle,1); exportExcel.createCell(row,4,item.getDayLoginNum()==null?"":item.getDayLoginNum(),datastyle,1); exportExcel.createCell(row,5,item.getDayPayment()==null?"":item.getDayPayment(),datastyle,1); exportExcel.createCell(row,6,item.getArppu()==null?"":item.getArppu(),datastyle,1); //exportExcel.createPonitCell(row,7,item.getPermeability()==null?"":item.getPermeability(),datastyle,1); exportExcel.createCell(row,7,item.getPermeability()==null?"": String.format("%.2f",item.getPermeability()*100)+"%",datastyle,1); exportExcel.createCell(row,8,item.getArpu()==null?"":item.getArpu(),datastyle,1); exportExcel.createCell(row,9,item.getArppuNewuser()==null?"":item.getArppuNewuser(),datastyle,1); exportExcel.createCell(row,10,item.getArppuOlduser()==null?"":item.getArppuOlduser(),datastyle,1); exportExcel.createCell(row,11,item.getPermNewuser()==null?"":String.format("%.2f",item.getPermNewuser()*100)+"%",datastyle,1); exportExcel.createCell(row,12,item.getPermOlduser()==null?"":String.format("%.2f",item.getPermOlduser()*100)+"%",datastyle,1); exportExcel.createCell(row,13,item.getOneDayResidentNum()==null?"":String.format("%.2f",item.getOneDayResidentNum()*100)+"%",datastyle,1); exportExcel.createCell(row,14,item.getThreeDayResidentNum()==null?"":String.format("%.2f",item.getThreeDayResidentNum()*100)+"%",datastyle,1); exportExcel.createCell(row,15,item.getSevenDayResidentNum()==null?"":String.format("%.2f",item.getSevenDayResidentNum()*100)+"%",datastyle,1); exportExcel.createCell(row,16,item.getFourteenDayResidentNum()==null?"":String.format("%.2f",item.getFourteenDayResidentNum()*100)+"%",datastyle,1); exportExcel.createCell(row,17,item.getThirtyDayResidentNum()==null?"":String.format("%.2f",item.getThirtyDayResidentNum()*100)+"%",datastyle,1); exportExcel.createCell(row,18,item.getLtv30()==null?"":String.format("%.2f",item.getLtv30()*100)+"%",datastyle,1); } } int channelrow=12+rows; logger.info("--渠道详细数据起始行--"+channelrow); exportExcel.createNormalHead("渠道详情",2,3,channelrow,channelrow,300); //设置表格的表头 String[] paramsDetail={"平台","新增设备","登录用户","付费用户","充值金额","ARPPU","付费率","ARPU"}; exportExcel.createColumHeader(paramsDetail,channelrow+1,2,9); //渠道详细数据 List<DayStats> listdetail= dayStatsService.queryDayStatsDetail(gameId,date1); logger.info("--今日渠道详细数据条数--"+listdetail.size()); for(int i = 0; i < listdetail.size(); i++ ){ DayStats item=listdetail.get(i); HSSFRow row = sheet.createRow(i+channelrow+2); exportExcel.createCell(row,2,item.getChannelName()==null?"":item.getChannelName(),datastyle,0); exportExcel.createCell(row,3,item.getDayDeviceRegNum()==null?"":item.getDayDeviceRegNum(),datastyle,1); exportExcel.createCell(row,4,item.getDayLoginNum()==null?"":item.getDayLoginNum(),datastyle,1); exportExcel.createCell(row,5,item.getDayPayerNum()==null?"":item.getDayPayerNum(),datastyle,1); exportExcel.createCell(row,6,item.getDayPayment()==null?"":item.getDayPayment(),datastyle,1); exportExcel.createCell(row,7,item.getArppu()==null?"":item.getArppu(),datastyle,1); exportExcel.createCell(row,8,item.getPermeability()==null?"":String.format("%.2f",item.getPermeability()*100)+"%",datastyle,1); exportExcel.createCell(row,9,item.getArpu()==null?"":item.getArpu(),datastyle,1); } int divrow=channelrow+listdetail.size()+3; exportExcel.createNormalHead("昨、前天数据差额",2,3,divrow+1,divrow+1,300); //设置表格的表头 String[] paramsDiv={"渠道","新增设备","充值金额"}; exportExcel.createColumHeader(paramsDiv,divrow+2,2,4); //昨前对比数据 List<DayStats> listdiv= dayStatsService.queryRecentTwoDay(gameId,date1); for(int i = 0; i < listdiv.size(); i++ ){ DayStats item=listdiv.get(i); HSSFRow row = sheet.createRow(i+divrow+3); exportExcel.createCell(row,2,item.getChannelName()==null?"":item.getChannelName(),datastyle,0); exportExcel.createCell(row,3,item.getDayDeviceRegNum()==null?"":item.getDayDeviceRegNum(),datastyle,1); exportExcel.createCell(row,4,item.getDayPayment()==null?"":item.getDayPayment(),datastyle,1); } //写入excel文件 exportExcel.outputExcel(filepath); }
三、最终效果
以上是关于POI导出复杂的excel;excel公共样式类;excel拼接定制类;数据科学计数法转为普通值的主要内容,如果未能解决你的问题,请参考以下文章