利用poi导出excel,并自动生成表头

之前导出excel大量重复代码,自己输入excel表头,一行一行写入太麻烦了。最新发现只要配置查询的sql语句,其他代码无需改动。废话不说了,贴代码。

注:使用原生的jdbc查询。

		Workbook wb = new SXSSFWorkbook(100);// 声明一个工作薄
		CellStyle style = wb.createCellStyle();  // 一个样式  
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);    //设置垂直居中 
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平居中
		Font headerFont = wb.createFont(); //创建字体样式
		headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//字体加粗
		headerFont.setFontName("Times New Roman");  //设置字体类型  
		headerFont.setFontHeightInPoints((short) 8);    //设置字体大小  
		style.setFont(headerFont);    //为标题样式设置字体样式  
		/*    style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框  
        	style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框  
        	style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框  
        	style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框 
		 */       
		 style.setWrapText(true);
		 Sheet sheet = wb.createSheet(sheetName);//声明工作薄里中一个工作表的名字
		 sheet.setDefaultColumnWidth(20);//给工作一个默认长度
		 Row row = sheet.createRow(0); //创建第一行(也可以称为表头)
		 //通过传过来的sql获得数据
		 RowSet rowSet = //执行原生sql,是为了获得列的信息ResultSetMetaData
		 ResultSetMetaData  columnNames =  rowSet.getMetaData();
		 int columnValues =  columnNames.getColumnCount();
		 for(int i=0;i<columnValues;i++){
			 Cell cell = row.createCell(i);
			 cell.setCellStyle(style);
			 cell.setCellValue(columnNames.getColumnName(i+1));
		 }
		 int rowNo=1;
		 /*   HSSFFont contextFont = (HSSFFont) wb.createFont(); //创建字体样式
        		contextFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//字体加粗
        	   style.setFont(contextFont);*/
		 while(rowSet.next()) {
			 row = sheet.createRow(rowNo);
			 for(int columnNo=0;columnNo<columnValues;columnNo++){
				 Cell cell = row.createCell(columnNo);
				 // cell.setCellStyle(style);
				 Object columnValue = rowSet.getObject(columnNo+1);
				 if(columnValue==null){
					 continue;
				 }
				 if(columnValue instanceof String){
					 cell.setCellValue(rowSet.getString(columnNo+1));
				 }else if(columnValue instanceof Integer){
					 cell.setCellValue(rowSet.getInt(columnNo+1));
				 }else if(columnValue instanceof Double){
					 cell.setCellValue(rowSet.getDouble(columnNo+1));
				 }else if(columnValue instanceof Date){
					 cell.setCellValue(DateUtils.Date2String(rowSet.getDate(columnNo+1), "yyyy-MM-dd"));
				 }else if(columnValue instanceof TIMESTAMP){
					 cell.setCellValue(rowSet.getTimestamp(columnNo+1));
				 }else if(columnValue instanceof BigDecimal){
					 cell.setCellValue(rowSet.getBigDecimal(columnNo+1).doubleValue());
				 }
			 }
			 rowNo++;
		 }
		 File dstFile = File.createTempFile(String.valueOf(System.currentTimeMillis()), ".xlsx");
		 dstFile.deleteOnExit();//程序退出时删除文件
		 OutputStream output=new FileOutputStream(dstFile);
		 wb.write(output);//写入文件
		 output.flush();
		 output.close();//关闭流


要实现动态表头导出,你需要先确定表头数据和结构,然后使用 POI 库动态生成表头数据。 以下是实现动态表头导出的基本步骤: 1. 创建工作簿对象 XSSFWorkbook。 ```java XSSFWorkbook workbook = new XSSFWorkbook(); ``` 2. 创建工作表对象 XSSFSheet。 ```java XSSFSheet sheet = workbook.createSheet("Sheet1"); ``` 3. 创建表头行对象 XSSFRow。 ```java XSSFRow headerRow = sheet.createRow(0); ``` 4. 创建表头单元格对象 XSSFCell。 ```java XSSFCell headerCell = headerRow.createCell(0); ``` 5. 设置表头单元格的值和样式。 ```java headerCell.setCellValue("表头1"); XSSFCellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); headerCellStyle.setAlignment(HorizontalAlignment.CENTER); headerCell.setCellStyle(headerCellStyle); ``` 6. 动态生成表头数据。 ```java // 假设表头数据都保存在一个 Map 对象中 Map<String, List<String>> dataMap = new HashMap<>(); // 生成表头 int columnIndex = 0; for (String header : dataMap.keySet()) { XSSFCell headerCell = headerRow.createCell(columnIndex++); headerCell.setCellValue(header); XSSFCellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); headerCellStyle.setAlignment(HorizontalAlignment.CENTER); headerCell.setCellStyle(headerCellStyle); } // 生成数据 int rowIndex = 1; for (List<String> dataList : dataMap.values()) { XSSFRow dataRow = sheet.createRow(rowIndex++); columnIndex = 0; for (String data : dataList) { XSSFCell dataCell = dataRow.createCell(columnIndex++); dataCell.setCellValue(data); } } ``` 7. 导出 Excel 文件。 ```java try (FileOutputStream outputStream = new FileOutputStream("data.xlsx")) { workbook.write(outputStream); } ``` 以上就是实现动态表头导出的基本步骤。你可以根据自己的需求自定义表头数据的生成逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值