EasyExcel導出帶下拉框,並解決導出之后打開總是顯示發現不可讀取內容


參考了這位大佬的代碼:https://blog.csdn.net/qq_42747210/article/details/113063645

 主要原因是:excel本身每個單元格限制了255個字符,下拉框總字符超過255就無法正常打開

 

 

因為我有多列需要下拉框,所有用Map來裝數據,key為需要下拉框的列,value為該列下拉框的值;我只是設置了序號為1到50的行需要下拉框;

import java.util.Map;

import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddressList;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;

public class CustomSheetWriteHandler implements SheetWriteHandler {

    private Map<Integer, String[]> map;

    private int index;

    public CustomSheetWriteHandler(Map<Integer, String[]> map) {
        this.map = map;
        this.index = 0;
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

        DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper();

        // k 為存在下拉數據集的單元格下表 v為下拉數據集
        map.forEach((k, v) -> {
            // 創建sheet,突破下拉框255的限制
            // 獲取一個workbook
            Workbook workbook = writeWorkbookHolder.getWorkbook();
            // 定義sheet的名稱
            String sheetName = "sheet" + k;
            // 1.創建一個隱藏的sheet 名稱為 proviceSheet
            Sheet proviceSheet = workbook.createSheet(sheetName);
            // 從第二個工作簿開始隱藏
            this.index++;
            // 設置隱藏
            workbook.setSheetHidden(this.index, true);
            // 2.循環賦值(為了防止下拉框的行數與隱藏域的行數相對應,將隱藏域加到結束行之后)
            for (int i = 0, length = v.length; i < length; i++) {
                // i:表示你開始的行數 0表示你開始的列數
                proviceSheet.createRow(i).createCell(0).setCellValue(v[i]);
            }
            Name category1Name = workbook.createName();
            category1Name.setNameName(sheetName);
            // 4 $A$1:$A$N代表 以A列1行開始獲取N行下拉數據
            category1Name.setRefersToFormula(sheetName + "!$A$1:$A$" + (v.length));
            // 5 將剛才設置的sheet引用到你的下拉列表中,1表示從行的序號1開始(開始行,通常行的序號為0的行是表頭),50表示行的序號50(結束行),表示從行的序號1到50,k表示開始列序號和結束列序號
            CellRangeAddressList addressList = new CellRangeAddressList(1, 50, k, k);
            DataValidationConstraint constraint8 = helper.createFormulaListConstraint(sheetName);
            DataValidation dataValidation3 = helper.createValidation(constraint8, addressList);
       
// 阻止輸入非下拉選項的值
dataValidation3.setErrorStyle(DataValidation.ErrorStyle.STOP);
dataValidation3.setShowErrorBox(true);
dataValidation3.setSuppressDropDownArrow(true);
dataValidation3.createErrorBox("提示", "此值與單元格定義格式不一致");
// validation.createPromptBox("填寫說明:","填寫內容只能為下拉數據集中的單位,其他單位將會導致無法入倉");
writeSheetHolder.getSheet().addValidationData(dataValidation3);
 }); } }

 

調用:

EasyExcel.write(response.getOutputStream()).head(outDto.getHeadList())
                .registerWriteHandler(new CustomSheetWriteHandler(map)).registerWriteHandler(new Custemhandler())
                .sheet("導出模板").doWrite(outDto.getDataList());

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM