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

  • 相关阅读:
    解决删除镜像时image is referenced in multiple repositories
    paramiko模块的使用
    python之函数(一)
    python之控制流习题+代码
    python之控制流
    Python之逻辑运算符
    python之列表,元组,字典。
    python之常用的数据类型
    python基础语法之基础语法规则以及设置
    python环境搭建以及pycharm的安装
  • 原文地址:https://www.cnblogs.com/jiangyou-lz/p/5841450.html
Copyright © 2020-2023  润新知