EPPlus之Excel二级联动

学习笔记,方便以后查阅。参考https://github.com/pruiz/EPPlus/blob/master/SampleApp/Sample11.cs

Epplus版本:4.0.4.0

采用Epplus处理Excel,实现简单的二级联动。闲话不说,就是喜欢代码:

程序中用到的连个类:省份、城市

public class Province
        {
            public int ProvinceId { get; set; }
            public string ProvinceName { get; set; }

            public List GetList()
            {
                return new List() {
                    new Province() {ProvinceId=1,ProvinceName="北京市" },
                    new Province() {ProvinceId=2,ProvinceName="河北省" },
                    new Province() {ProvinceId=3,ProvinceName="河南省" }
                };
            }
        }

        public class City
        {
            public int CityId { get; set; }
            public int ProvinceId { get; set; }
            public string CityName { get; set; }

            public List GetList()
            {
                return new List() {
                    new City() {CityId=1,ProvinceId=1,CityName="东城区" },
                    new City() {CityId=2,ProvinceId=1,CityName="西城区" },
                    new City() {CityId=3,ProvinceId=1,CityName="朝阳区" },
                    new City() {CityId=4,ProvinceId=1,CityName="海淀区" },
                    new City() {CityId=5,ProvinceId=1,CityName="丰台区" },
                    new City() {CityId=6,ProvinceId=1,CityName="昌平区" },
                    new City() {CityId=7,ProvinceId=1,CityName="房山区" },
                    new City() {CityId=8,ProvinceId=1,CityName="大兴区" },
                    new City() {CityId=9,ProvinceId=1,CityName="通州区" },
                    new City() {CityId=10,ProvinceId=1,CityName="石景山区" },

                    new City() {CityId=11,ProvinceId=2,CityName="石家庄" },
                    new City() {CityId=12,ProvinceId=2,CityName="张家口" },
                    new City() {CityId=13,ProvinceId=2,CityName="承德" },
                    new City() {CityId=14,ProvinceId=2,CityName="秦皇岛" },
                    new City() {CityId=15,ProvinceId=2,CityName="沧州" },
                    new City() {CityId=16,ProvinceId=2,CityName="衡水" },
                    new City() {CityId=17,ProvinceId=2,CityName="邯郸" },

                    new City() {CityId=18,ProvinceId=3,CityName="郑州" },
                    new City() {CityId=19,ProvinceId=3,CityName="商丘" },
                    new City() {CityId=20,ProvinceId=3,CityName="驻马店" },
                    new City() {CityId=21,ProvinceId=3,CityName="新乡" },
                    new City() {CityId=22,ProvinceId=3,CityName="焦作" }
                };
            }
        }
主要代码:

FileInfo output = new FileInfo(Server.MapPath("~/Output.xlsx"));
            if (output.Exists)
            {
                output.Delete();
                output = new FileInfo(Server.MapPath("~/Output.xlsx"));
            }
            using (var package = new ExcelPackage(output))
            {
                // 添加工作表 为下拉框提供数据源
                var sheet = package.Workbook.Worksheets.Add("SourceSheet");
                List ls_p = new Province().GetList();
                List ls_c = new City().GetList();
                for (int i = 0; i < ls_p.Count; i++)
                {
                    var item = ls_p[i];
                    sheet.Cells[1, i + 1].Value = item.ProvinceName;
                    sheet.Cells[1, i + 1].Style.Font.Bold = true;
                    List ls_temp_c = (from p in ls_c
                                            where p.ProvinceId == item.ProvinceId
                                            select p).ToList();
                    int tempCityCount = ls_temp_c.Count;
                    for (int j = 0; j < tempCityCount; j++)
                    {
                        var tempCoty = ls_temp_c[j];
                        sheet.Cells[j + 2, i + 1].Value = tempCoty.CityName;
                    }
                    if (tempCityCount > 0)
                    {
                        var tempName = package.Workbook.Names.Add(item.ProvinceName, sheet.Cells[2, i + 1, tempCityCount + 1, i + 1]);
                        //var tempName = sheet.Names.Add(item.ProvinceName, sheet.Cells[2, i + 1, tempCityCount + 1, i + 1]);
                    }
                }
                //sheet.Names.Add("省份", sheet.Cells[1, 1, 1, ls_p.Count]); //名称管理器  使用范围sheet 这里指SourceSheet 
                package.Workbook.Names.Add("省份", sheet.Cells[1, 1, 1, ls_p.Count]);
                // 添加工作表  展示下拉框
                var homeSheet = package.Workbook.Worksheets.Add("HomeSheet");
                homeSheet.Cells["A1"].Style.Font.Bold = true;
                homeSheet.Cells["B1"].Style.Font.Bold = true;
                homeSheet.Cells["A1"].Value = "省份";
                homeSheet.Cells["B1"].Value = "城市";
                //数据有效性或者数据验证
                //省份下拉框
                var validation = homeSheet.DataValidations.AddListValidation("A2:A10");
                validation.ShowErrorMessage = true;
                validation.ErrorStyle = ExcelDataValidationWarningStyle.warning;
                validation.ErrorTitle = "An invalid value was entered";
                validation.Error = "Select a value from the list";
                validation.Formula.ExcelFormula = "省份";
                //城市下拉框
                var validation2 = homeSheet.DataValidations.AddListValidation("B2:B10");
                validation2.ShowErrorMessage = true;
                validation2.ErrorStyle = ExcelDataValidationWarningStyle.warning;
                validation2.ErrorTitle = "An invalid value was entered";
                validation2.Error = "Select a value from the list";
                validation2.Formula.ExcelFormula = "INDIRECT($A2)";
                package.SaveAs(output);
            }
说明:程序会自动在网站根路径下创建Output.xlsx。

截图如下:

工作表:资源(点击【公式】-【名称管理器】)

EPPlus之Excel二级联动_第1张图片

工作表:下拉框

EPPlus之Excel二级联动_第2张图片


EPPlus之Excel二级联动_第3张图片

到此结束。这里发现一点小问题,就是选中省份例如北京然后是选择城市例如朝阳区,之后修改北京为河北或者其他,此时城市没有改变,让然是朝阳区。要是能修改就好了。希望大神多多指教,谢谢。







你可能感兴趣的:(Epplus)