• net mvc 利用NPOI导入导出excel


    1、导出Excel 
    首先引用NPOI包(Action一定要用FileResult)

        /// <summary>  
                /// 批量导出需要导出的列表  
                /// </summary>  
                /// <returns></returns>  
                public FileResult ExportStu2()  
                {  
                    //获取list数据  
                    var checkList = (from oc in db.OrganizeCustoms  
                                    join o in db.Organizes.DefaultIfEmpty() on oc.custom_id equals o.id  
                                    where oc.organize_id == 1  
                                    select new  
                                    {  
                                        customer_id = o.id,  
                                        customer_name = o.name  
                                    }).ToList();  
          
                    //创建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.CreateCell(0).SetCellValue("编号");  
                    row1.CreateCell(1).SetCellValue("姓名");  
                    //....N行  
          
                    //将数据逐步写入sheet1各个行  
                    for (int i = 0; i < checkList.Count; i++)  
                    {  
                        NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);  
                        rowtemp.CreateCell(0).SetCellValue(checkList[i].customer_id.ToString());  
                        rowtemp.CreateCell(1).SetCellValue(checkList[i].customer_name.ToString());  
                        //....N行  
                    }  
                    // 写入到客户端   
                    System.IO.MemoryStream ms = new System.IO.MemoryStream();  
                    book.Write(ms);  
                    ms.Seek(0, SeekOrigin.Begin);  
                    DateTime dt = DateTime.Now;  
                    string dateTime = dt.ToString("yyMMddHHmmssfff");  
                    string fileName = "查询结果" + dateTime + ".xls";  
                    return File(ms, "application/vnd.ms-excel", fileName);  
                }  
    View Code

    前台直接写就可实现:

    @Html.ActionLink("点击导出Excel", "ExportStu2")  

    这里有一篇专门介绍设置样式的文章:
    http://www.cnblogs.com/puzi0315/p/3265958.html
    http://blog.csdn.net/xhccom/article/details/7687264
    http://blog.csdn.net/bestreally/article/details/23257851

    2、导入Excel:

    首先说一些前台吧,mvc上传注意必须加 new { enctype = "multipart/form-data" }

        <td>  
            @using (@Html.BeginForm("ImportStu", "ProSchool", FormMethod.Post, new { enctype = "multipart/form-data" }))  
            {  
                <text>选择上传文件:(工作表名为“Sheet1”,“电脑号”在A1单元格。)</text>  
                <input name="file" type="file" id="file" />  
                <input type="submit" name="Upload" value="批量导入第一批名册" />  
            }  
        </td>  
    View Code

    后台实现:只传路径得出DataTable:

        /// <summary>  
            /// Excel导入  
            /// </summary>  
            /// <param name="filePath"></param>  
            /// <returns></returns>  
            public DataTable ImportExcelFile(string filePath)  
            {  
              HSSFWorkbook hssfworkbook;  
              #region//初始化信息  
              try  
              {  
                using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))  
                {  
                  hssfworkbook = new HSSFWorkbook(file);  
                }  
              }  
              catch (Exception e)  
              {  
                throw e;  
              }  
              #endregion  
          
              using (NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0))  
              {  
                DataTable table = new DataTable();  
                IRow headerRow = sheet.GetRow(0);//第一行为标题行  
                int cellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells  
                int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1  
          
                //handling header.  
                for (int i = headerRow.FirstCellNum; i < cellCount; i++)  
                {  
                  DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);  
                  table.Columns.Add(column);  
                }  
                for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)  
                {  
                  IRow row = sheet.GetRow(i);  
                  DataRow dataRow = table.NewRow();  
          
                  if (row != null)  
                  {  
                    for (int j = row.FirstCellNum; j < cellCount; j++)  
                    {  
                      if (row.GetCell(j) != null)  
                        dataRow[j] = GetCellValue(row.GetCell(j));  
                    }  
                  }  
                  table.Rows.Add(dataRow);  
                }  
                return table;  
              }  
            }  
    View Code

    补充一个类:

        /// <summary>  
            /// 根据Excel列类型获取列的值  
            /// </summary>  
            /// <param name="cell">Excel列</param>  
            /// <returns></returns>  
            private static string GetCellValue(ICell cell)  
            {  
              if (cell == null){ return string.Empty; }  
              switch (cell.CellType)  
              {  
                case CellType.BLANK:  
                  return string.Empty;  
                case CellType.BOOLEAN:  
                  return cell.BooleanCellValue.ToString();  
                case CellType.ERROR:  
                  return cell.ErrorCellValue.ToString();  
                case CellType.NUMERIC:  
                case CellType.Unknown:  
                default:  
                  return cell.ToString();//This is a trick to get the correct value of the cell. NumericCellValue will return a numeric value no matter the cell value is a date or a number  
                case CellType.STRING:  
                  return cell.StringCellValue;  
                case CellType.FORMULA:  
                  try  
                  {  
                    HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);  
                    e.EvaluateInCell(cell);  
                    return cell.ToString();  
                  }  
                  catch  
                  {  
                    return cell.NumericCellValue.ToString();  
                  }  
              }  
            }  
    View Code

    得到DataTable后,就想怎么操作就怎么操作了。

  • 相关阅读:
    [Codechef Coders' Legacy 2018 CLSUMG]Sum of Primes
    [HDU4630]No Pain No Game
    [Luogu4329][COCI2006]Bond
    [数论]Gcd/ExGcd欧几里得学习笔记
    [数论]线性基学习笔记
    [Luogu5190][COCI2010]PROGRAM
    IIS7 HTTPS 绑定主机头,嘿嘿,转
    React
    ios
    iOS10 权限配置
  • 原文地址:https://www.cnblogs.com/ldyblogs/p/npoi.html
Copyright © 2020-2023  润新知