java导出excel自定义模板下载(包含生成模板的excel下拉框数据)
1. maven的pom文件引入一下内容
<!-- excel工具 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
2. 工具类
DownLoadTrendsTitleUtils.java
package com.example.util.utils.excel;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* Created by Intellij IDEA.
*
*/
@Slf4j
public class DownLoadTrendsTitleUtils {
/**
* excel自定义动态表头模板下载
* @param columnNameList 标题名称
* @param fileName 文件名称
* @param sheetName 工作表空间名称
* @param response 返回参水
*/
public void downloadDongTaiMuBan(List<Map<String, Object>> columnNameList,
String fileName, String sheetName,
HttpServletResponse response, String titleName) {
try {
if (columnNameList != null && !columnNameList.isEmpty()) {
// 设置请求
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
ExcelDownloadUtil.getExcelTitleTemplate(response, sheetName, columnNameList, titleName);
}
} catch (Exception e) {
e.printStackTrace();
log.error("生成下载动态模板异常!", e);
}
}
}
ExcelDownloadUtil.java
package com.example.util.utils.excel;
import org.apache.poi.hssf.record.cf.BorderFormatting;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.*;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
/**
* 模板下载工具类
*/
public class ExcelDownloadUtil {
/**
* 标题单元格默认长度
*/
private static final int DEFAULT_COLUMN_SIZE = 20;
/**
* EXCEL含有下拉列表默认受影响行数
*/
private static final int SELECT_HEIGHT = 300;
/**
* 用于动态生成导出模板
*
* @param response 用于下载
* @param sheetName 工作表空间名称
* @param columnNames List中的map的两个key:1:columnName字段名,2:selectValue下拉框数据
* @param title Excle模板标题,不需要则传null
* @throws Exception
*/
public static void getExcelTitleTemplate(HttpServletResponse response, String sheetName,
List<Map<String, Object>> columnNames, String title) throws Exception {
Workbook workBook = new XSSFWorkbook();
// 生成一个表格
Sheet sheet = workBook.getSheet(sheetName);
if (sheet == null) {
sheet = workBook.createSheet(sheetName);
}
// 最新Excel列索引,从0开始
int lastRowIndex = sheet.getLastRowNum() + 1;
if (lastRowIndex > 0) {
lastRowIndex++;// 如果已经存在了工作表空间则从下一行开始
}
// if (!StringUtils.isBlank(title)) {
// // 如果需要合并单元格显示一个大的title
// Row titleRow = sheet.createRow(lastRowIndex);
//参数说明:1.起始行号 2.终止行号 3.起始列号 4.终止列号
//这个需要实际情况自定义,我这里测试就写死0 0 0 4 了
CellRangeAddress region = new CellRangeAddress(0, 0, 0, 4);
sheet.addMergedRegion(region);// 合并单元格
// Cell cellTiltle = titleRow.createCell(0);
// // 设置样式
// cellTiltle.setCellStyle(createCellHeadStyle(workBook, false));
// // 单元格设置值
// cellTiltle.setCellValue(title);
// lastRowIndex++;
// }
// 设置表格默认列宽度
sheet.setDefaultColumnWidth(DEFAULT_COLUMN_SIZE);
// 产生表格表头列标题行
Row row = sheet.createRow(lastRowIndex);
for (int i = 0; i < columnNames.size(); i++) {
Map<String, Object> map = columnNames.get(i);
Cell cell = row.createCell(i);
// 设置单元格类型
// cell.setCellType(CellType.STRING);
// 设置单元格样式
cell.setCellStyle(createCellHeadStyle(workBook));
// 填充表头文本
RichTextString text = new XSSFRichTextString((String)map.get("columnName"));
cell.setCellValue(text);
//创建一个单元格样式
CellStyle style = workBook.createCellStyle();
//创建一个数据格式
DataFormat format = workBook.createDataFormat();
//将这个数据格式设定为文本型,“@”就代表文本型
style.setDataFormat(format.getFormat("@"));
//将第一列设置为文本型
sheet.setDefaultColumnStyle(i, style);
if (null != map.get("selectValue")) {
String[] selectValue = (String[])map.get("selectValue");
// 如果需要有下拉列表则显示
if (selectValue != null && selectValue.length != 0) {
// 准备下拉列表数据
CellRangeAddressList regions = new CellRangeAddressList(1, SELECT_HEIGHT, i, i);
// 创建下拉列表数据
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)sheet);
XSSFDataValidationConstraint dvConstraint =
(XSSFDataValidationConstraint)dvHelper.createExplicitListConstraint(selectValue);
XSSFDataValidation validation = (XSSFDataValidation)dvHelper.createValidation(dvConstraint, regions);
validation.setSuppressDropDownArrow(true);
validation.setShowErrorBox(true);
sheet.addValidationData(validation);
}
}
}
OutputStream outputStream = response.getOutputStream();
// HSSFWorkbook写入流,下载
workBook.write(outputStream);
// 刷新流
outputStream.flush();
// 关闭流
outputStream.close();
}
/**
* 创建单元格表头样式
*
* @param workbook 工作薄
* @return
*/
private static CellStyle createCellHeadStyle(Workbook workbook) {
CellStyle style = workbook.createCellStyle();
// 设置边框样式
style.setBorderBottom(BorderStyle.valueOf(BorderFormatting.BORDER_THIN));
style.setBorderLeft(BorderStyle.valueOf(BorderFormatting.BORDER_THIN));
style.setBorderRight(BorderStyle.valueOf(BorderFormatting.BORDER_THIN));
style.setBorderTop(BorderStyle.valueOf(BorderFormatting.BORDER_THIN));
// 设置对齐样式
style.setAlignment(HorizontalAlignment.CENTER);
// 生成字体
Font font = workbook.createFont();
// 表头样式
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 如果是true,则显示黄色背景色
style.setFillForegroundColor(HSSFColor.HSSFColorPredefined.CORNFLOWER_BLUE.getIndex());
font.setFontHeightInPoints((short)10);
//字体颜色
font.setColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex());
//设置字体样式
font.setFontName("微软雅黑");
//加粗
font.setBold(true);
// 把字体应用到当前的样式
style.setFont(font);
//设置单元格格式
//创建一个数据格式
DataFormat format = workbook.createDataFormat();
//将这个数据格式设定为文本型,“@”就代表文本型
style.setDataFormat(format.getFormat("@"));
return style;
}
}
3. controller
package com.example.util.controller;
import com.example.util.service.ExportService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
/**
* 导出工具Controller
*
*/
@RestController
@RequestMapping("/exportUtil")
@Slf4j
public class ExportController {
@Resource
private ExportService exportService;
/**
* 导入自定义模板下载
* 模板包含下拉框数据
* @param response 响应
*
*/
@RequestMapping(value = "/exportCustomElderTemplate",method = RequestMethod.POST)
public void exportCustomTemplate(HttpServletResponse response){
exportService.exportCustomElderTemplate(response);
}
}
4. service
package com.example.util.service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
* Created by Intellij IDEA.
*
*/
public interface ExportService {
/**
* 导入自定义模板下载
* 模板包含下拉框数据
* @param response 响应信息
*/
void exportCustomElderTemplate(HttpServletResponse response);
}
5. service实现类
package com.example.util.service.impl;
import com.example.util.service.ExportService;
import com.example.util.utils.excel.DownLoadTrendsTitleUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Intellij IDEA.
*
*/
@Slf4j
@Service
public class ExportServiceImpl implements ExportService {
/**
* 导入自定义模板下载
* 模板包含下拉框数据
* @param response 响应信息
*/
@Override
public void exportCustomElderTemplate(HttpServletResponse response) {
try {
DownLoadTrendsTitleUtils utils = new DownLoadTrendsTitleUtils();
//封装excel表头信息
List<String> displayTitleList = listXianShiField();
//封装需要下拉框内容的列的下拉框数据
List<Map<String, Object>> columnNames = getColumnNames(displayTitleList);
String fileName = "导出信息.xlsx";
String sheetName = "导出数据";
utils.downloadDongTaiMuBan(columnNames,fileName, sheetName, response, "导出信息");
} catch (Exception e) {
e.printStackTrace();
log.error("生成下载动态模板异常!", e);
}
}
/**
* 封装excel表头信息字段
* @return 返回要导出的excel表头信息
*/
private List<String> listXianShiField() {
List<String> list = new ArrayList<>();
list.add("姓名");
list.add("手机号");
list.add("性别");
list.add("年龄");
list.add("人员类型");
return list;
}
/**
* 获取下拉框列数据
* @param displayTitleList 表头信息
* @return 返回下拉框数据
*/
private List<Map<String, Object>> getColumnNames(List<String> displayTitleList) {
List<Map<String, Object>> columnNames = new ArrayList<Map<String, Object>>();
Map<String, Object> resultMap = null;
List<String> selectValueList = null;
for (int i = 0, len = displayTitleList.size(); i < len; i++) {
resultMap = new HashMap<String, Object>();
// 得到下载的字段名称
String columnName = displayTitleList.get(i);
resultMap.put("columnName", columnName);
//封装字段对应下拉信息
makeDropDown(resultMap, selectValueList, columnName);
columnNames.add(resultMap);
}
return columnNames;
}
/**
* 封装字段对应下拉信息
*
* @param resultMap 封装的模板表头信息
* @param selectValueList 下拉框数据
* @param columnName 表头字段名
*/
private static void makeDropDown(Map<String, Object> resultMap, List<String> selectValueList, String columnName) {
if ("人员类型".equals(columnName)) {
selectValueList = new ArrayList<>();
selectValueList.add("校长");
selectValueList.add("班主任");
selectValueList.add("代课老师");
resultMap.put("selectValue", selectValueList.toArray(new String[selectValueList.size()]));
}
}
}
6.总结
此方法可实现生成需要导入的excel模板,包含excel中需要下拉框数据的列,也会在项目中写入,生成的模板下拉框数据都是中文信息,导入时需根据中文再匹配枚举值。
以上内容,仅供各位兄弟姐妹参考,如发现问题,请各位多提出宝贵意见。