有excel需要导出模板如下。 excel模板导出什么样的标题也是根据前端选项进行配置的。除此之外,每一行都是不固定的标题,因此面临了很大的困难。
利用java poi,自定义编写每一个单元格(业务方面省略)
依赖包:
三、具体实现org.apache.poi poi-ooxml 3.17 org.apache.poi poi-ooxml-schemas 3.17 org.apache.poi poi 3.17
流式数据导出:
XSSFWorkbook wb = new XSSFWorkbook();//创建工作薄
OutputStream os = null;
try {
String sheetName = "template";
// 输出Excel文件
os = response.getOutputStream();
// response.setContentType("application/x-download");
// response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf8");
response.setHeader("Content-Disposition", "attachment;filename=" + sheetName + ".xlsx");
wb.write(os);
os.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
设置单元格格式:
XSSFWorkbook wb = new XSSFWorkbook();//创建工作薄
XSSFCellStyle style = wb.createCellStyle();
// style.setAlignment(XSSFCellStyle.); // 创建一个居中格式
//字体样式
XSSFFont fontStyle = wb.createFont();
fontStyle.setFontName("微软雅黑");
fontStyle.setFontHeightInPoints((short) 12);
fontStyle.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
style.setFont(fontStyle);
// 设置列宽,第0列,列宽为8000
sheet1.setColumnWidth(0, 8000); //设置每列的列宽
// 生成单元格的颜色,水平对齐等
XSSFCellStyle titleStyle = createCellStyle(wb, CellColorStyleEnum.SECONDARY_TITLE, HorizontalAlignment.LEFT);
// 创建新行,行号为0
XSSFRow rowFirst = sheet.createRow(0);
// 创建单元格(注意需要用到的最好创建一下,因为不然读取会读取到null)
// 创建新单元格,单元格为该行的第0个单元格
XSSFCell cell1 = rowFirst.createCell(0);
// 设置单元格格式
cell1.setCellStyle(titleStyle);
//往单元格里写数据
cell1.setCellValue("哈哈哈哈");
生成单元格格式方法:
private enum CellColorStyleEnum {
SECONDARY_TITLE(1, "副标题颜色", "#A9D08E"),
THIRD_TITLE(2, "三级标题颜色", "#C6E0B4"),
FOURTH_TITLE(3, "四级标题颜色", "#E2EFDA"),
LEFT_ZONE(4, "左侧区域颜色", "#F2F2F2");
private CellColorStyleEnum(Integer code, String type, String colorValue) {
this.code = code;
this.type = type;
this.colorValue = colorValue;
}
@EnumValue
public int code;
@JsonValue
public String type;
// 颜色色号
public String colorValue;
public Integer getCode() {
return this.code;
}
@JSONField
public String getType() {
return this.type;
}
public Integer getValue() {
return this.getCode();
}
}
private XSSFCellStyle createCellStyle(XSSFWorkbook wb, CellColorStyleEnum cellColorStyleEnum, HorizontalAlignment horizontalAlignment) {
String colorValue = cellColorStyleEnum.colorValue;
int r = Integer.parseInt(colorValue.substring(1, 3), 16);
int g = Integer.parseInt(colorValue.substring(3, 5), 16);
int b = Integer.parseInt(colorValue.substring(5, 7), 16);
XSSFCellStyle style = wb.createCellStyle();
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(r, g, b)));
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style.setAlignment(horizontalAlignment);
return style;
}
数据读取与写入:
XSSFWorkbook wb = new XSSFWorkbook();//创建工作薄
//表头样式
XSSFCellStyle style = wb.createCellStyle();
// style.setAlignment(XSSFCellStyle.); // 创建一个居中格式
//字体样式
XSSFFont fontStyle = wb.createFont();
fontStyle.setFontName("微软雅黑");
fontStyle.setFontHeightInPoints((short) 12);
// fontStyle.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
style.setFont(fontStyle);
//新建sheet
XSSFSheet sheet = wb.createSheet("Sheet1");
//生成sheet1内容
XSSFRow rowFirst = sheet.createRow(rowIndex);//第一个sheet的第一行为标题
XSSFCell cell = rowFirst.createCell(TYPE_INDEX); //获取第一行的每个单元格
// sheet.setColumnWidth(TYPE_INDEX, 4000); //设置每列的列宽
// cell.setCellStyle(style); //加样式
cell.setCellValue(title); //往单元格里写数据
单元格读取,个人人为最好直接读取为String类型,然后根据需要进行类型转换,不然直接读取Integer等容易出问题:
String str = getSheetCellString(sheet, i, j);
public String getSheetCellString(XSSFSheet sheet, int rowIndex, int colIndex) {
if (Objects.isNull(sheet)) {
return Constant.EMPTY_STRING;
}
XSSFRow row = sheet.getRow(rowIndex);
if (Objects.isNull(row)) {
return Constant.EMPTY_STRING;
}
XSSFCell cell = row.getCell(colIndex);
String strValue = Objects.isNull(cell) ? Constant.EMPTY_STRING : cell.toString();
return strValue;
}
下拉框设置:
// 设置单位
sheet.addValidationData(setDataValidation(wb, sheet, arr, rowIndex, rowIndex, UNIT_COL_INDEX, UNIT_COL_INDEX)); //超过255个报错
private static DataValidation setDataValidation(XSSFWorkbook wb, Sheet sheet, String[] textList, int firstRow, int endRow, int firstCol, int endCol) {
// 如果下拉框长度小于255,可以直接添加约束
if (String.join(",", textList).length() < 255) {
DataValidationHelper helper = sheet.getDataValidationHelper();
//加载下拉列表内容
DataValidationConstraint constraint = helper.createExplicitListConstraint(textList);
//DVConstraint constraint = new DVConstraint();
constraint.setExplicitListValues(textList);
//设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列
// CellRangeAddressList regions = new CellRangeAddressList((short) firstRow, (short) endRow, (short) firstCol, (short) endCol);
CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
//数据有效性对象
DataValidation data_validation = helper.createValidation(constraint, regions);
//DataValidation data_validation = new DataValidation(regions, constraint);
return data_validation;
} else {
// 如果下拉框长度大于255,需要建立隐藏sheet来加载下拉框
//获取所有sheet页个数
int sheetTotal = wb.getNumberOfSheets();
String hiddenSheetName = "hiddenSheet" + sheetTotal;
XSSFSheet hiddenSheet = (XSSFSheet) wb.createSheet(hiddenSheetName);
Row row;
int column = 0;
String columnStr = "A";
//写入下拉数据到新的sheet页中
for (int i = 0; i < textList.length; i++) {
row = hiddenSheet.createRow(i);
Cell cell = row.createCell(column);
cell.setCellValue(textList[i]);
}
//获取新sheet页内容
// String strFormula = hiddenSheetName + "!$" + column + "$1:$" + column + "$65535";
String strFormula = hiddenSheetName + "!$" + columnStr + "$1:$" + columnStr + "$65535";
XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, strFormula);
// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
// 数据有效性对象
DataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet) sheet);
DataValidation validation = help.createValidation(constraint, regions);
// sheet.addValidationData(validation);
//将新建的sheet页隐藏掉
wb.setSheetHidden(sheetTotal, true);
return validation;
}
}
参考文献:
java动态生成带下拉框的Excel导入模板
POI excel添加数据有效性验证以及解决DataValidation超长的问题
java poi 自定义颜色_POI将单元格背景设置为自定义颜色
POI 设置Excel单元格背景色(setFillForegroundColor 与 setFillPattern 的使用)
java中poi导出Excel表格(前台流文件接收)
java POI 单元格格式设置居中
POI中设置Excel单元格格式样式(居中,字体,边框等)
EasyPoi导出Excel带下拉框,值超过255报错问题
阿里的easyexcel导出 下拉列表超过255个字 解决办法



