zoukankan      html  css  js  c++  java
  • 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里的数据进行添加了。

  • 相关阅读:
    JS站点
    1011 World Cup Betting (20分)
    1007 Maximum Subsequence Sum (25分)(动态规划DP)
    1006 Sign In and Sign Out (25分)
    1005 Spell It Right (20分)
    1004 Counting Leaves (30分)(DFS)
    1003 Emergency (25分)(Dijkstra算法)
    1002 A+B for Polynomials (25分)
    1001 A+B Format (20分)
    canvas
  • 原文地址:https://www.cnblogs.com/jiangyou-lz/p/5841450.html
Copyright © 2011-2022 走看看