C# NPOI 导出Excel模板 下拉框 级联下拉框 级联选择

C#  NPOI 导出Excel模板  下拉框  级联下拉框 级联选择, 导出模板下载

源码在后面,前面稍微说一下咋回事

首先明白Excel 中 的数据引用咋回事,然后知道 INDIRECT 这个函数。 自行搜索

C# NPOI 导出Excel模板 下拉框 级联下拉框 级联选择_第1张图片

我的需求是

设备类型 分为  塔机和升降机

塔机下面又有一堆型号

这是数据源表

C# NPOI 导出Excel模板 下拉框 级联下拉框 级联选择_第2张图片

C# NPOI 导出Excel模板 下拉框 级联下拉框 级联选择_第3张图片

 

/// 
        /// 导出模板
        /// 
        /// 
        [RemoteService(false)]
        public ExportExcelResultClass ExportDeviceTemplate()
        {
            ExportExcelResultClass exportExcelResultClass = new ExportExcelResultClass();
            exportExcelResultClass.excelFileName = "";
            ////首先创建Excel文件对象
            var workbook = new XSSFWorkbook();

            ////创建工作表,也就是Excel中的sheet,给工作表赋一个名称(Excel底部名称)
            var sheet = workbook.CreateSheet("导入设备");
            // 级联:https://www.limitcode.com/detail/5e908ec69581af02a004a91e.html


            List result = new List();
            //设备类型数据源
            var deviceTypes = _deviceTypeManager.GetAllDeviceTypes();
            foreach (var deviceType in deviceTypes)
            {
                // 根据设备类型取具体的类型
                var deviceModels = _deviceModelManager.GetDeviceModelByTypeId(deviceType.Id);
                DataEntity entity = new DataEntity();
                entity.name = deviceType.Name;
                entity.child = new List();
                if (deviceModels != null && deviceModels.Count > 0)
                {
                    foreach (var deviceModel in deviceModels)
                    {
                        DataEntity childEntity = new DataEntity();
                        childEntity.name = deviceModel.TypeName;
                        entity.child.Add(childEntity);
                    }
                }
                result.Add(entity);
            }


            string sheetName = "Type";
            //创建sheet,用于制作数据源
            ISheet typeSheet = workbook.CreateSheet(sheetName);
            //隐藏数据源表
            workbook.SetSheetHidden(workbook.GetSheetIndex(typeSheet), true);
            //行号,起始为0
            int rowNo = 0;
            //整理一级数据
            FormatData(typeSheet, result, "设备类型", ref rowNo, workbook, sheetName);
            //整理二级数据
            foreach (DataEntity item in result)
            {
                FormatData(typeSheet, item.child, item.name, ref rowNo, workbook, sheetName);
            }
            //给500行创建下拉级别关系
            int rowCount = 500;
            //最小开始列
            int minCell = 0;
            //最大结束列
            int maxCell = 0;
            //第一级制作下拉
            ExcelLevelRelation(sheet, string.Format("=Type!$1:$1"), 1, rowCount - 1, minCell, maxCell);
            for (int j = 1; j <= rowCount; j++)
            {
                int beginCell = minCell;
                int endCell = maxCell;
                //第二级绑定与第一级的级联关系(EXCEL中叫引用)
                ExcelLevelRelation(sheet, string.Format("INDIRECT(${0}${1})", "A", j + 1), j, j, ++beginCell, ++endCell);
            }


            //excel保存文件名
            string excelFileName = "导入设备.xlsx";

            var fileStream = new MemoryStream();

            //向Excel文件对象写入文件流,生成Excel文件
            workbook.Write(fileStream);


            exportExcelResultClass.excelFileName = excelFileName;
            exportExcelResultClass.fileStream = fileStream;

            return exportExcelResultClass;
        }


        public class ExportExcelResultClass
        {
            public string excelFileName { get; set; }
            public MemoryStream fileStream { get; set; }
        }

我这个是为了下载模板,所以最后导出了一个下载Excel

基于Abp vNext的,下载Controller在 Web.host 中的 HomeController


        /// 
        /// 下载设备导入模板
        /// 
        /// 
        [HttpGet]
        [DontWrapResult]
        [AbpAuthorize]
        public FileResult DownloadExportDeviceTemplate()
        {
            ExportExcelResultClass exportExcelResultClass = _deviceAppService.ExportDeviceTemplate();
            using (exportExcelResultClass.fileStream)
            {
                var content = exportExcelResultClass.fileStream.ToArray();
                return File(
                    content,
                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                    exportExcelResultClass.excelFileName);
            }
        }

 

 

参考了:https://www.limitcode.com/detail/5e908ec69581af02a004a91e.html

这博主大哥给出了所有源码,我只是在此基础根据自己业务修改的

你可能感兴趣的:(C#)