前言

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

1、在MVC下的表格导出。

2、基于NPOI的表格导出。

3、读取Excel表格数据。

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

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

 public class ListModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Password { get; set; }
}

一个表格model,代码如下:

  public class ExcelModel
{
[Display(Name = "ID")]
public int Id { get; set; }
[Display(Name = "第一列")]
public string Head { get; set; }
[Display(Name = "第二列")]
public string Center { get; set; }
}

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

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using System.Web.UI.WebControls; namespace Excel1.Helper
{
public class EecelHelper<T>:ActionResult
{
private string _fileName;
private List<T> _rows;
private List<string> _headers;
private TableStyle _tableStyle;
private TableItemStyle _headerSytle;
private TableItemStyle _itemStyle;
public string FileName
{
get { return _fileName; }
}
public List<T>Rows
{
get { return _rows; }
}
public EecelHelper(List<T> rows,string fileName )
:this(rows,fileName,null,null,null,null)
{ }
public EecelHelper(List<T>rows,string fileName,List<string>headers )
:this(rows,fileName,headers,null,null,null)
{ }
public EecelHelper(List<T> rows, string fileName, List<string> headers,TableStyle tableStyle,TableItemStyle headerSytle,TableItemStyle itemStyle) {
_rows = rows;
_fileName = string.IsNullOrEmpty(fileName) ? DateTime.Now.ToString("yyyyMMddHHmmss") : fileName;
_headers = headers;
_tableStyle = tableStyle;
_headerSytle = headerSytle;
_itemStyle = itemStyle;
if(_tableStyle==null)
{
_tableStyle = new TableStyle();
_tableStyle.BorderStyle = BorderStyle.Solid;
_tableStyle.BorderColor = Color.Black;
_tableStyle.BorderWidth = Unit.Parse("2px");
}
if(_headerSytle == null)
{
_headerSytle = new TableItemStyle();
_headerSytle.BackColor = Color.LightGray;
}
} public override void ExecuteResult(ControllerContext context)
{
StringWriter sw = new StringWriter();
HtmlTextWriter tw = new HtmlTextWriter(sw); if(_tableStyle !=null)
{
_tableStyle.AddAttributesToRender(tw);
}
tw.RenderBeginTag(HtmlTextWriterTag.Table);
var properties = TypeDescriptor.GetProperties(typeof (T)); if(_headers == null)
{
_headers = new List<string>();
for(int i=;i<properties.Count;i++)
{
var attr = typeof (T).GetProperty(properties[i].Name).GetCustomAttributes(
typeof (DisplayAttribute), true);
_headers.Add(attr.Length>?((DisplayAttribute)attr[]).Name:properties[i].Name);
}
}
tw.RenderBeginTag(HtmlTextWriterTag.Thead);
foreach (string header in _headers)
{
if(_headerSytle != null)
_headerSytle.AddAttributesToRender(tw);
tw.RenderBeginTag(HtmlTextWriterTag.Th);
tw.Write(header);
tw.RenderEndTag();
} tw.RenderBeginTag(HtmlTextWriterTag.Tbody);
foreach (var row in _rows)
{
tw.RenderBeginTag(HtmlTextWriterTag.Tr);
for(int i=;i<properties.Count;i++)
{
var strValue = properties[i].GetValue(row) == null
? string.Empty
: properties[i].GetValue(row).ToString();
strValue = ReplaceSpecialCharacters(strValue);
if(_itemStyle != null)
_itemStyle.AddAttributesToRender(tw);
tw.RenderBeginTag(HtmlTextWriterTag.Td);
tw.Write(HttpUtility.HtmlEncode(strValue));
tw.RenderEndTag();
}
tw.RenderEndTag();
}
tw.RenderEndTag();
tw.RenderEndTag();
WriteFile(_fileName, "application/ms-excel", sw.ToString());
} private static string ReplaceSpecialCharacters(string value)
{
value = value.Replace("' ", "'");
value = value.Replace("“", "\"");
value = value.Replace("”", "\"");
value = value.Replace("—", "-");
value = value.Replace("...", "");
return value;
}
private static void WriteFile(string fileName,string contentType,string content)
{
HttpContext context = HttpContext.Current;
context.Response.Clear();
context.Response.AddHeader("content-disposition","attachment;filename="+fileName+".xls");
context.Response.ContentEncoding = Encoding.Default;
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.ContentType = contentType;
context.Response.Write(content);
context.Response.End();
}
}
}

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

 public class Mappers
{
public static ExcelModel ExcelModel(ListModel model)
{
return new ExcelModel
{
Id = model.Id,
Head = model.Name,
Center = model.Password,
};
}
}

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

 public ActionResult Down()
{
List<ListModel> list = new List<ListModel>();
ListModel model = new ListModel();
model.Id = ;
model.Name = "小明";
model.Password = "";
list.Add(model);
var excelList = list.Select(Mappers.ExcelModel).ToList();
return new EecelHelper<ExcelModel>(excelList.ToList(), "我的Excel");
}

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

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

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

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NPOI.HSSF.UserModel;
using System.IO;
using System.Text;
using System.Windows.Forms; namespace Ajax
{
/// <summary>
/// 0.引用bils文件夹的dll
/// 1.新建一个model,里面的字段就是要导出的字段
/// 2.输入List<T>数据,FilePath=@"E:\"
/// 3.每行根据model的字段添加
/// </summary>
public class WorkBook
{
public void BuildWorkBook(List<Student> models,string FilePath) //修改
{
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.CreateSheet("第一页");
HSSFRow rowHead = sheet.CreateRow();
rowHead.CreateCell().SetCellValue("姓名"); //修改
rowHead.CreateCell().SetCellValue("年龄"); for (int rowIndex = ; rowIndex < models.Count(); rowIndex++)
{
HSSFRow row = sheet.CreateRow(rowIndex + );
row.CreateCell().SetCellValue(models[rowIndex].Name); // 修改
row.CreateCell().SetCellValue(models[rowIndex].Age);
} using (FileStream fs = new FileStream(FilePath + DateTime.Now.ToString("yyyy-MM-dd") + ".xls", FileMode.Create))
{
workbook.Write(fs);
}
}
}
}

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

  List<Student> model=new List<Student> (){
new Student {Name="小张",Age=},
new Student {Name="小张1",Age=},
new Student {Name="小张2",Age=},
new Student {Name="小张3",Age=},
new Student {Name="小张4",Age=}
};
WorkBook work = new WorkBook(); string path = @"E:\";
try
{
work.BuildWorkBook(model, path);
Response.Write("<script>alert('导出成功');</script>");
}
catch (Exception)
{
Response.Write("<script>alert('导出失败');</script>");
}

读取Excel表格数据

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

  //获得excel表的地址
private string GetPath(string path)
{
var separetor = Path.DirectorySeparatorChar;
return string.Format(path, separetor);
}
//excel表的版本
private const string ExcelDefaultVersion = "12.0";
//连接字符串
private const string ConnectionStringTemplate =
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel {1};HDR=YES;IMEX=1'";//兼容office2003、office2007; private static string GetConnectionString(string excelPath,string excelVersion)
{
return string.Format(CultureInfo.InvariantCulture, ConnectionStringTemplate, excelPath, excelVersion);
} //查询
private static DataSet QueryBySheetName(OleDbConnection conn, string sheetName)
{
var query = string.Format("select * from [{0}]", sheetName);
var adp = new OleDbDataAdapter(query, conn);
var dt = new DataSet();
adp.Fill(dt,"book");//填充到DataSet的 表格名为book的table里。表格名随便取
return dt;
} //创建连接字符串
private static OleDbConnection CreateConnection(string excelPath, string excelVersion = ExcelDefaultVersion)
{
return new OleDbConnection(GetConnectionString(excelPath,excelVersion));
} //查询工作表
public static DataSet Query(string excelPath, string sheetName)
{
using (var conn = CreateConnection(excelPath))
{
var dt = QueryBySheetName(conn, sheetName);
return dt;
}
}

2、调用,代码如下:

  public ActionResult Index()
{
var path = Server.MapPath(GetPath("{0}Content{0}Hero.xlsx"));//获得excel表格地址
DataSet table = Query(path, "Sheet1$");// "Sheet1$"这是读取excel表的哪个工作表,记得加上$
var tables = table.Tables["book"]; for (int i = ; i <= tables.Rows.Count; i++)
{
if (tables.Rows[i][].ToString() != null)
{
if (tables.Rows[i][].ToString() == "")
{
Response.Write(tables.Rows[i][]);
break;
}
}
}
return View();
}

结束

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

Excel表导出的更多相关文章

  1. yii2 中excel表导出

    首先下载phpexcel 在引入类文件(在web中index.php入口文件或者控制器中引入) require_once dirname(dirname(__FILE__)).'/excel/PHPE ...

  2. jfinal excel表导出

    在自己的WEB项目中要用到导出Excel,所以结合网络上的资源写了一个自己的export 工具类. 说明: JFinal 环境 WEB项目 JAVA后台生成非JS插件 好了,直接撸代码 1.设置文件保 ...

  3. thinkphp导入导出excel表单数据

    在PHP项目经常要导入导出Excel表单. 先去下载PHPExcel类库文件,放到相应位置. 我在thinkphp框架中的位置为ThinkPHP/Library/Org/Util/ 导入 在页面上传e ...

  4. ASPNET 导出EXCEL表

    其实网上有很多关于Excel的例子,但是不是很好,他们的代码没有很全,读的起来还很晦涩.经过这几天的摸索,终于可以完成我想要导出报表Excel的效果了.下面是我的效果图. 一.前台的页面图 GridV ...

  5. ASP.NET 导出gridview中的数据到Excel表中,并对指定单元格换行操作

    1. 使用NPOI读取及生成excel表. (1)导出Click事件: 获取DataTable; 给文件加文件名: string xlsxName = "xxx_" + DateT ...

  6. 将数据导出成excel表

    /// <summary> /// 生成excel表 /// </summary> /// <param name="dt">数据表</p ...

  7. 数据库多张表导出到excel

    数据库多张表导出到excel public static void export() throws Exception{ //声明需要导出的数据库 String dbName = "hdcl ...

  8. 【ITOO 1】将List数据导出Excel表

    需求描述:在课表导入的时候,首先给用户提供模板(excel),然后将用户填写好的数据读取到list集合中.再进行判空处赋值处理,以及去重处理.这篇博客,主要介绍读取excel表和导出excel表的方法 ...

  9. ASP.NET导出excel表方法汇总

    asp.net里导出excel表方法汇总  1.由dataset生成 public void CreateExcel(DataSet ds,string typeid,string FileName) ...

随机推荐

  1. C++ 多线程(两个线程卖火车票)

    #include <windows.h> #include <iostream.h> DWORD WINAPI Fun1Proc(LPVOID lpParameter);//t ...

  2. AutoFac文档10(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 循环依赖 循环依赖是指 ...

  3. [原]MS SQL表字段自增相关的脚本

    --查询表是否有自增字段 SELECT OBJECTPROPERTY(OBJECT_ID('[表名]'), 'TableHasIdentity') --查询表的自增字段 SELECT COLUMN_N ...

  4. JVM虚拟机(五):JDK8内存模型—消失的PermGen

    一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈: 每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫“ ...

  5. SQL2005数据库行列转换

    注意:列转行的方法可能是我独创的了,呵呵,因为在网上找不到哦,全部是我自己写的,用到了系统的SysColumns (一)行转列的方法 先说说行转列的方法,这个就比较好想了,利用拼sql和case wh ...

  6. C++ virtual继承

    C++ virtual继承的还有一种名称是菱形继承.主要目的是用于解决从不同类继承来的同名数据成员在内存中有不同的拷贝.造成数据不统一的问题,以致于在进行类释放时造成内存泄漏. 将共同的基类作为虚基类 ...

  7. Webservice实现与调用(基于Spring的多种方式)

    一.Webservice实现 实现方式分类 1. spring实现 bean配置 <bean class="org.springframework.remoting.jaxws.Sim ...

  8. 如何只利用NMAKE+CL+LINK写WIN32程序

    关键是1.包含<Windows.h>及其他的相关头文件2.在LINK指令中最起码要加上KERNEL32.LIB USER32.LIB GDI32.LIB(不需要制定其路径,因为NMAKE, ...

  9. 基础地图Android SDK

    开发者可利用SDK提供的接口,使用百度为您提供的基础地图数据.目前百度地图SDK所提供的地图等级为3-21级,所包含的信息有建筑物.道路.河流.学校.公园等内容. V3.7.0起,地图支持缩放至21级 ...

  10. 80X86寄存器介绍

    80X86寄存器介绍  32位CPU所含有的寄存器有: 4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS ...