【Apache POI】设置单元格字体、颜色、边框、对齐方式、Excel读取导入、解析工具类

操作Excel设置单元格样式是比较繁琐的,还有导入导出是设置的Header信息,为了简化这些操实现了如下工具类。工具类具有设置单元格的基本背景颜色、字体、字号、字体颜色、边框等,还实现了导入导出、磁盘读写Excel。

这个工具类来源于我们项目的实践,简化了一些重复性的工作,欢迎尝试,欢迎提出问题。

预览 & 功能

1.设置简单的单元格样式。如字体、字号、对齐方式、颜色、边框

【Apache POI】设置单元格字体、颜色、边框、对齐方式、Excel读取导入、解析工具类_第1张图片

【Apache POI】设置单元格字体、颜色、边框、对齐方式、Excel读取导入、解析工具类_第2张图片

2.便捷实现下拉框

【Apache POI】设置单元格字体、颜色、边框、对齐方式、Excel读取导入、解析工具类_第3张图片

3.提供一组默认属性方便设置行高和字体

4.提供上传文件的读取(读取 Request 流)、下载文件导出(导出到 Response 流)、指定磁盘文件导出、指定磁盘文件读取

5.Excel数据解析为Java List

实现

导出一个excel大致的代码

这是使用工具类来完成一个表格的生成到导出。

    // 导出赛事
    public HSSFWorkbook downloadTemplate(Long competitionId, HttpServletResponse response) {
   
        // work book
        HSSFWorkbook workbook = new HSSFWorkbook();
        String sheetName = "导入模板";

        // sheet
        HSSFSheet sheet = workbook.createSheet(sheetName);

        // 默认高度 16像素
        sheet.setDefaultRowHeightInPoints(16F);

        //设置指定列宽
        sheet.setColumnWidth(0, 14 * 256);
        sheet.setColumnWidth(1, 14 * 256);
        sheet.setColumnWidth(2, 16 * 256);
        sheet.setColumnWidth(3, 16 * 256);
        sheet.setColumnWidth(4, 32 * 256);
        sheet.setColumnWidth(5, 64 * 256);
	
	// 单元格样式
        HSSFCellStyle testStyle = new ExcelUtil.HSSFStyleBuilder()
                .createStyle(workbook)
                .font("宋体", (short) 11, true)
                .colorRed()
                .alignCenter()
                .backgroundBlue()
                .build();

	// 单元格样式
        HSSFCellStyle tipStyle = new ExcelUtil.HSSFStyleBuilder()
                .createStyle(workbook)
                .font("宋体", (short) 11, true)
                .horizontalAlignLeft()
                .verticalAlignCenter()
                .wrapText()
                .build();

	// 单元格样式
        HSSFCellStyle titleRedStyle = new ExcelUtil.HSSFStyleBuilder()
                .createStyle(workbook)
                .font("宋体", (short)11, true)
                .colorRed()
                .alignCenter()
                .wrapText()
                .build();

	// 单元格样式
        HSSFCellStyle titleBlackStyle = new ExcelUtil.HSSFStyleBuilder()
                .createStyle(workbook)
                .font("宋体", (short)11, true)
                .colorBlack()
                .alignCenter()
                .wrapText()
                .build();

        // 设置单元格合并
        CellRangeAddress rowRegion = new CellRangeAddress(0, 0, 0, 5);
        sheet.addMergedRegion(rowRegion);

        // 第一行 row=0
        HSSFRow row = sheet.createRow(0);

        Competition competition = adminCompetitionMapper.selectById(competitionId);

        row.setHeightInPoints(110);
        HSSFCell cell = row.createCell(0);
        StringBuilder info = new StringBuilder(256);
        info.append(sheetName).append("赛事编号为:<").append(competitionId).append(">\r\n")
                .append("赛事名称为:").append(competition.getName()).append("\r\n")
                .append("说明信息:\r\n")
                .append("1) 请不要将此模板应用用在除(").append(competition.getName()).append(")以为的赛事。\r\n")
                .append("2) 红色标题的字段必填。“序号”字段不做要求,性别、参数经验、赛事名称可从下拉列表框选取。\r\n")
                .append("3) 填在此表格中的用户必须已注册在系统中,需保证手机号码正确。\r\n")
                .append("4) 填写时,行与行之间禁止留有空行,禁止修改标题,不要动其他信息。");

        // 设置说明信息
        cell.setCellValue(info.toString());
        cell.setCellStyle(tipStyle);

        // 第二行 row=1
        row = sheet.createRow(1);
        row.setHeightInPoints(18F);

        // 标题 excelTitles = new String[] {"序号","用户名","手机号","性别(男/女)","有无参赛经验(有/无)","赛事名称"};
        ExcelUtil.cellSetter(row.createCell(0), titleBlackStyle).setCellValue(excelTitles[0]);
        ExcelUtil.cellSetter(row.createCell(1), titleRedStyle).setCellValue(excelTitles[1]);
        ExcelUtil.cellSetter(row.createCell(2), titleRedStyle).setCellValue(excelTitles[2]);
        ExcelUtil.cellSetter(row.createCell(3), titleRedStyle).setCellValue(excelTitles[3]);
        ExcelUtil.cellSetter(row.createCell(4), titleRedStyle).setCellValue(excelTitles[4]);
        ExcelUtil.cellSetter(row.createCell(5), titleRedStyle).setCellValue(excelTitles[5]);

        //设置约束,下拉列表
        ExcelUtil.createDataValidation(sheet, new String[]{
   "男", "女"}, 2, 1000, 3, 3);
        ExcelUtil.createDataValidation(sheet, new String[]{
   "有", "无"}, 2, 1000, 4, 4);
	
	// 导出
        ExcelUtil.exportXlsExcel(response, "赛事导入模板", workbook);
    }

以下会单独讲工具类的使用。

单元格样式:字体、字号、对齐方式、颜色、边框

通过工具类可以创建简单的单元格样式,如果想看具体的样式如何设置请看工具类 HSSFStyleBuilder 类的具体设置。

设置宋体、11号字体、加粗、黑色字体、文本超出换行、细线边框、蓝色背景、居中对齐。

// 生成style对象
HSSFCellStyle titleStyle = new ExcelUtil.HSSFStyleBuilder(wb)
                .font("宋体", (short)11, true)
                .alignCenter()
                .colorBlack()
                .backgroundBlue()
                .border()
                .wrapText()
                .build();
// 使用样式
ExcelUtil.cellSetter(row.createCell(0), titleBlackStyle).setCellValue("序号");

// ExcelUtil.cellSetter方法实现如下, 它仅完成设置单元格样式这一步
public static HSSFCell cellSetter(@NotNull HSSFCell cell, HSSFCellStyle style){
   
    cell.setCellStyle(style);
    return cell;
}

实现下拉框效果

在需要进行数据验证,限定一部分数据的时候,可以使用下拉框。

设置后的下拉框仅对数据进行验证,默认不选择任何一条数据。

// 通过工具类为sheet的第四列设置只能填入男或女验证的下拉框
ExcelUtil.createDataValidation(sheet, new String[]{
   "男", "女"}, 2, 1000, 3, 3);

//ExcelUtil.createDataValidation 类的实现
public static void createDataValidation(@NotNull Sheet sheet

你可能感兴趣的:(Java语言,开发工具)