可以通过该对象的set方法设置各个参数,headKey保存结果集中,数据对应的key值,ArrayList最佳,保证了导出列的顺序,同时限制了每个sheet页保存的最大数据行数为5W条,这些参数也可以放到属性中进行设置。

@Data
public class ExcelExportUtil {//表头private String title;//各个列的表头private List<String> headList;//各个列的元素key值private List<String> headKey;// 各个列的宽度private List<Integer> headWidth;//需要填充的数据信息private List<HashMap> data;//字体大小private int fontSize = 14;//行高private int rowHeight = 30;//列宽private int columWidth = 200;//工作表private String sheetName = "sheet";// 文件名private String fileName;HSSFWorkbook wb;HSSFSheet sheet;HSSFCellStyle headCellStyle;HttpServletResponse response;public ExcelExportUtil exportExport(HttpServletResponse response) throws IOException {this.response = response;wb = new HSSFWorkbook();int size = data.size();int count = (size - 1) / 50000 + 1;for (int i = 0; i < count; i++) {sheet = wb.createSheet(sheetName + (i + 1));exportExport(sheet,data.subList(i * 50000, ((i + 1) * 50000 > size ? size : 50000 * (i + 1))));}return this;}private void exportExport(HSSFSheet sheet, List<HashMap> data) throws IOException{//检查参数配置信息checkConfig();HSSFCellStyle cellStyle = wb.createCellStyle();HSSFDataFormat format = wb.createDataFormat();//这样才能真正的控制单元格格式,@就是指文本型cellStyle.setDataFormat(format.getFormat("@"));HSSFRow headRow = sheet.createRow(0);//设置列头元素for (int i = 0; i < headList.size(); i++) {Integer width = 15;if (headWidth != null && headWidth.size() >= headList.size()){width = headWidth.get(i);}sheet.setColumnWidth(i, 256 * width + 184);HSSFCell cellHead = headRow.createCell(i);cellHead.setCellValue(headList.get(i));cellHead.setCellStyle(headCellStyle);}//开始写入实体数据信息int a = 1;for (int i = 0; i < data.size(); i++) {HSSFRow row = sheet.createRow(a);HashMap map = data.get(i);HSSFCell cell;for (int j = 0; j < headKey.size(); j++) {cell = row.createCell(j);Object valueObject = map.get(headKey.get(j));if (valueObject == null) {valueObject = "";}if (valueObject instanceof Integer) {//取出的数据是Integercell.setCellValue(((Integer) (valueObject)).floatValue());} else if (valueObject instanceof BigDecimal) {//取出的数据是BigDecimalcell.setCellValue(((BigDecimal) (valueObject)).floatValue());} else {//取出的数据是字符串直接赋值cell.setCellStyle(cellStyle);cell.setCellValue(Strings.isNullOrEmpty(String.valueOf(valueObject)) ? "" : String.valueOf(valueObject));}}a++;}}public void flushExplorer() throws Exception{// 告诉浏览器用什么软件可以打开此文件response.setHeader("content-Type", "application/vnd.ms-excel");// 下载文件的默认名称response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xls", "utf-8"));wb.write(response.getOutputStream());}/*** 检查数据配置问题** @throws IOException 抛出数据异常类*/protected void checkConfig() throws IOException {if (headKey == null) {throw new IOException("表头不能为空");}if (headWidth != null && headWidth.size() < headKey.size()){throw new IOException("设置宽度的列数必须超过表头列数");}if (fontSize < 0 || rowHeight < 0 || columWidth < 0) {throw new IOException("字体、宽度或者高度不能为负值");}if (Strings.isNullOrEmpty(sheetName)) {throw new IOException("工作表表名不能为NULL");}createDefaultHeadStyle();}public void createDefaultHeadStyle() {//创建表头样式headCellStyle= wb.createCellStyle();//居中headCellStyle.setAlignment(HorizontalAlignment.LEFT);//背景色headCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);headCellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.PALE_BLUE.getIndex());//字体HSSFFont font = wb.createFont();font.setFontHeightInPoints((short)12);font.setBold(true);         //字体增粗headCellStyle.setFont(font);headCellStyle.setBorderBottom(BorderStyle.THIN); // 下边框headCellStyle.setBorderLeft(BorderStyle.THIN);// 左边框headCellStyle.setBorderTop(BorderStyle.THIN);// 上边框headCellStyle.setBorderRight(BorderStyle.THIN);// 右边框}
}

简单的调用例子:

     ExcelExportUtil excelExportUtil = new ExcelExportUtil();// 表头固定列List<String> headList = new ArrayList<>();headList.add("省");if (param.getCity() != 0){headList.add("市");}// 表头固定keyList<String> headKey = new ArrayList<>();headKey.add("province");if (param.getCity() != 0){headKey.add("city");}for (HashMap dateInfo : date){for (String key : param.getNeedType()){headList.add(dateInfo.get("day") + "日" + ConstantUtils.NEED_MAP.get(key));headKey.add(dateInfo.get("day") + "_" + key);}}excelExportUtil.setHeadList(headList);excelExportUtil.setHeadKey(headKey);excelExportUtil.setData(list);excelExportUtil.setFileName("XXX日账");excelExportUtil.exportExport(response).flushExplorer();

java实现Excel动态列导出的简单例子相关推荐

  1. JAVA获取excel第一列数据

    JAVA获取excel第一列数据 提示 1:需要将.xlsx格式转为.xls(不懂得自行百度) 2:不要一次读取太多数据,导致内存溢出 一个简单的方法========== @GetMapping(&q ...

  2. java实现excel的导入导出(poi详解)

    经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个阿帕奇公司的一个项目,后来被扩充了.是比较好用的excel导出工具. 下面来认识一下这个它吧. 我们知道要 ...

  3. java 根据excel模板格式导出指定格式的excel

    2017年10月31日16:40:32 做个记录.方便下次查看. 参考:java实现赋值Excel模板并写入后导出 ( ̄▽ ̄)~* ExcelUtils @Component public class ...

  4. java实现excel的模板导出

    映入pom依赖: <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml& ...

  5. java 生成ppt_POI之PPT导出最简单实例

    开心一笑 有个四岁的小鬼问我:哥哥你怎么长得那么丑啊? 我想了想,到他耳边说:你不要告诉别人哦.其实我就是未来的你. 他哭了... 提出问题 如何实现一个最简单的PPT导出功能呢??? 解决问题 QQ ...

  6. java写入excel乱码_java 导出excel中文乱码的问题

    最近在网上看到一个用java来操纵Excel的open source,在weblogic上试用了一下,觉得很不错,特此向大家推荐一下. 写一个javaBean,利用JExcelApi来动态生成exce ...

  7. Java poi Excel xls列号数字转字母

    最近遇到导出的xls中 列是动态生成的,且单元格中需要用到公式,而xls公式不是用数字列号而是用列字母来表示的,这时需要把数字的列号转成该列对应的字母.因为是按月导出 一个月最多31天,所以刚开始采用 ...

  8. java 在线 excel文件_Java实现最简单的在线打开保存Excel文件 - PageOffice

    Java实现最简单的在线打开保存Excel文件- PageOffice 在项目开发过程中,经常会涉及到生成Excel报表,但往往系统只能通过后台生成Excel报表并保存到服务器上,若想在系统中打开Ex ...

  9. java读取合并单元格_工具方法:java读取Excel合并单元格(简单实例)

    Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI (POI for ...

最新文章

  1. vue = 什么意思_Vue 00 —— 初识 Vue,从放弃到入门
  2. RDKit | 基于RDKit绘制带原子和键的索引、注释和立体化学
  3. Linux 输出重定向和的区别
  4. box unboxing(装箱 拆箱) C#编程指南
  5. C++中public、protected及private用法
  6. spring注入私有字段_Spring字段依赖注入示例
  7. 暨南大学计算机复试线2019,暨南大学2019年考研复试分数线
  8. 修改ubuntu的IP地址,静态IP地址
  9. P10全彩屏C语言编程,STC90C52RC驱动P10LED屏的程序
  10. 10M/s方法解决numpy下载太慢的问题!
  11. 计算机信息处理工具教案设计,高一信息技术《现代信息处理工具》教案
  12. Matlab学习1-图像处理灰度
  13. Scrapy框架之Spiders类理解
  14. Android开放root权限
  15. 提问 html文件谁来解析执行,2019年上初中信息技术教师资格考试面试真题
  16. combo 口切换配置
  17. linux镜像文件目录,Linux - 系统 - 文件目录
  18. 什么是JDK、JRE
  19. FPGA校招笔试题分析
  20. 对 Android 开发者有益的 40 条优化建议

热门文章

  1. python 发送QQ邮箱
  2. WPF MVVM架构 程序退出右下角托盘图标简单解决方案
  3. 至联云讲解《IPFS凭什么能让全世界投资者疯狂》
  4. 小米怎么把便签放在手机桌面上
  5. 阿里云服务器安装oracle11g——会用的到,建议收藏
  6. CodeForces - 1139C Edgy Trees (快速幂+dfs)
  7. 小白篇--git基本操作
  8. 关于洗地机电池容量问题,你怎么看
  9. 【华为云】磁盘挂载操作
  10. 强迫症终结版 - 蹩脚梨视频下载器(很菜勿喷)