建议把样式相关工具统一放到 ExcelUtils 中的一个区域,例如:
// =========================
// Style 工具
// =========================
下面是整理后的完整版(带详细注释和参数说明)。
创建居中样式
/**
* 创建居中样式
*
* 功能:
* 1. 水平居中
* 2. 垂直居中
*
* @param workbook 工作簿
* @return CellStyle
*/
public static CellStyle createCenterStyle(
Workbook workbook) {
CellStyle style =
workbook.createCellStyle();
// 水平居中
style.setAlignment(
HorizontalAlignment.CENTER
);
// 垂直居中
style.setVerticalAlignment(
VerticalAlignment.CENTER
);
return style;
}
创建边框样式
/**
* 创建边框样式
*
* 功能:
* 给单元格增加四周边框
*
* @param workbook 工作簿
* @return CellStyle
*/
public static CellStyle createBorderStyle(
Workbook workbook) {
CellStyle style =
workbook.createCellStyle();
style.setBorderTop(
BorderStyle.THIN);
style.setBorderBottom(
BorderStyle.THIN);
style.setBorderLeft(
BorderStyle.THIN);
style.setBorderRight(
BorderStyle.THIN);
return style;
}
创建标题样式
/**
* 创建标题样式
*
* 示例:
* 考勤统计表
*
* @param workbook 工作簿
* @return CellStyle
*/
public static CellStyle createTitleStyle(
Workbook workbook) {
CellStyle style =
workbook.createCellStyle();
Font font =
workbook.createFont();
// 粗体
font.setBold(true);
// 字体大小
font.setFontHeightInPoints(
(short) 16
);
style.setFont(font);
// 居中
style.setAlignment(
HorizontalAlignment.CENTER
);
style.setVerticalAlignment(
VerticalAlignment.CENTER
);
return style;
}
创建表头样式
/**
* 创建表头样式
*
* 功能:
* 适用于第一行表头
*
* @param workbook 工作簿
* @return CellStyle
*/
public static CellStyle createHeaderStyle(
Workbook workbook) {
CellStyle style =
workbook.createCellStyle();
Font font =
workbook.createFont();
font.setBold(true);
style.setFont(font);
style.setAlignment(
HorizontalAlignment.CENTER
);
style.setVerticalAlignment(
VerticalAlignment.CENTER
);
style.setBorderTop(
BorderStyle.THIN);
style.setBorderBottom(
BorderStyle.THIN);
style.setBorderLeft(
BorderStyle.THIN);
style.setBorderRight(
BorderStyle.THIN);
return style;
}
自动换行
/**
* 自动换行样式
*
* 示例:
* 第一行
* 第二行
*
* @param workbook 工作簿
* @return CellStyle
*/
public static CellStyle createWrapStyle(
Workbook workbook) {
CellStyle style =
workbook.createCellStyle();
style.setWrapText(true);
return style;
}
竖向文字
/**
* 创建竖向文字样式
*
* 示例:
* 考
* 勤
* 统
* 计
*
* @param workbook 工作簿
* @return CellStyle
*/
public static CellStyle createVerticalTextStyle(
Workbook workbook) {
CellStyle style =
workbook.createCellStyle();
// 旋转90度
style.setRotation(
(short) 90
);
style.setAlignment(
HorizontalAlignment.CENTER
);
style.setVerticalAlignment(
VerticalAlignment.CENTER
);
return style;
}
红色字体
/**
* 红色字体样式
*
* 适用于:
* 迟到
* 缺卡
* 旷工
*
* @param workbook 工作簿
* @return CellStyle
*/
public static CellStyle createRedFontStyle(
Workbook workbook) {
CellStyle style =
workbook.createCellStyle();
Font font =
workbook.createFont();
font.setColor(
IndexedColors.RED.getIndex()
);
style.setFont(font);
return style;
}
日期格式
/**
* 日期格式
*
* yyyy-MM-dd
*
* @param workbook 工作簿
* @return CellStyle
*/
public static CellStyle createDateStyle(
Workbook workbook) {
CellStyle style =
workbook.createCellStyle();
DataFormat format =
workbook.createDataFormat();
style.setDataFormat(
format.getFormat(
"yyyy-MM-dd"
)
);
return style;
}
时间格式
/**
* 时间格式
*
* HH:mm:ss
*
* @param workbook 工作簿
* @return CellStyle
*/
public static CellStyle createTimeStyle(
Workbook workbook) {
CellStyle style =
workbook.createCellStyle();
DataFormat format =
workbook.createDataFormat();
style.setDataFormat(
format.getFormat(
"HH:mm:ss"
)
);
return style;
}
百分比格式
/**
* 百分比格式
*
* 12.35%
*
* @param workbook 工作簿
* @return CellStyle
*/
public static CellStyle createPercentStyle(
Workbook workbook) {
CellStyle style =
workbook.createCellStyle();
DataFormat format =
workbook.createDataFormat();
style.setDataFormat(
format.getFormat(
"0.00%"
)
);
return style;
}
金额格式
/**
* 金额格式
*
* 1,999.00
*
* @param workbook 工作簿
* @return CellStyle
*/
public static CellStyle createMoneyStyle(
Workbook workbook) {
CellStyle style =
workbook.createCellStyle();
DataFormat format =
workbook.createDataFormat();
style.setDataFormat(
format.getFormat(
"#,##0.00"
)
);
return style;
}
背景色
/**
* 创建背景色样式
*
* @param workbook 工作簿
* @param color 背景颜色
* 示例:
* IndexedColors.YELLOW
* IndexedColors.GREEN
* IndexedColors.RED
*
* @return CellStyle
*/
public static CellStyle createBackgroundStyle(
Workbook workbook,
IndexedColors color) {
CellStyle style =
workbook.createCellStyle();
style.setFillForegroundColor(
color.getIndex()
);
style.setFillPattern(
FillPatternType.SOLID_FOREGROUND
);
return style;
}
冻结表头
/**
* 冻结首行
*
* 效果:
* 下拉时表头固定
*
* @param sheet Sheet
*/
public static void freezeHeader(
Sheet sheet) {
sheet.createFreezePane(
0,
1
);
}
自动列宽
/**
* 自动列宽
*
* @param sheet Sheet
* @param columnCount 列数量
*/
public static void autoSizeColumns(
Sheet sheet,
int columnCount) {
for (int i = 0;
i < columnCount;
i++) {
sheet.autoSizeColumn(i);
int width =
sheet.getColumnWidth(i);
sheet.setColumnWidth(
i,
Math.min(
width + 1000,
255 * 256
)
);
}
}
设置下拉框
需要额外导入:
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
/**
* 添加下拉框
*
* @param sheet Sheet
* @param values 下拉数据
* @param firstRow 开始行
* @param lastRow 结束行
* @param col 列号
*/
public static void addDropDownList(
Sheet sheet,
String[] values,
int firstRow,
int lastRow,
int col) {
DataValidationHelper helper =
sheet.getDataValidationHelper();
DataValidationConstraint constraint =
helper.createExplicitListConstraint(
values
);
CellRangeAddressList addressList =
new CellRangeAddressList(
firstRow,
lastRow,
col,
col
);
DataValidation validation =
helper.createValidation(
constraint,
addressList
);
sheet.addValidationData(
validation
);
}
插入图片
/**
* 插入图片
*
* @param workbook 工作簿
* @param sheet Sheet
* @param imageBytes 图片字节数组
* @param row 行号
* @param col 列号
*/
public static void insertImage(
Workbook workbook,
Sheet sheet,
byte[] imageBytes,
int row,
int col) {
int pictureIdx =
workbook.addPicture(
imageBytes,
Workbook.PICTURE_TYPE_PNG
);
Drawing<?> drawing =
sheet.createDrawingPatriarch();
CreationHelper helper =
workbook.getCreationHelper();
ClientAnchor anchor =
helper.createClientAnchor();
anchor.setRow1(row);
anchor.setCol1(col);
Picture picture =
drawing.createPicture(
anchor,
pictureIdx
);
picture.resize();
}
批量设置整行样式
/**
* 设置整行样式
*
* @param row 行
* @param style 样式
*/
public static void setRowStyle(
Row row,
CellStyle style) {
for (Cell cell : row) {
cell.setCellStyle(
style
);
}
}
复制单元格样式(非常实用)
/**
* 复制样式
*
* @param workbook 工作簿
* @param source 源样式
* @return 新样式
*/
public static CellStyle cloneStyle(
Workbook workbook,
CellStyle source) {
CellStyle style =
workbook.createCellStyle();
style.cloneStyleFrom(
source
);
return style;
}