java导出excel设置多行下拉

工具类


import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.util.CellRangeAddressList;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @ClassName ExcelOut
 * @Description: TODO
 * @Author xianyu
 * @Date 2022/01/14
 * @Version V1.0
 **/
public class ExcelOut {


    /**
     * excel导出,有码值的数据使用下拉框展示。解决下拉框最多255个字符的问题。
     * 原理为新建一个隐藏状态的sheet页,用来存储下拉框的值。
     *
     * @param wb            工作簿  HSSFWorkbook
     * @param boxMap       码值集合
     * @param rows         正常sheet页数据,用来指定哪些行需要添加下拉框
     * @param i           多个码值需要添加下拉,隐藏状态的sheet页名称不能重复,添加i值区分。
     * @param colToIndex 用来指定哪些列需要添加下拉框
     * @return dataValidation
     */
    public static List<HSSFDataValidation> createBox1(HSSFWorkbook wb,Map<String, String> boxMap, int rows, int i, int colToIndex) {

        List<HSSFDataValidation> list =new ArrayList<>();

        HSSFDataValidation dataValidation = null;
        String cols1 = "";
        //查询码值集合,获取当前列的码值。
        if (null != boxMap.get("ZZLX")) {
            cols1 = boxMap.get("ZZLX");
        }
        //第一列 组织类型
        String str1[] = cols1.split(",");
        //指定0-9行,0-0列为下拉框
        CellRangeAddressList cas = new CellRangeAddressList(1 , 99999 , 0 , 0);
        //创建下拉数据列
        DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(str1);
        //将下拉数据放入下拉框
        dataValidation = new HSSFDataValidation(cas, dvConstraint);

        list.add(dataValidation);


        String cols2 = "";
        //查询码值集合,获取当前列的码值。
        if (null != boxMap.get("GLQY")) {
            cols2 = boxMap.get("GLQY");
        }
        //新建隐藏状态的sheet,用来存储码值。
        if (cols2.length() > 0 && null != cols2) {
            //管理区域
            String str[] = cols2.split(",");
            //创建sheet页
            HSSFSheet sheet = wb.createSheet("hidden" + i);
            //向创建的sheet页添加码值数据。
            for (int i1 = 0; i1 < str.length; i1++) {
                HSSFRow row = sheet.createRow(i1);
                HSSFCell cell = row.createCell((int) 0);
                cell.setCellValue(str[i1]);
            }
            //将码值sheet页做成excel公式
            Name namedCell = wb.createName();
            namedCell.setNameName("hidden" + i);
            namedCell.setRefersToFormula("hidden" + i + "!$A$1:$A$" + str.length);
            //确定要在哪些单元格生成下拉框
            dvConstraint = DVConstraint.createFormulaListConstraint("hidden" + i);
            CellRangeAddressList regions = new CellRangeAddressList(1, rows, colToIndex, colToIndex);
            dataValidation = new HSSFDataValidation(regions, dvConstraint);
            list.add(dataValidation);
            //隐藏码值sheet页
            int sheetNum = wb.getNumberOfSheets();
            for (int n = 1; n < sheetNum; n++) {
                wb.setSheetHidden(n, true);
            }
        }


        String cols3 = "";
        //查询码值集合,获取当前列的码值。
        if (null != boxMap.get("SJZZ")) {
            cols3 = boxMap.get("SJZZ");
        }
        //上级组织
        String str[] = cols3.split(",");
        //指定0-9行,0-0列为下拉框
        CellRangeAddressList cas2 = new CellRangeAddressList(1 , 99999 , 3 , 3);
        //创建下拉数据列
        DVConstraint dvConstraint2 = DVConstraint.createExplicitListConstraint(str);
        //将下拉数据放入下拉框
        dataValidation = new HSSFDataValidation(cas2, dvConstraint2);

        list.add(dataValidation);


        return list;
    }
}

调用

    @Override
    public void importExcel(HttpServletResponse response) throws UnsupportedEncodingException {
        log.info("导入模板下载");
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
        HSSFSheet sheet = hssfWorkbook.createSheet();
        HSSFRow row = sheet.createRow(0);
        row.createCell(0).setCellValue("组织类型");
        row.createCell(2).setCellValue("管理区域");
        row.createCell(1).setCellValue("组织名称");
        row.createCell(3).setCellValue("上级组织");

        Map<String, String> boxMap = new HashMap<>();
        boxMap.put("ZZLX", "运营监管,养老机构,养老院,服务中心,服务商,评估机构,志愿者团队");

        //查询所有区域
        List<String> areaList = sysAreaMapper.findAreaName();
        String areaName = StringUtils.join(areaList.toArray(), ",");
        boxMap.put("GLQY", areaName);

        //查询现有机构
        List<String> nameList = organTreeMapper.findNameList();
        String organName = StringUtils.join(nameList.toArray(), ",");
        boxMap.put("SJZZ", organName);

        int i = 0;
        List<HSSFDataValidation> dataValidationList = ExcelOut.createBox1(hssfWorkbook, boxMap, 99999, i, 1);
        if (!CollectionUtils.isEmpty(dataValidationList)) {
            for (HSSFDataValidation hssfDataValidation : dataValidationList) {
                sheet.addValidationData(hssfDataValidation);
            }

        }
        String filePath="组织机构导入模板.xls";

        //通过浏览器下载
        response.reset();//清除buffer缓存
        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Expires", " 0");

        try {
            OutputStream output;
            try {
                output=response.getOutputStream();
                BufferedOutputStream bufferOutput =new BufferedOutputStream(output);
                bufferOutput.flush();
                hssfWorkbook.write(bufferOutput);
                bufferOutput.close();
            } catch (Exception e) {
            }
        } catch (Exception e) {
        }
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现多行表头的导出Excel可以使用Apache POI库。下面是一个简单的示例代码,其中包括三个表头行和两个数据行: ```java import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelExporter { public static void export(String[][] data) throws IOException { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 创建表头行1 Row headerRow1 = sheet.createRow(0); CellStyle headerStyle1 = workbook.createCellStyle(); headerStyle1.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); headerStyle1.setFillPattern(CellStyle.SOLID_FOREGROUND); // 设置表头行高 headerRow1.setHeightInPoints(30); // 创建表头单元格 for (int i = 0; i < data[0].length; i++) { Cell cell = headerRow1.createCell(i); cell.setCellValue(data[0][i]); cell.setCellStyle(headerStyle1); } // 合并表头行1 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2)); // 创建表头行2 Row headerRow2 = sheet.createRow(1); CellStyle headerStyle2 = workbook.createCellStyle(); headerStyle2.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex()); headerStyle2.setFillPattern(CellStyle.SOLID_FOREGROUND); // 设置表头行高 headerRow2.setHeightInPoints(30); // 创建表头单元格 Cell cell = headerRow2.createCell(0); cell.setCellValue("Header 1"); cell.setCellStyle(headerStyle2); cell = headerRow2.createCell(1); cell.setCellValue("Header 2"); cell.setCellStyle(headerStyle2); cell = headerRow2.createCell(2); cell.setCellValue("Header 3"); cell.setCellStyle(headerStyle2); // 合并表头行2 sheet.addMergedRegion(new CellRangeAddress(1, 2, 0, 0)); sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 2)); // 创建表头行3 Row headerRow3 = sheet.createRow(2); CellStyle headerStyle3 = workbook.createCellStyle(); headerStyle3.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex()); headerStyle3.setFillPattern(CellStyle.SOLID_FOREGROUND); // 设置表头行高 headerRow3.setHeightInPoints(30); // 创建表头单元格 cell = headerRow3.createCell(1); cell.setCellValue("Sub Header 1"); cell.setCellStyle(headerStyle3); cell = headerRow3.createCell(2); cell.setCellValue("Sub Header 2"); cell.setCellStyle(headerStyle3); // 创建数据行 for (int i = 0; i < data.length - 1; i++) { Row dataRow = sheet.createRow(i + 3); for (int j = 0; j < data[i + 1].length; j++) { Cell dataCell = dataRow.createCell(j); dataCell.setCellValue(data[i + 1][j]); } } // 调整列宽 for (int i = 0; i < data[0].length; i++) { sheet.autoSizeColumn(i); } // 导出Excel文件 FileOutputStream outputStream = new FileOutputStream("output.xlsx"); workbook.write(outputStream); workbook.close(); outputStream.close(); } } ``` 其中,`data`是一个二维数组,第一行是表头,其余行是数据。在代码中,我们创建了三个表头行,分别为“Header 1”、“Header 2”和“Sub Header 1/Sub Header 2”。我们使用`sheet.addMergedRegion`方法将单元格合并以创建多行表头。最后,我们将数据写入Excel文件并导出。你可以根据实际需求修改代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值