操作Excel设置单元格样式是比较繁琐的,还有导入导出是设置的Header信息,为了简化这些操实现了如下工具类。工具类具有设置单元格的基本背景颜色、字体、字号、字体颜色、边框等,还实现了导入导出、磁盘读写Excel。
这个工具类来源于我们项目的实践,简化了一些重复性的工作,欢迎尝试,欢迎提出问题。
1.设置简单的单元格样式。如字体、字号、对齐方式、颜色、边框
2.便捷实现下拉框
3.提供一组默认属性方便设置行高和字体
4.提供上传文件的读取(读取 Request 流)、下载文件导出(导出到 Response 流)、指定磁盘文件导出、指定磁盘文件读取
5.Excel数据解析为Java List
这是使用工具类来完成一个表格的生成到导出。
// 导出赛事
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