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

 

结束

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

 

 

你可能感兴趣的:(Excel)