NPOI生成單元格(列)下拉框


客戶提出能否將導入模板中,課程一列添加下拉框方便選擇,不用手輸入,以減少輸入錯誤的可能性。於是在網上找了點代碼,稍加整理后,形成了以下方案,代碼部分:

一:生成課程列表,並放置在excel的單獨sheet中。

IList<CourseCodeInfo> list = StudentBus.GetSubjectInterface().GetList(0, "", "Name");

var CourseSheetName = "Course";
var RangeName = "dicRange";

ISheet CourseSheet = workbook.CreateSheet(CourseSheetName);

CourseSheet.CreateRow(0).CreateCell(0).SetCellValue("課程列表(用於生成課程下拉框,請勿修改)");

for (var i = 1; i < list.Count; i++)
{
      CourseSheet.CreateRow(i).CreateCell(0).SetCellValue(list[i-1].Name);
}

 

 二:生成一個列表引用區域,方便需要的的地方加載這個引用區域。

IName range = workbook.CreateName();
range.RefersToFormula = string.Format("{0}!$A$2:$A${1}",CourseSheetName,list.Count.ToString());
range.NameName = RangeName;

三:引用以上生成的引用區域。
 
CellRangeAddressList regions = new CellRangeAddressList(1, 65535,4, 4);
DVConstraint constraint = DVConstraint.CreateFormulaListConstraint(RangeName);
HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
sheet.AddValidationData(dataValidate);

備注:代碼區域二和網上的代碼略有不同,網上代碼一般為:

HSSFName range = hssfworkbook.CreateName();
range.Reference = "ShtDictionary!$A1:$A3";
range.NameName = "dicRange";

 但在實際編寫代碼過程中,發現Hssfworkbook.CreateName()生成的是IName,無法直接轉換為HSSFName,於是改為:

 IName range = workbook.CreateName();
 range.RefersToFormula = string.Format("{0}!$A$2:$A${1}",CourseSheetName,list.Count.ToString());
 range.NameName = RangeName;

運行也正常,奇怪為什么和網上代碼不同呢?估計與NOPI版本有關吧。

后記:近期有園子里的朋友問有無源代碼,我就將原來的代碼找出來,貼在下面,供各位參考(代碼寫的久遠,請勿見笑)。

        public ActionResult GetExcelTeacherClassTemplate()
        {
            HSSFWorkbook workbook = new HSSFWorkbook();
            ISheet sheet = workbook.CreateSheet("sheet1");

            IRow row = sheet.CreateRow(0);
            row.CreateCell(0).SetCellValue("姓名");
            row.CreateCell(1).SetCellValue("身份證號");
            row.CreateCell(2).SetCellValue("年級");
            row.CreateCell(3).SetCellValue("班級");
            row.CreateCell(4).SetCellValue("課程");
            row.CreateCell(5).SetCellValue("角色(班主任、單科老師)");


            IRow row1 = sheet.CreateRow(1);
            row1.CreateCell(0).SetCellValue("張峰");
            row1.CreateCell(1).SetCellValue("1111111111111");
            row1.CreateCell(2).SetCellValue("小學六年級");
            row1.CreateCell(3).SetCellValue("4班");
            row1.CreateCell(4).SetCellValue("語文");
            row1.CreateCell(5).SetCellValue("單科老師");

            var ic = workbook.CreateCellStyle();
            ic.DataFormat = HSSFDataFormat.GetBuiltinFormat("@");

            sheet.SetDefaultColumnStyle(1, ic);

            sheet.SetColumnWidth(1, 5000);
            sheet.SetColumnWidth(2, 4000);
            sheet.SetColumnWidth(3, 4000);
            sheet.SetColumnWidth(5, 24000);

            IList<CourseCodeInfo> list = StudentBus.GetSubjectInterface().GetList(0, "", "Name");
            var CourseSheetName = "Course";
            var RangeName = "dicRange";
            ISheet CourseSheet = workbook.CreateSheet(CourseSheetName);
            CourseSheet.CreateRow(0).CreateCell(0).SetCellValue("課程列表(用於生成課程下拉框,請勿修改)");
            for (var i = 1; i < list.Count; i++)
            {
                CourseSheet.CreateRow(i).CreateCell(0).SetCellValue(list[i-1].Name);
            }

            IName range = workbook.CreateName();
            range.RefersToFormula = string.Format("{0}!$A$2:$A${1}",CourseSheetName,list.Count.ToString());
            range.NameName = RangeName;
            //
            CellRangeAddressList regions = new CellRangeAddressList(1, 65535,4, 4);
            DVConstraint constraint = DVConstraint.CreateFormulaListConstraint(RangeName);
            HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
            sheet.AddValidationData(dataValidate);

            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            workbook.Write(ms);
            Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode("教師授課模板.xls"));
            Response.BinaryWrite(ms.ToArray());
            workbook = null;
            ms.Close();
            ms.Dispose();
            return null;
        }

 


免責聲明!

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



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