ASP.NET MVC5+EF6+EasyUI 後臺管理系統(63)-Excel導入和導出-自定義表模導入 ASP.NET MVC5+EF6+EasyUI 後臺管理系統(63)-Excel導入和導出

系列目錄

前言

上一節使用了LinqToExcel和CloseXML對Excel表進行導入和導出的簡單操作,大家可以跳轉到上一節查看:

ASP.NET MVC5+EF6+EasyUI 後臺管理系統(63)-Excel導入和導出

本節演示一些比較複雜的模型場景

情景

上次的場景:(標準的Excel表格格式)

制定的場景:(指定表模的場景,多張sheet,不是橫排的形式)

實現

實現思路:利用LinqToExcel循環讀取Sheet,再循環讀取Sheet指定單元格的內容

(其實Excel是一個二維數組,可以直接讀取諸如:B1:C1的單元格數據)

上次的代碼我們已經有了上傳Excel功能,這次就不需要放出上傳代碼了。

在業務層添加校驗Excel的方法:可以效仿上次的普通導入

public bool CheckImportBatchData(string fileName, List<Spl_PersonModel> personList, ref ValidationErrors errors)  

頭部分同樣保持不變:

        var targetFile = new FileInfo(fileName);

            if (!targetFile.Exists)
            {

                errors.Add("導入的數據文件不存在");
                return false;
            }

            var excelFile = new ExcelQueryFactory(fileName);

下面是核心代碼:

1.獲得Excel所有的sheet

var sheetList = excelFile.GetWorksheetNames();//IEnumberable

由於其返回類型是IEnumberable所有我們直接一個foreach就全出來了

2.獲得sheet內部的表格數據

foreach (var sheet in sheetList)
{
    //獲得sheet對應的數據
    var data = excelFile.WorksheetNoHeader(sheet).ToList();
}

視乎到這一步都很簡單了!接下來我們只要分解data的數據即可,經過跟蹤data是一個二維數據

 

3.獲得單元格內容

好了,現在更加清晰了,我要獲得光頭強兩個字。那麼只需要data[2][3]就可以了

//判斷信息是否齊全
if (data[1][2].Value.ToString() == "")
{
    errorMessage.Append("姓名不能爲空");
}

4.模型校驗成功後,添加到List中來,最後集合添加到數據庫

   var person = new Spl_PersonModel();
                person.Id = "";
                person.Name = data[1][2].Value.ToString();
                person.Sex = data[2][2].Value.ToString();
                person.Age = Convert.ToInt32(data[3][2].Value);
                person.IDCard = data[4][2].Value.ToString();
                person.Phone = data[5][2].Value.ToString();
                person.Email = data[6][2].Value.ToString();
                person.Address = data[7][2].Value.ToString();
                person.Region = data[8][2].Value.ToString();
                person.Category = data[9][2].Value.ToString();

5.保存數據調用簡單類型的即可

還是 public void SaveImportData(IEnumerable<Spl_PersonModel> personList)方法

 

總結

效果還是一樣的

擴展

如果有時候你的文件處理的邏輯很多,時間好幾秒,那麼你可能需要加個進度提示

簡單的loading代碼如下:(開始導入時候調用,結束的時候關閉。)

 <div id="over" class="over"></div>
 <div id="layout" class="layout"><img src="~/Content/images/loading.gif" /></div>

<script type="text/javascript">
        function showLoading() {
                $("#over").show();
                $("#layout").show();
            }
            function hideLoading()
            {
                $("#over").hide();
                $("#layout").hide();
            }
        </script>
  <style type="text/css">
             .over{top:0;left:0;z-index:9999999;width:100%;height:100%;opacity:.5}.layout,.over{position:absolute;display:none}.layout{top:40%;left:40%;z-index:100000000;width:20%;height:20%;text-align:center}
        </style>

效果如下:

有時候我們的表模就是這樣的,並不是都是列表形式,這是,這個方法就幫到我你,簡單粗暴

下載代碼:動手體驗一下,穩固知識

鏈接:http://pan.baidu.com/s/1i48Lg8l 密碼:vq0g

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章