java poi 导出excel模版
程序员文章站
2024-01-03 21:43:10
...
缘起:应业务需求,提供excel导入的方式保存数据,其实excel导入导出功能很常见,之前也做过很多次,一直忘记记录,写个文章当备份使用
操作excel的常见两种方式大家应该都知道,jxl 和 poi,我就不做比较了,这里我选用的是Apache POI,因为想支持.xlsx格式的excel版本
做excel导入之前,想先做一个excel模板导出功能,方便业务使用
先写了个测试类,导入poi 的jar包,这里我用的3.9版本
/**
* Description : 获取出借方案导入excel
* @return HSSFWorkbook
*/
public static HSSFWorkbook getLendPlanImportExcel() {
String[] hssfCellValues = new String[]{"序号", "到期日期(如:20180415)", "计划名称", "收益结算类型", "当前期望收益率单利(不带%号,如:7.34)", "起投金额(单位:元)", "募集总金额(单位:元)", "初始状态", "推荐", "转投购买", "定制购买"};
//创建Excel工作簿对象
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
//创建Excel的sheet
HSSFSheet hssfSheet = hssfWorkbook.createSheet("出借计划生成方案导入");
//设置默认宽度
hssfSheet.setDefaultColumnWidth(10);
//设置默认高度
hssfSheet.setDefaultRowHeightInPoints(15);
//设置第二列的宽度
hssfSheet.setColumnWidth(1, 6000);
//设置第三列的宽度
hssfSheet.setColumnWidth(2, 6000);
//设置第五列的宽度
hssfSheet.setColumnWidth(4, 10000);
//设置第六列的宽度
hssfSheet.setColumnWidth(5, 5000);
//设置第七列的宽度
hssfSheet.setColumnWidth(6, 5000);
// 收益结算类型下拉列表数据
String[] clearingManners = new String[]{"到期支付", "按月支付"};
// 初始状态下拉列表数据
String[] states = new String[]{"启用", "禁用"};
// 初始推荐状态下拉列表数据
String[] recommendedStates = new String[]{"推荐", "未推荐"};
// 初始状态下拉列表数据
String[] isTransfers = new String[]{"可", "不可"};
// 初始状态下拉列表数据
String[] isCustomizes = new String[]{"可", "不可"};
Map<Integer, String[]> map = new HashMap<>();
map.put(3, clearingManners);
map.put(7, states);
map.put(8, recommendedStates);
map.put(9, isTransfers);
map.put(10, isCustomizes);
Set<Map.Entry<Integer, String[]>> set = map.entrySet();
Iterator<Map.Entry<Integer, String[]>> iterator = set.iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, String[]> item = iterator.next();
// 设置第一列的1-100行为下拉列表
CellRangeAddressList clearingMannerAddressList = new CellRangeAddressList(1, 99, item.getKey(), item.getKey());
// 创建下拉列表数据
DVConstraint clearingMannerConstraint = DVConstraint.createExplicitListConstraint(item.getValue());
// 绑定
HSSFDataValidation clearingMannerValidation = new HSSFDataValidation(clearingMannerAddressList, clearingMannerConstraint);
hssfSheet.addValidationData(clearingMannerValidation);
}
//创建一个样式
HSSFCellStyle hssfCellStyle = hssfWorkbook.createCellStyle();
// 设置这些样式
hssfCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
hssfCellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
// 背景色
hssfCellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
hssfCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
hssfCellStyle.setFillBackgroundColor(HSSFColor.GREY_25_PERCENT.index);
// 设置边框
hssfCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
hssfCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
hssfCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
hssfCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
// 自动换行
// hssfCellStyle.setWrapText(true);
// 生成一个字体
HSSFFont font = hssfWorkbook.createFont();
font.setFontHeightInPoints((short) 11);
font.setColor(HSSFColor.BLACK.index);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("微软雅黑");
// 把字体 应用到当前样式
hssfCellStyle.setFont(font);
//创建Excel的行,在sheet中添加表头第1行
HSSFRow hssfRow = hssfSheet.createRow(0);
//创建Excel单元格
HSSFCell hssfCell;
for (int i = 0; i < hssfCellValues.length; i++) {
hssfCell = hssfRow.createCell(i);
hssfCell.setCellValue(hssfCellValues[i]);
hssfCell.setCellStyle(hssfCellStyle);
}
//创建excel第2到100行
for (int i = 1; i <= 100; i++) {
//行
HSSFRow row = hssfSheet.createRow(i);
//单元格
HSSFCell cell;
//创建一个样式
HSSFCellStyle style = hssfWorkbook.createCellStyle();
// 设置这些样式
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
// 设置边框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
for (int j = 0; j < hssfCellValues.length; j++) {
cell = row.createCell(j);
String cellValue = "";
switch (j) {
case 0:
cellValue = String.valueOf(i);
break;
case 3:
cellValue = "到期支付";
break;
case 7:
cellValue = "启用";
break;
case 8:
cellValue = "未推荐";
break;
case 9:
cellValue = "可";
break;
case 10:
cellValue = "可";
break;
}
cell.setCellValue(cellValue);
cell.setCellStyle(style);
}
}
return hssfWorkbook;
}
测试一下导出到本地
public static void main(String[] args) {
HSSFWorkbook hssfWorkbook = ExcelUtil.getLendPlanImportExcel();
try {
FileOutputStream fileOut = new FileOutputStream("/Users/JustWyx/Downloads/test.xls");
hssfWorkbook.write(fileOut);
} catch (IOException e) {
e.printStackTrace();
}
}
导出后的样式
接下来就可以放入项目中了,添加下载链接
<a href="../excel/getLendPlanImportExcel.do">获取导入出借方案模版</a>
controller
@RequestMapping(value = "/getLendPlanImportExcel", method = RequestMethod.GET)
public void getLendPlanImportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
HSSFWorkbook hssfWorkbook = iLendPlanExcelService.getLendPlanImportExcel();
OutputStream output = response.getOutputStream();
response.addHeader("Content-Disposition", "inline;filename=" +
URLEncoder.encode("出借计划数据","UTF-8") + new SimpleDateFormat("yyyyMMdd").format(new Date()) + ".xls");
response.setContentType("application/msexcel");
hssfWorkbook.write(output);
output.close();
}
点击链接下载,如图