POI没有固定模板灵活导出Excel(表头title不固定,会多会少)
有一个需求,客户要求前台可以勾选需要展示的列,后台根据前台传过来的需要展示列,来导出符合的Excel表格。
前台列的结构
arrTableTitleData:[{header:"REGION",Column_name: "Region",hide:true},{header:"PROVINCE",Column_name:"Province",hide:true}]
后台代码
List<PageData> newlist=new ArrayList<PageData>();List<String> titles = new ArrayList<String>();for(int i = 0; i < list.size(); i++){boolean aa= (boolean) list.get(i).get("hide");if(aa){titles.add(list.get(i).get("Column_name").toString()); // titles 为显示的列名newlist.add(list.get(i));}} XSSFWorkbook wb = new XSSFWorkbook();// 设置标题样式CellStyle headerStyle = wb.createCellStyle(); //标题样式headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置标题字体Font headerFont = wb.createFont(); //标题字体headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);headerFont.setFontHeightInPoints((short)11);headerStyle.setFont(headerFont);// 设置文本单元格样式XSSFCellStyle contextstyle =wb.createCellStyle();XSSFCellStyle contextstyle1 =wb.createCellStyle();// 根据页面index 获取sheet页XSSFSheet sheet1 = wb.createSheet("sheet1");// 设置标题XSSFRow rowTitle = sheet1.createRow(0);for (int i = 0;i< titles.size(); i++){rowTitle.createCell(i).setCellValue(titles.get(i));rowTitle.getCell(i).setCellStyle(headerStyle);}short width = 20,height=25*20;sheet1.setDefaultColumnWidth(width);
// -------- 循环数据
以上只是准备工作,接下来是循环数据创建单元格,以及设置样式等
for (int i = 0; i < varOList.size(); i++) { // 循环数据创建行 row 有多少数据就创建多少行XSSFRow row = sheet1.createRow(i + 1);for(int j = 0; j < titles.size(); j++){ // 循环title 有多少个title就有多少列,也就是一行创建多少个单元格// 设置内容XSSFCell contentCell = row.createCell(j);String data = varOList.get(i).getString(newlist.get(j).getString("header"));//获取第i行第j列所放数据Boolean isNum = false;//data是否为数值型Boolean isInteger=false;//data是否为整数Boolean isPercent=false;//data是否为百分数if (data != null || "".equals(data)) {//判断data是否为数值型isNum = data.matches("^(-?\\d+)(\\.\\d+)?$");//判断data是否为整数(小数部分是否为0)isInteger=data.matches("^[-\\+]?[\\d]*$");//判断data是否为百分数(是否包含“%”)isPercent=data.contains("%");}//如果单元格内容是数值类型,涉及到金钱(金额、本、利),则设置cell的类型为数值型,设置data的类型为数值类型if (isNum && !isPercent) {XSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式contextstyle.setDataFormat(df.getFormat("#0.00"));//保留两位小数点// 设置单元格格式contentCell.setCellStyle(contextstyle);// 设置单元格内容为double类型contentCell.setCellValue(Double.parseDouble(data));}else if(isPercent){XSSFDataFormat dataFormat = wb.createDataFormat(); // 此处设置数据格式contextstyle1.setDataFormat(dataFormat.getFormat("0.00%"));contentCell.setCellStyle(contextstyle1);contentCell.setCellValue(Double.parseDouble(data.split("%")[0])/100);} else {contentCell.setCellStyle(contextstyle);// 设置单元格内容为字符型contentCell.setCellValue(data);}}}
wb.write(out);out.close();wb.close();
这样就成功了,代码粘贴不全,如有需要请留言。
本人经验有限,如有问题,欢迎指正!
本文参考了【POI框架实战】——POI导出Excel时设置单元格类型为数值类型_点滴汇聚,智在积累。——Danny-CSDN博客_poi设置单元格类型https://blog.csdn.net/huyuyang6688/article/details/49786227
POI没有固定模板灵活导出Excel(表头title不固定,会多会少)相关推荐
- easy poi导出excel表头多语言
原理:自定义一个注解,属性存放多个语言,运行时利用反射,根据选择的语言重新给@Excel的name属性赋值 1.自定义一个注解 @Retention(RetentionPolicy.RUNTIME) ...
- POI实战——好久不见,导出Excel的方式你知道几种?
文章目录 常用的几种方式: 一.POI简介 二.使用poi的原因,以及为什么出现了本贴 三.依赖的包 四.几个单词含义 五.导出方式(创建并导出) 1.导出到本地磁盘: 2.导出到浏览器下载: 3.实 ...
- FineReport 报表模板生成+导出Excel表格
跟spring boot 整合 :https://blog.csdn.net/zhanglixin_1984/article/details/79194145 看官方的文档纠结了一天,好东西,这个怎么 ...
- java 使用poi导出excel,可控制固定前2列固定标头排版,带统计数据格式的
使用poi导出排版漂亮的excel文件 html代码: <button class="btn btn-link" ng-model="exportExcel&quo ...
- 基于poi的动态导出excel表头以及统计行列数据(全网最全)
引入依赖 <!-- excel导入导出 --><dependency><groupId>com.github.stupdit1t</groupId>&l ...
- java导出excel表头斜线_Java导出Excel三表头
1.问题背景 Java导出Excel表格时,表头出现了三个,即多表头Excel 2.实现源码 /** * * @Project:Report * @Title:ThreeHead.java * @Pa ...
- asp.net中GridView多行表头导出Excel表头显示不全问题解决方法
本次需要导出的Excel表格格式如下: 项目 本周实际 本月实际 本年实际 刷卡额 佣金收入 刷卡额 佣金收入 刷卡额 佣金收入 多表头具体的后台代码是在Row_Created事件中创建的.先看创建代 ...
- Java 基于Excel模板实现导出Excel并插入数据
[本案例基于spring boot架构] 一.需求介绍 给定一个Excel模板,在指定位置插入数据,然后将生成的excel导出. 二.实现方法介绍 1.准备Excel模板 模板中要插入数据的地方用&q ...
- 根据 excel 模板自定义导出excel
导出excel //导出 excel 报价单 function exportbaojiaExcel(title,url,gname) {gridname=gname;var id = "&q ...
最新文章
- 第1关:最长非降子序列(非连续)问题
- linux常用命令简介- 用户管理及文件属性
- .NET字符串操作类StringHelper (C#版)
- 配件都包括什么_婚礼婚庆服务都包括什么
- Transformer性能优化:运算和显存
- Bash脚本教程之命令提示符
- rabbitmq消息重回队列
- window下的免安装redis
- 多用类型常量,少用#define预处理指令
- cfa英语不好的怎么学_英语基础很差,如何备考CFA?
- 梦幻西游打宝图脚本制作教程
- 经典点云配准算法:迭代最近点算法ICP(Iterative Closest Point)
- 周围剃光头顶留长发型_四周都剃光,头顶留在发的那叫什么发型
- Android隐藏的权限管理机制:AppOps
- SlashData开发者工具榜首等你而定!!!
- SOHO中国高管建“老鼠仓”吸钱 大企成空壳谁之责?
- iOS开发笔记之二十四——Xcode下类中供外部调用的方法添加注释说明技巧
- FZU2214 超大背包
- 2019年7月训练记录(更新ing)
- Linux比windows更适合工作和娱乐
热门文章
- roaming文件夹是什么文件夹,roaming文件夹能删除么?
- FACH EFACH及其DRX
- Midjourney绘制插画,绘画重来没有如此之简单 - 第12篇
- 3·15再次袭来 微微网络电话以“诚”相对
- 苹果新款iPad今开售:内地只有WiFi版 回收价2300
- HHUOJ 1014 火眼金睛
- 标准正态分布函数和反函数Ф^(-1)
- 深富策略:流动性大概率有利 A股小幅攀升
- Python基于AESSHA1PRNG 算法 加密与解密
- XVWA CSV Formula Injection