系列目錄
前言
上一節使用了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