资讯专栏INFORMATION COLUMN

AbstractXlsxView导出带有下拉框列的Excel

sewerganger / 1876人阅读

摘要:在导出数据的时候,遇到了某一列要设置为下拉框选择,前辈们在网上都是简单的例子,没有下拉框的设置,索性自己折腾一下。

AbstractXlsxView 在导出Excel数据的时候,遇到了某一列要设置为下拉框选择,前辈们在网上都是简单的例子,没有下拉框的设置,索性自己折腾一下。

Controller:

...
    @Autowired
    private ActivityMonitorService monitorService;
...
    @GetMapping("/downloadExcel")
    public ModelAndView downloadExcel() {
        ExcelView excelView = new ExcelView();
        // 该map组装excelView用到的数据及表头
        Map map = monitorService.uploadExcelParam();
        return new ModelAndView(excelView, map);
    }
... 

AbstractXlsxView实现类:

import com.jason.dto.ActivityMonitorDto;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.view.document.AbstractXlsxView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

/**
 * 导出xlsx数据
 */
@Service
public class ExcelView extends AbstractXlsxView {

    private final int MAX_ROW = 65535;

    @Override
    protected void buildExcelDocument(Map map, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String name = (String) map.get("fileName");
        if (StringUtils.isEmpty(name)) {
            name = "Template";
        }
        String fileName =  name + ".xlsx";
        // 火狐浏览器乱码解决
        String agent = request.getHeader("User-Agent");
        if (agent != null) {
            if ("firefox".contains(agent.toLowerCase())) {
                response.setHeader("content-disposition", String.format("attachment;filename*=utf-8"zh_cn"%s", URLEncoder.encode(fileName,"utf-8")));
            } else {
                response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
            }
        }
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/ms-excel;charset=utf-8");

        Sheet sheet = workbook.createSheet();

        String[] headerTitle = (String[]) map.get("headers");
        Row header = sheet.createRow(0);
        for (int i = 0; i < headerTitle.length; i++) {
            header.createCell(i).setCellValue(headerTitle[i]);
        }

        // 需要导出的数据
        List list = (List) map.get("content");
        for (int i = 0; i < list.size(); i++) {
            Row row = sheet.createRow(i + 1);
            row.createCell(0).setCellValue(list.get(i).getActName());
            row.createCell(1).setCellValue(list.get(i).getActId());
            // 第三列填写默认值
            row.createCell(2).setCellValue(list.get(i).getReleaseTime());
            row.createCell(3).setCellValue(list.get(i).getPointPositionName());
            // 第五列填写默认值
            row.createCell(4).setCellValue(list.get(i).getAttributeName());
            row.createCell(5).setCellValue(list.get(i).getUseChannelName());
            row.createCell(6).setCellValue(list.get(i).getRemark());
        }

        // 普通格式组装完毕,开始设置下拉框
        DataValidationHelper helper = sheet.getDataValidationHelper();

        // 下拉框的option数据
        String[] pointPositionArray = (String[]) map.get("pointPositionArray");
        String[] channelArray = (String[]) map.get("channelArray");

        // 第三和第五列设置为下拉框
        DataValidationConstraint constraintPosition = helper.createExplicitListConstraint(pointPositionArray);
        CellRangeAddressList regionsPosotion = new CellRangeAddressList(1, MAX_ROW, 3, 3);
        DataValidation positionData = helper.createValidation(constraintPosition, regionsPosotion);
        
        DataValidationConstraint constraintChannel = helper.createExplicitListConstraint(channelArray);
        CellRangeAddressList regionChannel = new CellRangeAddressList(1, MAX_ROW, 5, 5);
        DataValidation channelData = helper.createValidation(constraintChannel, regionChannel);

        //处理Excel兼容性问题
        if(positionData instanceof XSSFDataValidation) {
            positionData.setSuppressDropDownArrow(true);
            positionData.setShowErrorBox(true);
        }else {
            positionData.setSuppressDropDownArrow(false);
        }
        if(channelData instanceof XSSFDataValidation) {
            channelData.setSuppressDropDownArrow(true);
            channelData.setShowErrorBox(true);
        }else {
            channelData.setSuppressDropDownArrow(false);
        }
        sheet.addValidationData(positionData);
        sheet.addValidationData(channelData);
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77492.html

相关文章

  • 使用 SpreadJS 实现 JavaScript 中导入和导出Excel文件

    摘要:而作为一款深受用户喜爱的电子表格工具,借助其直观的界面出色的计算性能和图表工具,已经成为数据统计领域不可或缺的软件之一。使用实现的导入和导出通过纯,您完全可以实现导入和导出文件功能,并为最终用户提供与这些文件进行交互的界面。 JavaScript是一个涵盖多种框架、直译式、可以轻松自定义客户端的脚本语言,在 Web 应用程序中,更加易于编码和维护。而Excel 作为一款深受用户喜爱的电...

    Jioby 评论0 收藏0
  • poi导出excel 下拉列表值超过255问题

    摘要:为首行赋值设置列宽第一个下拉选新建一个页数据对应列下拉框数据测试数据写入下拉数据到新的页中获取新页内容设置数据有效性加载在哪个单元格上四个参数分别是起始行终止行起始列终止列数据有效性对象将新建的页隐藏掉第二个下拉选对应列下拉框数据测试数据 public void exportExcel(List list,HttpServletResponse response,String fil...

    gyl_coder 评论0 收藏0
  • Java实现excel导入导出学习笔记2 - 利用xml技术设置导入模板,设置excel样式

    摘要:四个参数分别是起始行终止行起始列终止列数据有效性对象包下载百度云盘外链 showImg(/img/bVqclu); xml文件 ...

    I_Am 评论0 收藏0
  • 一文带你斩杀Python之Numpy☀️Pandas全部操作【全网最详细】❗❗❗

    目录Numpy简介Numpy操作集合1、不同维度数据的表示1.1 一维数据的表示1.2 二维数据的表示1.3 三维数据的表示2、 为什么要使用Numpy2.1、Numpy的ndarray具有广播功能2.2 Numpy数组的性能比Python原生数据类型高3 ndarray的属性和基本操作3.1 ndarray的基本属性3.2 ndarray元素类型3.3 创建ndarray的方式3.4 ndarr...

    asoren 评论0 收藏0
  • php处理Excel

    摘要:导出成为在绝大多数情况下,导出其实就是将二维数组转化为表格。要保存的的名字转换为表格的二维数组设置表格填充数据设置表格并输出导入同理,导入其实就是将的数据转化成为二维数组,这就要求必须符合格式。 遇到问题 平时在工作中,时常会出现将数据库表导出为Excel或者将Excel导入数据库表的需求。这一需求早早就已经实现过了,为了方便导入导出,我将其封装成了两个方法,作为记录。 代码实现 ph...

    gitmilk 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<