java导出excel自定义模板下载(包含生成模板的excel下拉框数据)

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中需要下拉框数据的列,也会在项目中写入,生成的模板下拉框数据都是中文信息,导入时需根据中文再匹配枚举值。
以上内容,仅供各位兄弟姐妹参考,如发现问题,请各位多提出宝贵意见。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
下面是使用Java的POI生成带下框的Excel模板的示例代码: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.xssf.usermodel.XSSFDataValidation; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; public class ExcelTemplateGenerator { public static void main(String[] args) throws Exception { // 创建工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); // 创建工作表 XSSFSheet sheet = workbook.createSheet("Sheet1"); // 创建下框选项 String[] options = {"Option1", "Option2", "Option3"}; // 创建数据有效性对象 DataValidationHelper validationHelper = sheet.getDataValidationHelper(); CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0); DataValidationConstraint constraint = validationHelper.createExplicitListConstraint(options); DataValidation dataValidation = validationHelper.createValidation(constraint, addressList); // 将数据有效性对象应用于单元格 sheet.addValidationData(dataValidation); // 创建单元格样式 CellStyle style = workbook.createCellStyle(); style.setFillForegroundColor(IndexedColors.YELLOW.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 创建单元格 Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("Select an option"); cell.setCellStyle(style); // 输出Excel文件 FileOutputStream outputStream = new FileOutputStream("template.xlsx"); workbook.write(outputStream); workbook.close(); outputStream.close(); } } ``` 在上面的示例代码中,我们首先创建了一个工作簿和一个工作表。然后,我们定义了下框选项,并使用`DataValidationHelper`类创建了一个数据有效性对象。接下来,我们将数据有效性对象应用于单元格,并在单元格中设置了样式。最后,我们将工作簿输出到文件系统中。 需要注意的是,上面的示例代码使用了`XSSFWorkbook`类来创建Excel文件,这意味着生成Excel文件将是一个XLSX文件。如果你需要生成一个XLS文件,可以使用`HSSFWorkbook`类代替。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑对&人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值