最近主要做導入excel
在網上查詢了代碼
public FileResult DownLoadExcelJiZuChaXunGenRenXiaoFeiJiLu() { DataTable dt = (DataTable)Session["datatable"];//獲取需要導出的datatable數據 //創建Excel文件的對象 NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook(); //添加一個sheet NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1"); //給sheet1添加第一行的頭部標題 NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0); //row1.RowStyle.FillBackgroundColor = ""; for (int i = 0; i < dt.Columns.Count; i++) { row1.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName); } //將數據逐步寫入sheet1各個行 for (int i = 0; i < dt.Rows.Count; i++) { NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1); for (int j = 0; j < dt.Columns.Count; j++) { rowtemp.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString().Trim()); } } string strdate = DateTime.Now.ToString("yyyyMMddhhmmss");//獲取當前時間 // 寫入到客戶端 System.IO.MemoryStream ms = new System.IO.MemoryStream(); book.Write(ms); ms.Seek(0, SeekOrigin.Begin); return File(ms, "application/vnd.ms-excel", strdate + "Excel.xls"); }
首先導出用到的npoi插件
返回一個fileresult
首先第一步是獲取需要導出的datatable數據
然后創建excel文件對象
再添加一個sheet
給sheet添加第一行的頭部標題
然后再將數據逐步寫入sheet1各個行,最后寫入客戶端
============================================
現在就是我需要的功能導入
在視圖頁中有一個<input type="file" name="file1" id="file">
這個就是選擇要導入的excel文件
然后還有一個<button type="submit"> 此按鈕就是確認導入的提交操作
控制器中寫的代碼:
首先獲取到視圖傳過來的文件 HttpPostFileBase file =request.Files["file1"];
httppostfilebase 表示對客戶端已上載的文件的單獨訪問
stream streamfile=file.inputstream; 獲取一個stream對象,該對象指向一個上載文件,准備讀取該文件的內容。
導入文件也同樣用的npoi插件。
下載npoi插件,里面有五個dll,都要引用,因為包含了 上傳".xls" 和上傳 ".xlsx"
其中HSSFWorkbook 用於xls文件導入類。
XSSFWorkbook用於xlsx文件導入類。
我自己在導入的時候進行判斷了一下,當為不同類型文件時執行不同的代碼,大致代碼一樣,只是處理類不一樣。
/// <summary> /// Excel導入 /// </summary> /// <returns></returns> public DataTable ImportExcelFile(string filePath) { //初始化信息 #region HttpPostedFileBase file = Request.Files["file1"]; Stream streamfile = file.InputStream; DataTable dt = new DataTable(); var houzhuiname = Path.GetExtension(file.FileName); try { if (houzhuiname == ".xls") { HSSFWorkbook hssfworkbook = new HSSFWorkbook(streamfile); dt = ImExport(dt, hssfworkbook); } else { XSSFWorkbook hssfworkbook = new XSSFWorkbook(streamfile); dt = ImExport(dt, hssfworkbook); } } catch { } #endregion TjPackageRequest request = new TjPackageRequest { CreatTime = DateTime.Now, }; this.HosService.ImportDB(dt, request); return dt; }
其中的ImExport()是進行不同文件導入方法。
#region 兩種不同版本的操作excel /// <summary> /// Excel2007的版本,擴展名是.xlsx /// </summary> /// <param name="dt"></param> /// <param name="hssfworkbook"></param> /// <returns></returns> private static DataTable ImExport(DataTable dt, XSSFWorkbook hssfworkbook) { NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0); System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++) { //dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());] dt.Columns.Add(sheet.GetRow(0).Cells[j].ToString()); } while (rows.MoveNext()) { XSSFRow row = (XSSFRow)rows.Current; DataRow dr = dt.NewRow(); for (int i = 0; i < row.LastCellNum; i++) { NPOI.SS.UserModel.ICell cell = row.GetCell(i); if (cell == null) { dr[i] = null; } else { dr[i] = cell.ToString(); } } dt.Rows.Add(dr); } dt.Rows.RemoveAt(0); return dt; } /// <summary> /// Excel2003以前(包括2003)的版本 /// </summary> /// <param name="dt"></param> /// <param name="hssfworkbook"></param> /// <returns></returns> private static DataTable ImExport(DataTable dt, HSSFWorkbook hssfworkbook) { NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0); System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++) { dt.Columns.Add(sheet.GetRow(0).Cells[j].ToString()); //dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString()); } while (rows.MoveNext()) { HSSFRow row = (HSSFRow)rows.Current; DataRow dr = dt.NewRow(); for (int i = 0; i < row.LastCellNum; i++) { NPOI.SS.UserModel.ICell cell = row.GetCell(i); if (cell == null) { dr[i] = null; } else { dr[i] = cell.ToString(); } } dt.Rows.Add(dr); } dt.Rows.RemoveAt(0); return dt; } #endregion
上面代碼有點重復了,只是處理類不一樣。寫了兩遍
ImportDB()這個方法就是進行操作數據庫的操作了。前面幾步就已經將excel文件的內容都存放在 了 datatable里了,后面就是在數據庫里添加datatable里的數據。
在導入操作中,最后有一句dt.Rows.RemoveAt(0);這句話就是將excel文件中的首行標題刪除,只留下數據。
在dal中就是循環dt里的數據進行添加了。