mvc 導入,導出excel


最近主要做導入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里的數據進行添加了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM