首页 > 代码库 > mvc 导入,导出excel

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里的数据进行添加了。

 

mvc 导入,导出excel