zoukankan      html  css  js  c++  java
  • Excel表导出

     前言

    分别介绍两种导出Exce表格的方法和读取Excel表格数据方法。

    1、在MVC下的表格导出。

    2、基于NPOI的表格导出。

    3、读取Excel表格数据。

    第一种方法:在MVC下的表格导出。

    首先,创建一个数据model,代码如下:

    1 public class ListModel
    2     {
    3         public int Id { get; set; }
    4         public string Name { get; set; }
    5         public string Password { get; set; }
    6     }
    View Code

    一个表格model,代码如下:

    1  public class ExcelModel
    2     {
    3         [Display(Name = "ID")]
    4         public int Id { get; set; }
    5          [Display(Name = "第一列")]
    6         public string Head { get; set; }
    7          [Display(Name = "第二列")]
    8         public string Center { get; set; }
    9     }
    View Code

    其次,创建一个操作表格的类,代码如下:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.ComponentModel.DataAnnotations;
      5 using System.Drawing;
      6 using System.IO;
      7 using System.Linq;
      8 using System.Text;
      9 using System.Web;
     10 using System.Web.Mvc;
     11 using System.Web.UI;
     12 using System.Web.UI.WebControls;
     13 
     14 namespace Excel1.Helper
     15 {
     16     public class EecelHelper<T>:ActionResult
     17     {
     18         private string _fileName;
     19         private List<T> _rows;
     20         private List<string> _headers;
     21         private TableStyle _tableStyle;
     22         private TableItemStyle _headerSytle;
     23         private TableItemStyle _itemStyle;
     24         public string FileName
     25         {
     26             get { return _fileName; }
     27         }
     28         public List<T>Rows
     29         {
     30             get { return _rows; }
     31         }
     32         public EecelHelper(List<T> rows,string fileName )
     33             :this(rows,fileName,null,null,null,null)
     34         {
     35             
     36         }
     37         public EecelHelper(List<T>rows,string fileName,List<string>headers  )
     38             :this(rows,fileName,headers,null,null,null)
     39         {
     40             
     41         }
     42         public EecelHelper(List<T> rows, string fileName, List<string> headers,TableStyle tableStyle,TableItemStyle headerSytle,TableItemStyle itemStyle)
     43 
     44         {
     45             _rows = rows;
     46             _fileName = string.IsNullOrEmpty(fileName) ? DateTime.Now.ToString("yyyyMMddHHmmss") : fileName;
     47             _headers = headers;
     48             _tableStyle = tableStyle;
     49             _headerSytle = headerSytle;
     50             _itemStyle = itemStyle;
     51             if(_tableStyle==null)
     52             {
     53                 _tableStyle = new TableStyle();
     54                 _tableStyle.BorderStyle = BorderStyle.Solid;
     55                 _tableStyle.BorderColor = Color.Black;
     56                 _tableStyle.BorderWidth = Unit.Parse("2px");
     57             }
     58             if(_headerSytle == null)
     59             {
     60                 _headerSytle = new TableItemStyle();
     61                 _headerSytle.BackColor = Color.LightGray;
     62             }
     63         }
     64 
     65         public override void ExecuteResult(ControllerContext context)
     66         {
     67             StringWriter sw = new StringWriter();
     68             HtmlTextWriter tw = new HtmlTextWriter(sw);
     69 
     70             if(_tableStyle !=null)
     71             {
     72                 _tableStyle.AddAttributesToRender(tw);
     73             }
     74             tw.RenderBeginTag(HtmlTextWriterTag.Table);
     75             var properties = TypeDescriptor.GetProperties(typeof (T));
     76 
     77             if(_headers == null)
     78             {
     79                 _headers = new List<string>();
     80                 for(int i=0;i<properties.Count;i++)
     81                 {
     82                     var attr = typeof (T).GetProperty(properties[i].Name).GetCustomAttributes(
     83                         typeof (DisplayAttribute), true);
     84                     _headers.Add(attr.Length>0?((DisplayAttribute)attr[0]).Name:properties[i].Name);
     85                 }
     86             }
     87             tw.RenderBeginTag(HtmlTextWriterTag.Thead);
     88             foreach (string header in _headers) 
     89             {
     90                 if(_headerSytle != null)
     91                     _headerSytle.AddAttributesToRender(tw);
     92                 tw.RenderBeginTag(HtmlTextWriterTag.Th);
     93                 tw.Write(header);
     94                 tw.RenderEndTag();
     95             }
     96 
     97             tw.RenderBeginTag(HtmlTextWriterTag.Tbody);
     98             foreach (var row in _rows)
     99             {
    100                 tw.RenderBeginTag(HtmlTextWriterTag.Tr);
    101                 for(int i=0;i<properties.Count;i++)
    102                 {
    103                     var strValue = properties[i].GetValue(row) == null
    104                                        ? string.Empty
    105                                        : properties[i].GetValue(row).ToString();
    106                     strValue = ReplaceSpecialCharacters(strValue);
    107                     if(_itemStyle != null)
    108                         _itemStyle.AddAttributesToRender(tw);
    109                     tw.RenderBeginTag(HtmlTextWriterTag.Td);
    110                     tw.Write(HttpUtility.HtmlEncode(strValue));
    111                     tw.RenderEndTag();
    112                 }
    113                 tw.RenderEndTag();
    114             }
    115             tw.RenderEndTag();
    116             tw.RenderEndTag();
    117             WriteFile(_fileName, "application/ms-excel", sw.ToString());
    118         }
    119 
    120         private static string ReplaceSpecialCharacters(string value)
    121         {
    122             value = value.Replace("' ", "'");
    123             value = value.Replace("", """);
    124             value = value.Replace("", """);
    125             value = value.Replace("", "-");
    126             value = value.Replace("...", "");
    127             return value;
    128         }
    129         private static void WriteFile(string fileName,string contentType,string content)
    130         {
    131             HttpContext context = HttpContext.Current;
    132             context.Response.Clear();
    133             context.Response.AddHeader("content-disposition","attachment;filename="+fileName+".xls");
    134             context.Response.ContentEncoding = Encoding.Default;
    135             context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    136             context.Response.ContentType = contentType;
    137             context.Response.Write(content);
    138             context.Response.End();
    139         }
    140     }
    141 }
    142 
    143  
    View Code

    最后,新建一个方法,这个方法是用来,把数据model转换成表格model的,代码如下:

     1 public class Mappers
     2     {
     3         public static ExcelModel ExcelModel(ListModel model)
     4         {
     5             return new ExcelModel
     6                        {
     7                            Id = model.Id,
     8                            Head = model.Name,
     9                            Center = model.Password,
    10                        };
    11         }
    12     }
    View Code

    在控制器下,就可以调用上面创建的操作表格类进行处理了,代码如下:

     1 public ActionResult Down()
     2         {
     3             List<ListModel> list = new List<ListModel>();
     4             ListModel model = new ListModel();
     5             model.Id = 1111;
     6             model.Name = "小明";
     7             model.Password = "123456";
     8             list.Add(model);
     9             var excelList = list.Select(Mappers.ExcelModel).ToList();
    10             return new EecelHelper<ExcelModel>(excelList.ToList(), "我的Excel");
    11         }
    View Code

    第二种方法:基于NPOI的表格导出。

     首先下载NPOI.dll http://files.cnblogs.com/zl879211310/bils.rar

     其次,把NPOI.dll 放到项目中,创建一个表格操作类,代码如下:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using NPOI.HSSF.UserModel;
     6 using System.IO;
     7 using System.Text;
     8 using System.Windows.Forms;
     9 
    10 
    11 namespace Ajax
    12 {
    13     /// <summary>
    14     /// 0.引用bils文件夹的dll
    15     /// 1.新建一个model,里面的字段就是要导出的字段
    16     /// 2.输入List<T>数据,FilePath=@"E:"
    17     /// 3.每行根据model的字段添加
    18     /// </summary>
    19     public class WorkBook
    20     {
    21         public void BuildWorkBook(List<Student> models,string FilePath)  //修改
    22         {
    23             HSSFWorkbook workbook = new HSSFWorkbook();
    24             HSSFSheet sheet = workbook.CreateSheet("第一页");
    25             HSSFRow rowHead = sheet.CreateRow(0);
    26             rowHead.CreateCell(0).SetCellValue("姓名");                      //修改
    27             rowHead.CreateCell(1).SetCellValue("年龄");
    28 
    29 
    30             for (int rowIndex = 0; rowIndex < models.Count(); rowIndex++)
    31             {
    32                 HSSFRow row = sheet.CreateRow(rowIndex + 1);
    33                 row.CreateCell(0).SetCellValue(models[rowIndex].Name);      // 修改
    34                 row.CreateCell(1).SetCellValue(models[rowIndex].Age);
    35             }
    36 
    37 
    38             using (FileStream fs = new FileStream(FilePath + DateTime.Now.ToString("yyyy-MM-dd") + ".xls", FileMode.Create))
    39             {
    40                 workbook.Write(fs);
    41             }
    42         }
    43     }
    44 }
    View Code

    最后,调用就可以了,代码如下:

     1  List<Student> model=new List<Student> (){
     2             new Student {Name="小张",Age=23},
     3             new Student {Name="小张1",Age=243},
     4             new Student {Name="小张2",Age=223},
     5             new Student {Name="小张3",Age=263},
     6             new Student {Name="小张4",Age=3} 
     7             };
     8             WorkBook work = new WorkBook(); 
     9             
    10             string path = @"E:";
    11             try
    12             {
    13                 work.BuildWorkBook(model, path);
    14                 Response.Write("<script>alert('导出成功');</script>");
    15             }
    16             catch (Exception)
    17             { 
    18                 Response.Write("<script>alert('导出失败');</script>");
    19             }
    View Code

    读取Excel表格数据

    1、读取excel表格需要的方法,代码如下:

     1  //获得excel表的地址
     2         private string GetPath(string path)
     3         {
     4             var separetor = Path.DirectorySeparatorChar;
     5             return string.Format(path, separetor);
     6         }
     7         //excel表的版本
     8         private const string ExcelDefaultVersion = "12.0";
     9         //连接字符串
    10         private const string ConnectionStringTemplate =
    11             "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel {1};HDR=YES;IMEX=1'";//兼容office2003、office2007;
    12 
    13         
    14         private static string GetConnectionString(string excelPath,string excelVersion)
    15         {
    16             return string.Format(CultureInfo.InvariantCulture, ConnectionStringTemplate, excelPath, excelVersion);
    17         }
    18 
    19         //查询
    20         private static DataSet QueryBySheetName(OleDbConnection conn, string sheetName)
    21         {
    22             var query = string.Format("select * from [{0}]", sheetName);
    23             var adp = new OleDbDataAdapter(query, conn);
    24             var dt = new DataSet();
    25             adp.Fill(dt,"book");//填充到DataSet的 表格名为book的table里。表格名随便取
    26             return dt;
    27         }
    28 
    29         //创建连接字符串
    30         private static OleDbConnection CreateConnection(string excelPath, string excelVersion = ExcelDefaultVersion)
    31         {
    32             return new OleDbConnection(GetConnectionString(excelPath,excelVersion));
    33         }
    34 
    35         //查询工作表
    36         public static DataSet Query(string excelPath, string sheetName)
    37         {
    38             using (var conn = CreateConnection(excelPath))
    39             {
    40                 var dt = QueryBySheetName(conn, sheetName);
    41                 return dt;
    42             }
    43         }
    View Code

    2、调用,代码如下:

     1  public ActionResult Index()
     2         {
     3             var path = Server.MapPath(GetPath("{0}Content{0}Hero.xlsx"));//获得excel表格地址
     4             DataSet table = Query(path, "Sheet1$");// "Sheet1$"这是读取excel表的哪个工作表,记得加上$
     5             var tables = table.Tables["book"];
     6 
     7             for (int i = 0; i <= tables.Rows.Count; i++)
     8             {
     9                 if (tables.Rows[i][0].ToString() != null)
    10                 {
    11                     if (tables.Rows[i][0].ToString() == "10001")
    12                     {
    13                         Response.Write(tables.Rows[i][2]);
    14                         break; 
    15                     }
    16                 } 
    17             } 
    18             return View();
    19         }
    View Code

    结束

    两个小例子,只是简单的实现,为的是用过记录下来。

  • 相关阅读:
    基于u盘身份验证
    新的一年开始了~!
    asp.net的条形码
    windows phone (21) Grid元素的Background和Clip
    windows phone (19) 深入了解TextBlock
    windows phone (25) Canvas元素B
    windows phone (20) Image元素
    windows phone (22) 隐藏元素
    windows phone (26) ApplicationBar应用程序栏
    windows phone (27) 基础Button
  • 原文地址:https://www.cnblogs.com/zl879211310/p/3478640.html
Copyright © 2011-2022 走看看