• 【poi导出excel之XSSFWorkbook】


    POI提供了HSSF、XSSF以及SXSSF三种方式操作Excel。

    • HSSF:Excel97-2003版本,扩展名为.xls。一个sheet最大行数65536,最大列数256。
    • XSSF:Excel2007版本开始,扩展名为.xlsx。一个sheet最大行数1048576,最大列数16384。
    • SXSSF:是在XSSF基础上,POI3.8版本开始提供的支持低内存占用的操作方式,扩展名为.xlsx。

    因为xssf是将数据存在内存,所以为了防止内存溢出,就出现了sxssf,例:

    SXSSFWorkbook w3= new SXSSFWorkbook(1000);
    
    • 1

    SXSSFWorkbook 设置内存中最多只有1000行数据,当超过这个数据时,就将内存之前的数据删除,并且会在硬盘中生成临时文件。从而保证了低内存消耗。
    注:针对 SXSSF Beta 3.8下,会有临时文件产生

    1、XSSFWorkbook 生成excel

    	// 1、创建工作表
    	XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
    	XSSFSheet xssfSheet = xssfWorkbook.createSheet("sheet名称");
    	XSSFRow xssfRow; // 行
    	XSSFCell xssfCell; // 列
    	// 2、在sheet中创建行,注意判断 第一行是否已经创建,否则会覆盖之前的数据
    	xssfRow = xssfSheet.getRow(1);
    	if (xssfRow == null) {
    		xssfRow = xssfSheet.createRow(1);
    	}
    	// 3、创建单元格
    	xssfCell = xssfRow.createCell(1);
    	// 4、设置单元格内容
    	xssfCell.setCellValue("测试"); 
    	// 5、导出excel
    	response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("表名.xlsx", "UTF-8"));
        ServletOutputStream out = response.getOutputStream();
        xssfWorkbook.write(out);
        out.close();
        xssfWorkbook.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2、合并单元格

    把上面第2步到第4步替换成如下
    (注:创建的单元格和值要取合并单元格左上角第一个)

    	// 创建合并单元格(int firstRow, int lastRow, int firstCol, int lastCol)
    	CellRangeAddress range = new CellRangeAddress(1, 1, 2, 5);
    	// 创建行
    	xssfRow = xssfSheet.getRow(range.getFirstRow());
    	if (xssfRow == null) {
    	    xssfRow = xssfSheet.createRow(range.getFirstRow());
    	}
    	// 创建列
    	xssfCell = xssfRow.createCell(range.getFirstColumn());
    	// 设置单元格内容
    	xssfCell.setCellValue("测试"); 
    	// 添加合并单元格到sheet
    	xssfSheet.addMergedRegion(range);
    	
    	// 设置单元格样式:
    	CellStyle style = xssfWorkbook.createCellStyle();
    	// 1、水平\垂直居中
    	style.setAlignment(HorizontalAlignment.CENTER);
    	style.setVerticalAlignment(VerticalAlignment.CENTER);
    	// 2、设置背景色
    	style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
    	style.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 全部填充
    	// 3、字段加粗
    	XSSFFont font = xssfWorkbook.createFont();
    	font.setBold(true);
    	style.setFont(font);
    	// 4、设置单元格样式为黑色实线(不是合并单元格,如果是合并单元格用下面第5个)
        style.setBorderBottom(BorderStyle.THICK); //下边框
        style.setBorderLeft(BorderStyle.THICK); //左边框
        style.setBorderTop(BorderStyle.THICK); //上边框
        style.setBorderRight(BorderStyle.THICK); //右边框
    	xssfCell.setCellStyle(style);
    	// 5、设置合并边框样式为黑色实线(放最后以免样式被覆盖)
    	RegionUtil.setBorderBottom(BorderStyle.THICK, range , xssfSheet);
    	RegionUtil.setBorderRight(BorderStyle.THICK, range , xssfSheet);
    	RegionUtil.setBorderTop(BorderStyle.THICK, range , xssfSheet);
    	RegionUtil.setBorderLeft(BorderStyle.THICK, range , xssfSheet);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    单元格对应颜色:POI 设置Excel单元格背景色

    3、单元格设置下拉列表

    	XSSFWorkbook workbook = new XSSFWorkbook();
    	XSSFSheet sheet = workbook.createSheet("导入模板");
    	// 1、设置表头
    	。。。。。
    	// 2、为第3列设置下拉选项
    	String[] arr = {"选项1","选项2"};
    	sheet.addValidationData(addValidationData(sheet, arr, 3));
    	
    	
    	/**
    	* 设置下拉列表
    	*
    	* @param sheet
    	* @param datas
    	* @param index
    	* @return
    	*/
    	private XSSFDataValidation addValidationData(XSSFSheet sheet, String[] datas, Integer index) {
    		XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
    		XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(datas);
    		CellRangeAddressList addressList = null;
    		XSSFDataValidation validation = null;
    		addressList = new CellRangeAddressList(1, 100000, index, index);// 开始结束行,index表示开始和结束列
    		validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);
    		// 这两行设置单元格只能是列表中的内容,否则报错
    		validation.setSuppressDropDownArrow(true);
    		validation.setShowErrorBox(true);
    		return validation;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    Java EE与jakarta
    使用yum安装jdk,并配置环境变量
    214页(10万字)以数据驱动为核心的区域医疗数据中台
    redis集群的多key原子性操作如何实现?
    Android查漏补缺(5)ContentProvider和ContentResolver
    Spring Boot Actuator 模块,spring-boot-starter-actuator
    基于虚拟仪器的电磁阀综合特性系统设计
    程序设计综合实践 2.1
    树的应用 —— 二叉树:二叉树的性质
    【Linux】I/O多路复用-SELECT/POLL/EPOLL
  • 原文地址:https://blog.csdn.net/weixin_44183847/article/details/126029216