• POI导出Excel时下拉列表值超过255的问题(String literals in formulas can't be bigger than 255 characters ASCII)


    //创建Excel工作薄对象

    Workbook workbook = new HSSFWorkbook();

    //生成一个表格 设置:页签

    Sheet sheet = workbook.createSheet("sheet1");

    //去数据库中查询我们想要的数据

    List<Product> productList = Ebean.getServer(GlobalDBControl.getDB()) .createQuery(Product.class, "find product where 1 = 1 and status = 0 and producttype is not null ") .findList();

    //创建一个数组 用来存放 我们取出来的数据

    String[] productNameArray = new String[productList.size()];

    //遍历每个peoduct对象,来获取productName属性并添加到数组中

    for (int i = 0; i < productList.size(); i++)

    { Product product = productList.get(i);

    productNameArray[i] = product.getTitle(); }

    //将下拉框数据放到新的sheet里,然后excle通过新的sheet数据加载下拉框数据

    Sheet hidden = workbook.createSheet("hidden");

    //创建单元格对象 Cell cell = null;

    //遍历我们上面的数组,将数据取出来放到新sheet的单元格中

    for (int i = 0, length = productNameArray.length; i < length; i++)

    { //取出数组中的每个元素

    String name = productNameArray[i];

    //根据i创建相应的行对象(说明我们将会把每个元素单独放一行)

    Row row = hidden.createRow(i);

    //创建每一行中的第一个单元格

    cell = row.createCell(0);

    //然后将数组中的元素赋值给这个单元格

    cell.setCellValue(name); }

    // 创建名称,可被其他单元格引用

    Name namedCell = workbook.createName(); namedCell.setNameName("hidden");

    // 设置名称引用的公式

    namedCell.setRefersToFormula("hidden!$A$1:$A$" + productNameArray.length);

    //加载数据,将名称为hidden的sheet中的数据转换为List形式

    DVConstraint constraint = DVConstraint.createFormulaListConstraint("hidden");

    // 设置第一列的3-65534行为下拉列表

    // (3, 65534, 0, 0) ====> (起始行,结束行,起始列,结束列)

    CellRangeAddressList regions = new CellRangeAddressList(3, 65534, 0, 0);

    // 将设置下拉选的位置和数据的对应关系 绑定到一起

    DataValidation dataValidation = new HSSFDataValidation(regions, constraint);

    //将第二个sheet设置为隐藏 workbook.setSheetHidden(1, true);

    //将数据赋给下拉列表 sheet.addValidationData(dataValidation);

    //最后将文件导出就可以了,后面的代码就不写了,我只写一些这个问题相关的代码

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

       如果出现多列情况,可复用下面方法

    private void ExcelTo255(Workbook workbook,String sheetName,int sheetNameIndex,String[] sheetData,int firstRow,int lastRow,int firstCol,int lastCol){
    //将下拉框数据放到新的sheet里,然后excle通过新的sheet数据加载下拉框数据
    Sheet hidden = workbook.createSheet(sheetName);

    //创建单元格对象
    Cell cell =null;
    //遍历我们上面的数组,将数据取出来放到新sheet的单元格中
    for (int i = 0, length = sheetData.length; i < length; i++){
    //取出数组中的每个元素
    String name = sheetData[i];
    //根据i创建相应的行对象(说明我们将会把每个元素单独放一行)
    Row row = hidden.createRow(i);
    //创建每一行中的第一个单元格
    cell = row.createCell(0);
    //然后将数组中的元素赋值给这个单元格
    cell.setCellValue(name);
    }
    // 创建名称,可被其他单元格引用
    Name namedCell = workbook.createName();
    namedCell.setNameName(sheetName);
    // 设置名称引用的公式
    namedCell.setRefersToFormula(sheetName+"!$A$1:$A$" + sheetData.length);
    //加载数据,将名称为hidden的sheet中的数据转换为List形式
    DVConstraint constraint = DVConstraint.createFormulaListConstraint(sheetName);

    // 设置第一列的3-65534行为下拉列表
    // (3, 65534, 2, 2) ====> (起始行,结束行,起始列,结束列)
    CellRangeAddressList regions = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
    // 将设置下拉选的位置和数据的对应关系 绑定到一起
    DataValidation dataValidation = new HSSFDataValidation(regions, constraint);

    //将第二个sheet设置为隐藏
    workbook.setSheetHidden(sheetNameIndex, true);
    //将数据赋给下拉列表
    workbook.getSheetAt(0).addValidationData(dataValidation);
    }
  • 相关阅读:
    解决GIT可视化工具Sourcetree拉取失败问题
    记录常用Git命令
    vue开发移动端使用rem的适配方案
    使用HBuilderX实现打包vue项目成app
    使用vue+webpack从零搭建项目
    整理最近面试问道的问题
    模块化之seaJs学习和使用
    理解Object.defineProperty的作用
    vue生命周期
    使用gulp编译sass
  • 原文地址:https://www.cnblogs.com/jrkl/p/13632289.html
Copyright © 2020-2023  润新知