Java使用POI导出Excel文件

Java使用POI导出Excel文件Java使用POI导出Excel文件,设置边框、字体、单元格背景、行距、单元格合并、单元格宽度自适应、文本水平居中、垂直居中、标题跟内容样式分离

POI概述

HSSF 是 POI 项目的 Excel ’97(-2007) 文件格式的纯 Java 实现。XSSF 是 POI 项目的 Excel 2007 OOXML (.xlsx) 文件格式的纯 Java 实现。
HSSF 和 XSSF 提供了读取电子表格创建、修改、读取和写入 XLS 电子表格的方法。他们提供:
为有特殊需要的人提供的低级结构
用于高效只读访问的 eventmodel api
用于创建、读取和修改 XLS 文件的完整用户模型 API
对于从纯 HSSF 用户模型转换的人,如果希望使用联合 SS 用户模型来支持 HSSF 和 XSSF,请参阅ss 用户模型转换指南。
生成电子表格的另一种方法是通过Cocoon序列化程序(但您仍将间接使用 HSSF)。使用 Cocoon,您可以通过简单地应用样式表并指定序列化程序来序列化任何 XML 数据源(例如,可能是用 SQL 输出的 ESQL 页面)。
如果您只是读取电子表格数据,请使用 org.apache.poi.hssf.eventusermodel 包或 org.apache.poi.xssf.eventusermodel 包中的 eventmodel api,具体取决于您的文件格式。
如果您正在修改电子表格数据,请使用 usermodel api。您也可以通过这种方式生成电子表格。
请注意,usermodel 系统比低级 eventusermodel 具有更高的内存占用,但主要优点是使用起来更简单。另请注意,由于新的 XSSF 支持的 Excel 2007 OOXML (.xlsx) 文件是基于 XML 的,因此处理它们的内存占用高于旧的 HSSF 支持的 (.xls) 二进制文件。
SXSSF(自 POI 3.8 beta3 起)
POI官方文档

Apache POI 下载

依赖引用关系图如下所示:

在这里插入图片描述

直接下载

点击进入官网下载Apache POI
在这里插入图片描述

Maven下载

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>5.2.2</version>
</dependency>

POI实例

    @RequestMapping("/downloadExcel")
    public void downloadExcel(HttpServletResponse response) throws Exception{ 
   
        //创建Excel文件
        Workbook wb = new HSSFWorkbook();
        //生成sheet
        Sheet sheet = wb.createSheet("POI测试sheet");
        //创建行
        Row row = null;
        //创建列
        Cell cell = null;
        //创建表头单元格样式
        CellStyle cs_header = wb.createCellStyle();
        //设置字体样式
        Font boldFont = wb.createFont();
        //设置文字类型
        boldFont.setFontName("宋体");
        //设置加粗
        boldFont.setBold(true);
        //设置文字大小
        boldFont.setFontHeightInPoints((short) 16);
        //应用设置的字体
        cs_header.setFont(boldFont);
        //设置边框下、左、右、上
        cs_header.setBorderBottom(BorderStyle.THIN);
        cs_header.setBorderLeft(BorderStyle.THIN);
        cs_header.setBorderRight(BorderStyle.THIN);
        cs_header.setBorderTop(BorderStyle.THIN);
        //水平居中
        cs_header.setAlignment(HorizontalAlignment.CENTER);
        //垂直居中
        cs_header.setVerticalAlignment(VerticalAlignment.CENTER);
        //前景填充色
        cs_header.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.index);
        //设置前景填充样式
        cs_header.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //设置标题
        row = sheet.createRow(0);
        //设置单元格行高
        row.setHeightInPoints(24);
        //设置标题
        String[] headers=new String[]{ 
   
                "type字段ID标题","types字段ID标题","depName字段标题","offName标题","cDepIds字段标题","battleLineId字段标题","cardNumber字段标题","userId字段标题",
                "startDate字段标题","endDate字段标题","cpName字段标题","isStorageList字段标题 与 powerUser字段标题"
        };
        //逐个设置标题样式
        for (int i = 0; i < headers.length; i++) { 
   
            //创建单元格
            cell = row.createCell(i);
            //设置单元格内容
            cell.setCellValue(headers[i]);
            //设置单元格样式
            cell.setCellStyle(cs_header);
        }
        //创建文本单元格样式
        CellStyle cs_text = wb.createCellStyle();
        //创建文字设置
        Font textFont = wb.createFont();
        //设置文字类型
        textFont.setFontName("Consolas");
        //设置文字大小
        textFont.setFontHeightInPoints((short) 10);
        //应用设置
        cs_text.setFont(textFont);
        //设置边框
        cs_text.setBorderBottom(BorderStyle.THIN);
        cs_text.setBorderLeft(BorderStyle.THIN);
        cs_text.setBorderRight(BorderStyle.THIN);
        cs_text.setBorderTop(BorderStyle.THIN);
        //水平居中
        cs_text.setAlignment(HorizontalAlignment.CENTER);
        //垂直居中
        cs_text.setVerticalAlignment(VerticalAlignment.CENTER);
        //调取数据
        List<WzPickingApply> list = wzPickingApplyService.selectWzPickingApplyList();
        //记录总共多少列(由于接口查询出来的实体类集合,所以不好循环,使用)
        Integer cellSum = 0;
        //将数据写入表格
        for(int i=0; i<list.size(); i++){ 
   
        	//将实体类集合转成string数组,通过‘,’,获取总共多少列
            String[] split = list.get(i).toString().split(",");
            cellSum=split.length;
            //创建行,由于0行是标题,所以+1
            row = sheet.createRow(i+1);
            //实体类集合不太好循环,所以逐一设置,如果是其他则可使用for循环
            WzPickingApplyVo wpa = (WzPickingApplyVo) list.get(i);
            row.createCell(0).setCellValue(wpa.getType()!=null?wpa.getType():'1');
            row.createCell(1).setCellValue(wpa.getTypes()!=null?wpa.getTypes():'2');
            row.createCell(2).setCellValue(wpa.getDepName()!=null?wpa.getDepName():"3");
            row.createCell(3).setCellValue(wpa.getOffName()!=null?wpa.getOffName():"4");
            row.createCell(4).setCellValue(String.valueOf(wpa.getCDepIds()!=null?wpa.getCDepIds():"5"));
            row.createCell(5).setCellValue(wpa.getBattleLineId()!=null?wpa.getBattleLineId():'6');
            row.createCell(6).setCellValue(wpa.getCardNumber()!=null?wpa.getCardNumber():"7");
            row.createCell(7).setCellValue(wpa.getUserId()!=null?wpa.getUserId():'8');
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:MM:SS");
            row.createCell(8).setCellValue(String.valueOf(wpa.getStartDate()!=null?wpa.getStartDate():df.format(Calendar.getInstance().getTime())));
            row.createCell(9).setCellValue(String.valueOf(wpa.getEndDate()!=null?wpa.getEndDate():df.format(Calendar.getInstance().getTime())));
            row.createCell(10).setCellValue(wpa.getCpName()!=null?wpa.getCpName():"9");
            row.createCell(11).setCellValue(String.valueOf(wpa.getIsStorageList()!=null?wpa.getIsStorageList():"10"));
            row.createCell(12).setCellValue(String.valueOf(wpa.getPowerUser()!=null?wpa.getPowerUser():"11"));
			//为每一个单元格设置样式
            for (int j=0;j<cellSum;j++){ 
   
                row.getCell(j).setCellStyle(cs_text);
            }
        }
        //合并单元格,横向
        sheet.addMergedRegionUnsafe(new CellRangeAddress(0, 0, 11, 12));
        sheet.addMergedRegionUnsafe(new CellRangeAddress(1,1,3,4));
        //竖着合并
        sheet.addMergedRegionUnsafe(new CellRangeAddress(1,list.size(),4,4));
        //设置单元格宽度自适应
        for (int i = 0; i <= cellSum; i++)
        { 
   
            sheet.autoSizeColumn((short)i,true); //自动调整列宽
        }
        //设置中文文件名称
        String fileName = URLEncoder.encode("POIExcel下载测试","UTF-8");
        //浏览器默认服务器传过去的是html,不是excel文件
        //设置响应类型:传输内容是流,并支持中文
        response.setContentType("application/octet-stream;charset=UTF-8");
        //设置响应头信息header,下载时以文件附件下载
        response.setHeader("Content-Disposition","attachment;filename="+fileName+".xls");
        //输出流对象
        OutputStream os = response.getOutputStream();
        wb.write(os);
        //强制刷新
        os.flush();
        os.close();
        wb.close();
    }

总结

目前这仅是讲解使用,如果做项目,封装一下更灵活,便于使用。

今天的文章Java使用POI导出Excel文件分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/32362.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注