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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值