国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

利用NPOI導(dǎo)出數(shù)據(jù)到Execl

2019-11-17 01:44:08
字體:
供稿:網(wǎng)友

利用NPOI導(dǎo)出數(shù)據(jù)到Execl

相信很多童鞋都開發(fā)過Execl的導(dǎo)入導(dǎo)出功能,最近產(chǎn)品中無論是后臺(tái)數(shù)據(jù)分析的需要,還是前端滿足用戶管理的方便,都有Execl導(dǎo)入導(dǎo)出的維護(hù)需求產(chǎn)生。

以前做這個(gè)功能,如果是web,利用HttpContext.Current.Response.ContentType ="application/ms-Excel";就可以導(dǎo)出html數(shù)據(jù)表格到execl中,這種方法的問題就是編碼格式的兼容性太差,用Mac OS之類的 office打開直接亂碼給你看?;蛘呤钦{(diào)用office的COM組件,或宏腳本的方式操作Execl,這種方式的主要問題就是客戶端必須要安裝office,如果你裝的是wps還玩不轉(zhuǎn)。

最近產(chǎn)品中使用了NPOI這個(gè)開源組件后,上訴方法直接感覺太Out了。先感受一下代碼的魅力:

 1      /// <summary> 2         /// 導(dǎo)出Execl 3         /// </summary> 4         /// <returns></returns> 5         public FileResult DataExportToExecl() 6         {  7             //創(chuàng)建Excel文件的對(duì)象 9             NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();10             NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1"); //添加一個(gè)sheet11 12             var _data = CardHelper.GetAllData(); //獲取list數(shù)據(jù),也可以分頁獲取數(shù)據(jù),以獲得更高效的性能13 14             //給sheet1添加第一行的頭部標(biāo)題15             NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);16             row1.CreateCell(0).SetCellValue("排名");17             row1.CreateCell(1).SetCellValue("CardID");18             row1.CreateCell(2).SetCellValue("姓名");19             row1.CreateCell(3).SetCellValue("手機(jī)");22             row1.CreateCell(4).SetCellValue("職位");23             row1.CreateCell(5).SetCellValue("所在公司");25             row1.CreateCell(6).SetCellValue("創(chuàng)建時(shí)間");26 27             //將數(shù)據(jù)逐步寫入sheet1各個(gè)行28             for (int i = 0; i < _data.Count; i++)29             {30                 NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);31 32                 rowtemp.CreateCell(0).SetCellValue(i+1);33                 rowtemp.CreateCell(1).SetCellValue(_data[i].ID);34                 rowtemp.CreateCell(2).SetCellValue(_data[i].RealName);35                 rowtemp.CreateCell(3).SetCellValue(_data[i].Cellphone);38                 rowtemp.CreateCell(4).SetCellValue(string.IsNullOrEmpty(_data[i].WorTitle) ? "無" : _data[i].WorTitle);39                 rowtemp.CreateCell(5).SetCellValue(string.IsNullOrEmpty(_data[i].Company) ? "無" : _data[i].Company);41                 rowtemp.CreateCell(6).SetCellValue(_data[i].CreateDate.ToString());                42             }43             // 寫入到客戶端 44             System.IO.MemoryStream ms = new System.IO.MemoryStream();45             book.Write(ms);46             ms.Seek(0, SeekOrigin.Begin);47             return File(ms, "application/vnd.ms-excel", DateTime.Now.ToString("yyyyMMdd") + ".xls");48         }

在前端你只要用超文本鏈接到這個(gè)Action就可以了,至于是純文本還是按鈕的方式,就根據(jù)自己喜好了。

 1         /// <summary> 2         /// 導(dǎo)入Execl信息 3         /// </summary> 4         /// <returns></returns> 5         PRivate DataView LoadExeclFile() 6         { 7             //虛擬生成一個(gè)DataTable 8             DataTable dt = new DataTable(); 9             dt.Columns.Add("Name", typeof(string));10             dt.Columns.Add("Phone", typeof(string));11             dt.Columns.Add("CID", typeof(string));12             dt.Columns.Add("Status", typeof(string));13             DataRow newRow = null;14 15             string filepath = @"data.xls";  //讀取本地Execl,當(dāng)前路徑是該程序的所在目錄16             HSSFWorkbook wb = new HSSFWorkbook(new FileStream(filepath, FileMode.Open));17             HSSFSheet sheet = wb.GetSheet("data") as HSSFSheet; //獲取execl中名字為data的sheet表格數(shù)據(jù)18 19             if (sheet == null)20             {21                 MessageBox.Show("檢查是否文件路徑和文件名稱有誤!");22             }23             else24             {25                 //導(dǎo)入數(shù)據(jù)26                 for (int i = 1; i <= sheet.LastRowNum; i++) //獲得所有行數(shù)27                 {28                     IRow row = sheet.GetRow(i); //讀取當(dāng)前行數(shù)據(jù)29                     if (row != null)30                     {31                         newRow = dt.NewRow();32                         newRow["Name"] = row.GetCell(0).ToString();33                         newRow["Phone"] = row.GetCell(1).ToString();34                         newRow["CID"] = row.GetCell(2).ToString();35                         newRow["Status"] = row.GetCell(3).ToString();36 37                         if (IsMobile(row.GetCell(1).ToString()))38                         {39                             dt.Rows.Add(newRow);40                         }41                         42                     }43                 }44              45             }46 47             return dt.DefaultView;48         }

這個(gè)Execl導(dǎo)入功能實(shí)現(xiàn)的是將數(shù)據(jù)導(dǎo)入Gridview中去,你如果想導(dǎo)入到數(shù)據(jù)庫或其他數(shù)據(jù)存儲(chǔ)介質(zhì),代碼換成:

1         /// <summary> 2         /// 導(dǎo)入Execl信息 3         /// </summary> 4         /// <returns></returns> 5         private void LoadExeclFile() 6         {15             string filepath = @"data.xls";  //讀取本地Execl,當(dāng)前路徑是該程序的所在目錄16             HSSFWorkbook wb = new HSSFWorkbook(new FileStream(filepath, FileMode.Open));17             HSSFSheet sheet = wb.GetSheet("data") as HSSFSheet; //獲取execl中名字為data的sheet表格數(shù)據(jù)18 19             if (sheet != null)24             {25                 //導(dǎo)入數(shù)據(jù)26                 for (int i = 1; i <= sheet.LastRowNum; i++) //獲得所有行數(shù)27                 {28                     IRow row = sheet.GetRow(i); //讀取當(dāng)前行數(shù)據(jù)29                     if (row != null)30                     {31                         InsertDataIntoDB(row.GetCell(0).ToString(),row.GetCell(1).ToString(),row.GetCell(2).ToString(),row.GetCell(3).ToString());42             } 
43           } 44        }45      }

看過代碼之后,我相信你能感知到NPOI的對(duì)Execl操作的強(qiáng)大已經(jīng)無法用言語形容了。上訴的導(dǎo)入導(dǎo)出應(yīng)該是平常開發(fā)中使用最頻繁的Execl操作了,而且NPOI基本上已經(jīng)將各類方法封裝到極致了,除非你有特殊業(yè)務(wù)場景,不然只要稍作修改,就能滿足自己不同的業(yè)務(wù)需求了。當(dāng)然,上訴方案還是有些問題所在的,解決思路大體類似,時(shí)間換空間,或空間換時(shí)間。比如:

--導(dǎo)出數(shù)據(jù)量很大的話,獲取數(shù)據(jù)以及對(duì)數(shù)據(jù)加工處理,多會(huì)遇到性能問題,嚴(yán)重的話甚至是內(nèi)存溢出,程序報(bào)錯(cuò)。解決思路很簡單, 代碼改造一下,采用分頁獲取數(shù)據(jù),導(dǎo)出到多個(gè)sheet或者分成多個(gè)execl導(dǎo)出,代碼我就懶得寫了。

總結(jié)一下NPOI的優(yōu)缺點(diǎn)吧:

優(yōu)點(diǎn):使用超級(jí)簡潔,小白也能看的明白。獨(dú)立組件,引用即可。無需第三方依賴。編碼靈活控制,兼容性優(yōu)秀。性能使用下來非常優(yōu)異,源碼寫的也特漂亮...

缺點(diǎn):如果有,請(qǐng)告訴我吧!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 农安县| 宁波市| 肃宁县| 文登市| 曲水县| 微山县| 新河县| 桦川县| 双流县| 东海县| 丰城市| 辽宁省| 琼中| 葵青区| 祥云县| 长寿区| 鹿邑县| 千阳县| 大邑县| 临潭县| 乳源| 九龙坡区| 隆德县| 交城县| 嘉禾县| 色达县| 天峻县| 时尚| 栖霞市| 阿尔山市| 乳山市| 四子王旗| 新泰市| 张家口市| 姚安县| 乌拉特中旗| 南汇区| 凯里市| 敦化市| 越西县| 瓮安县|