JAVA报表开发-POI处理EXCEL-导出(简单样式进阶)

一、导出时样式的设置

如果要求导出的excel如下内容:

 

1、通过上图可以看出有些样式需要我们来设置:

1.画框线

/**
 * 设置框线
 */
HSSFCellStyle contentStyle = book.createCellStyle();
contentStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//底线
contentStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//顶部线
contentStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左侧线
contentStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右侧线

2、合并单元格

//合并单元格 起始行, 结束行, 起始列, 结束列        
sheet.addMergedRegion(new CellRangeAddress(0,0,0,4));

3、设置行高

/**
设置行高
*/
sheet.getRow(1).setHeight((short)500);

4、设置表格的对齐方式和字体

//*设置对齐方式和字体***/
//内容部分的样式
style_content.setAlignment(HSSFCellStyle.ALIGN_CENTER);//设置水平居中
style_content.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//设置垂直居中

HSSFFont font = book.createFont();//创建字体
font.setFontName("宋体");//设置字体名称
font.setFontHeightInPoints((short)11);//设置字体大小
style_content.setFont(font);//对样式设置字体
        
//标题样式
HSSFCellStyle style_title = book.createCellStyle();//创建标题样式
style_title.setAlignment(HSSFCellStyle.ALIGN_CENTER);//设置水平居中
style_title.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//设置垂直居中
HSSFFont titleFont = book.createFont();//设置标题字体
titleFont.setFontName("黑体");
titleFont.setBold(true);//加粗
titleFont.setFontHeightInPoints((short)18);//字体大小    
style_title.setFont(titleFont);//将标题字体设置到标题样式
sheet.getRow(0).getCell(0).setCellStyle(style_title);//单元格设置标题样式

二、代码

public void downLoadXlsxWithStyle(HttpServletResponse response) throws Exception {
        Workbook workbooks = new XSSFWorkbook();
        Sheet sheet = workbooks.createSheet("有样式的excel");


        //需求:1、边框线:全边框 2、行高 :42 列宽 3、合并单元格:第1行的第1个单元格到第5个单元格 4、对齐方式:水平垂直都要居中 5、字体:黑体18号字

        //1、边框线:全边框
        CellStyle bigTitleRowCellStyle = workbooks.createCellStyle();
        bigTitleRowCellStyle.setBorderLeft(BorderStyle.THIN);//左边框 THIN 细线
        bigTitleRowCellStyle.setBorderBottom(BorderStyle.THIN);//下边框
        bigTitleRowCellStyle.setBorderTop(BorderStyle.THIN);//上边框
        bigTitleRowCellStyle.setBorderRight(BorderStyle.THIN);//右边框

        //4、对齐方式:水平垂直都要居中
        bigTitleRowCellStyle.setAlignment(HorizontalAlignment.CENTER); //水平居中对齐
        bigTitleRowCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //垂直居中对齐

        //5、字体
        Font font = workbooks.createFont();
        font.setFontName("黑体");
        font.setFontHeightInPoints((short)18);
        //把字体放入到样式中
        bigTitleRowCellStyle.setFont(font);

        Row bigTitleRow = sheet.createRow(0);

        //2、行高 列宽
        bigTitleRow.setHeightInPoints(42);//设置行高
        //设置列宽
        sheet.setColumnWidth(0,5*256); //1代表的是一个标准字母宽度的256分之一
        sheet.setColumnWidth(1,8*256);
        sheet.setColumnWidth(2,15*256);
        sheet.setColumnWidth(3,15*256);
        sheet.setColumnWidth(4,30*256);

        for (int i = 0; i <5 ; i++) {
            Cell cell = bigTitleRow.createCell(i);
            cell.setCellStyle(bigTitleRowCellStyle);
        }
        //合并单元格
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,4));//int firstRow 起始行, int lastRow 结束行, int firstCol 开始列, int lastCol 结束列

        //向指定的单元格放入数据
        sheet.getRow(0).getCell(0).setCellValue("审核信息");

        /**
         * 处理小标题
         */

        //需求:1、边框线:全边框 2、行高 :42 列宽 3、合并单元格:第1行的第1个单元格到第5个单元格 4、对齐方式:水平垂直都要居中 5、字体:黑体18号字
        //1、边框线:全边框
        CellStyle littleRowCellStyle = workbooks.createCellStyle();
        //样式克隆
        littleRowCellStyle.cloneStyleFrom(bigTitleRowCellStyle);
        //5、字体
        Font littleFont = workbooks.createFont();
        littleFont.setFontName("宋体");
        littleFont.setFontHeightInPoints((short)12);
        littleFont.setBold(true);
        littleRowCellStyle.setFont(littleFont);

        //1、边框线:全边框
        CellStyle contentRowCellStyle = workbooks.createCellStyle();
        //样式克隆
        contentRowCellStyle.cloneStyleFrom(bigTitleRowCellStyle);
        contentRowCellStyle.setAlignment(HorizontalAlignment.LEFT);
        Font contentFont = workbooks.createFont();
        contentFont.setFontName("楷体");
        contentFont.setFontHeightInPoints((short)8);
        contentFont.setBold(true);
        //把字体放入到样式中
        contentRowCellStyle.setFont(contentFont);

        Row tittleRow  = sheet.createRow(1);
        String [] titles = new String[]{"编号","姓名","手机号","入职日期","现住址"};
        Cell cell = null;
        for (int i = 0; i < 4; i++) {
            cell=tittleRow.createCell(i);//创建单元格  列
            cell.setCellValue(titles[i]);//写入内容
            cell.setCellStyle(contentRowCellStyle);
        }


        SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");

        List<User> userList = userMapper.selectAll();
        int rowIndex=1;
        for (User user : userList) {
            Row row = sheet.createRow(rowIndex); //创建行
            cell = row.createCell(0); //创建列
            cell.setCellValue(user.getId());
            cell.setCellStyle(contentRowCellStyle);

            cell = row.createCell(1);
            cell.setCellValue(user.getUserName());
            cell.setCellStyle(contentRowCellStyle);

            cell = row.createCell(2);
            cell.setCellValue(user.getPhone());
            cell.setCellStyle(contentRowCellStyle);

            cell = row.createCell(3);
            cell.setCellValue(simpleDateFormat.format(user.getHireDate()));
            cell.setCellStyle(contentRowCellStyle);

            cell = row.createCell(4);
            cell.setCellValue(user.getAddress());
            cell.setCellStyle(contentRowCellStyle);

            rowIndex++;
        }



        //文件导出 一个流(outputStream)两个头(文件的打开方式 in-line attachement, 文件的下载时mime类型)
        String filename="员工数据.xlsx";
        response.setHeader("content-disposition","attachment;filename="+new String(filename.getBytes(),"ISO8859-1"));
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        workbooks.write(response.getOutputStream());
    }

 

 

 

posted @ 2022-05-28 16:19  KwFruit  阅读(393)  评论(0编辑  收藏  举报