java poi 导出Excel 一(后台部分)

本文详细介绍了一种在Java Web应用中实现Excel导出的方法,包括数据源的处理、使用Apache POI库创建和填充Excel文件,以及设置HTTP响应头以便用户下载。文章还提供了完整的代码示例,展示了如何设置单元格样式、合并单元格和处理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
	 *   列表导出
	 * @param userForm
	 * @param session
	 * @return
	 */
	@RequestMapping(value = "/download", method = RequestMethod.POST)
	public void download(@RequestBody UserForm userForm,HttpSession session,HttpServletResponse response ) {
		try {
			SysUserBean sysUser =(SysUserBean) session.getAttribute("loginuser");
			if(userForm.getAreaid()==null || "".equals(userForm.getAreaid())) {
				userForm.setAreaid(sysUser.getAREA_ID());
			}
			List<Map<String,Object>> list1= //数据源
			
			List<Map<String,Object>> list2= //数据源
			
            //Excel导出工具类
			ExcelTools excelTools = ExcelTools.newInstance();
			//设置workbook和数据源
			excelTools.setData(new XSSFWorkbook(), list1, list2);
			
			System.out.println("list1.size "+list1.size());
			
			String fileName = "导出表单名称";
			
			//设置sheet的名称
			excelTools.setSheetName(fileName);
            //执行 创建Excel
			excelTools.execute();
			
			Date date = new Date();
			SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
			fileName = fileName+"&"+ft.format(date)+".xlsx";
			
			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
			response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName,"UTF-8"));
			//允许前端可以从header中取出"Content-Disposition" 的值
			response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
			response.setHeader("Pragma", "no-cache");
			response.setHeader("Expires", "0");
			response.setContentType("application/octet-stream");
			
			XSSFWorkbook workbook = excelTools.getWorkbook();
			workbook.write(response.getOutputStream());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Excel导出工具类:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * Excel导出工具类
 * @author chai
 *
 */
public class ExcelTools {

	private XSSFWorkbook wb;
	private List<Map<String,Object>> list1;
	private List<Map<String,Object>> list2;
	private String sheetName;
	// 单元格样式
	public XSSFCellStyle style0,style1, style2,style3;
	// 字体样式
	public XSSFFont font0,font1, font2,font3;
	//格式设置
	public DataFormat format;
	
	private ExcelTools() {
		
	}
	
	public static ExcelTools newInstance() {
		return new ExcelTools();
	}
	
	public void setData(XSSFWorkbook wb,List<Map<String,Object>> list1,List<Map<String,Object>> list2) {
		setWorkbook(wb);
		setAreaList(list1);
		setPaymentList(list2);
	}
	
	public void setWorkbook(XSSFWorkbook wb) {
		this.wb = wb;
	}
	
	public XSSFWorkbook getWorkbook() {
		return wb;
	}
	
	public void setAreaList(List<Map<String,Object>> list1) {
		this.list1= list1;
	}
	
	public void setPaymentList(List<Map<String,Object>> list2) {
		this.list2= list2;
	}
	//设置sheet的名称
	public void setSheetName(String sheetName) {
		this.sheetName = sheetName;
	}
	/**
     * 执行
     */
	public void execute() {
		//初始化一些单元格样式
		initCellStyle();
		//创建sheet并填充数据
		createSheet();
	}
	
	
	
	public void initCellStyle() {
		setFormat();
		setStyle0();
		setStyle1();
		setStyle2();
		setStyle3();
	}
	
	public void createSheet() {
		XSSFSheet sheet = null;
		try {
			sheet = wb.createSheet(sheetName);
		} catch (Exception e) {
			System.out.println("创建sheet异常 ");
		}
		
		int columnNum = list1.size()*3+1;
		
		for(int i = 0 ; i < columnNum; i++) {
			sheet.setColumnWidth(i, 256 * 12 + 140);
			if (i == 0) {
				sheet.setColumnWidth(i, 256 * 34 + 155);
			}
		}
		int rowNumber = 0;
		//整个表的名称
		XSSFRow row = sheet.createRow(rowNumber++);
		row.setHeight((short) (256 * 2 + 208));
		XSSFCell cell = null;
		for(int i = 0; i < columnNum; i++) {
			cell = row.createCell(i);
			cell.setCellStyle(style0);
			if(i == 0) {
				cell.setCellValue(sheetName);
			}
		}
		//合并单元格
		CellRangeAddress region = new CellRangeAddress(0, 0, 0, columnNum-1);
		sheet.addMergedRegion(region);
		
		//表头
		row = sheet.createRow(rowNumber++);
		for(int i = 0; i < columnNum; i++) {
			cell = row.createCell(i);
			cell.setCellStyle(style1);
			if(i == 0) {
				cell.setCellValue("填充内容");
			}else if(i%3 == 1) {
				cell.setCellValue(list1.get(i/3).get("****").toString());
			}else if(i%3 == 0) {
				region = new CellRangeAddress(rowNumber-1, rowNumber-1, i-2, i);
				sheet.addMergedRegion(region);
			}
		}
		row = sheet.createRow(rowNumber++);
		row.setHeight((short) (256 * 1 + 208));
		for(int i = 0; i < columnNum; i++) {
			cell = row.createCell(i);
			cell.setCellStyle(style1);
			if(i == 0) {
				region = new CellRangeAddress(rowNumber-2, rowNumber-1, 0, 0);
				sheet.addMergedRegion(region);
			}else if(i%3 == 1) {
				cell.setCellValue("填充内容1");
			}else if(i%3 == 2) {
				cell.setCellValue("填充内容2");
			}else if(i%3 == 0 ) {
				cell.setCellValue("填充内容3");
			}
		}
		//将list1对应的id进行缓存
		List<String> cacheList = new ArrayList<>();
		cacheList.add("TYPE_NAME");
		for(int i = 0; i < columnNum-1; i++) {
			String id = null;
			
			id = list1.get(i/3).get("ID").toString();
			if(i%3 == 0) {
				cacheList.add(id+"****");
			}else if(i%3 == 1) {
				cacheList.add(id+"****");
			}else if(i%3 == 2) {
				cacheList.add(id+"****");
			}
		}
		
		//表体
		int rowNum = list2.size()+3;
		String id = null;
		Map<String,Object> list2Item= null;
		String areaId = null;
		for(;rowNumber < rowNum;) {
			row = sheet.createRow(rowNumber++);
			list2Item= list2.get(rowNumber-4);
			for(int i = 0; i < columnNum; i++) {
				cell = row.createCell(i);
				cell.setCellStyle(style3);
				if(i == 0) {
					cell.setCellStyle(style2);
					areaId = cacheList.get(i).toString();
					cell.setCellValue(paymenListItem.get(areaId) == null ? "0":list2Item.get(areaId).toString());
				}else {
					areaId = cacheList.get(i).toString();
					cell.setCellValue(Double.valueOf(list2Item.get(areaId) == null ? "0":list2Item.get(areaId).toString()));
				}
				
				
			}
		}
		
		
	}
	
	public void setFormat() {
		format = wb.createDataFormat();
	}
	
	/**
	 * 居中 无边框 白色背景 宋体 16号 加粗 自动换行
	 * 单元格类型 文本
	 */
	public void setStyle0() {
		style0 = wb.createCellStyle();
		// 边框
		
		// 居中
		style0.setAlignment(HorizontalAlignment.CENTER);
		style0.setVerticalAlignment(VerticalAlignment.CENTER);
		// 自动换行
		style0.setWrapText(true);
		//字体
		font0 = wb.createFont();
		font0.setBold(true);//粗体
		font0.setFontName("宋体");
		font0.setFontHeightInPoints((short) 16);
		style0.setFont(font0);
		
		// 单元格类型 @ 表示文本
		style0.setDataFormat(format.getFormat("@"));
	}
	/**
	 * 居中 黑色边框 白色背景 宋体 9号 加粗 自动换行
	 * 单元格类型 文本
	 */
	public void setStyle1() {
		style1 = wb.createCellStyle();
		// 边框
		style1.setBorderLeft(CellStyle.BORDER_THIN);
		style1.setBorderTop(CellStyle.BORDER_THIN);
		style1.setBorderRight(CellStyle.BORDER_THIN);
		style1.setBorderBottom(CellStyle.BORDER_THIN);
		// 居中
		style1.setAlignment(HorizontalAlignment.CENTER);
		style1.setVerticalAlignment(VerticalAlignment.CENTER);
		// 自动换行
		style1.setWrapText(true);

		font1 = wb.createFont();
		font1.setBold(true);
		font1.setFontName("宋体");
		font1.setFontHeightInPoints((short) 9);
		style1.setFont(font1);
		
		// 背景色
//		style1.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
//		style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(0, 176, 240)));
		
		// 单元格类型 @ 表示文本
		style1.setDataFormat(format.getFormat("@"));
	}
	
	/**
	 * 靠左 黑色边框 白色背景 宋体 9号 加粗 自动换行
	 */
	public void setStyle2() {
		style2 = wb.createCellStyle();
		// 边框
		style2.setBorderLeft(CellStyle.BORDER_THIN);
		style2.setBorderTop(CellStyle.BORDER_THIN);
		style2.setBorderRight(CellStyle.BORDER_THIN);
		style2.setBorderBottom(CellStyle.BORDER_THIN);
		// 居中
		style2.setAlignment(HorizontalAlignment.LEFT);
		style2.setVerticalAlignment(VerticalAlignment.CENTER);
		// 自动换行
		style2.setWrapText(true);

		font2 = wb.createFont();
		font2.setFontName("宋体");
		font2.setFontHeightInPoints((short) 9);
//		font2.setBold(true);
		style2.setFont(font2);

		// 单元格类型 @ 表示文本
		style2.setDataFormat(format.getFormat("@"));

	}
	
	/**
	 * 靠右  黑色边框 白色背景 宋体 9号 加粗 自动换行
	 */
	public void setStyle3() {
		style3 = wb.createCellStyle();
		// 边框
		style3.setBorderLeft(CellStyle.BORDER_THIN);
		style3.setBorderTop(CellStyle.BORDER_THIN);
		style3.setBorderRight(CellStyle.BORDER_THIN);
		style3.setBorderBottom(CellStyle.BORDER_THIN);
		// 居中
		style3.setAlignment(HorizontalAlignment.RIGHT);
		style3.setVerticalAlignment(VerticalAlignment.CENTER);
		// 自动换行
		style3.setWrapText(true);

		font3 = wb.createFont();
		font3.setFontName("宋体");
		font3.setFontHeightInPoints((short) 9);
//		font3.setBold(true);
		style3.setFont(font3);

		// 单元格类型 @ 表示文本
//		style3.setDataFormat(format.getFormat("@"));

	}
	
	
	
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chailongger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值