简单的导出到Excel中:

代码如下:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Web;
namespace Space
{
/// <summary>
/// 标题:将 DataSet, DataTable 导出到 Excel
/// 描述:对之前做的导出 Excel 做调整以支持对 DataSet 及 DataTable 的导出;
/// DataSet 导出时可以指定需要导出的 DataTable
/// DataTable 导出时可以指定需要导出的 DataColumn 及自定义导出后的列名
/// </summary>
public static class ExcelExportProvider
{
public static string BuildExportHTML(System.Data.DataTable dt)
{
string result = string.Empty;
int readCnt = dt.Rows.Count;
int colCount = dt.Columns.Count;
int pagerecords = ;
result = "<?xml version=\"1.0\" encoding=\"gb2312\"?>";
result += "<?mso-application progid=\"Excel.Sheet\"?>";
result += "<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" ";
result += "xmlns:o=\"urn:schemas-microsoft-com:office:office\" ";
result += "xmlns:x=\"urn:schemas-microsoft-com:office:excel\" ";
result += "xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" ";
result += "xmlns:html=\"http://www.w3.org/TR/REC-html40\"> ";
string strTitleRow = "";
//设置每行的标题行
strTitleRow = "<Row ss:AutoFitHeight='0'>";
for (int j = ; j < colCount; j++)
{
var tempColName = dt.Columns[j].ColumnName;
if (tempColName.IndexOf("@@@@@@@@@@@@") >= ) //把"@@@@@@@@@@@@"作为分隔符号 前面为显示内容,后面为主键id。
{
tempColName = tempColName.Split(new string[] { "@@@@@@@@@@@@" }, StringSplitOptions.None)[];
}
strTitleRow += "<Cell><Data ss:Type=\"String\">" + tempColName + "</Data></Cell>";
}
strTitleRow += "</Row>";
StringBuilder strRows = new StringBuilder();
//在变长的字符操作方面stringbuilder的效率比string高得多
int page = ; //分成的sheet数
int cnt = ; //输入的记录数
int sheetcolnum = ; //每个sheet的行数,其实就等于cnt+1
for (int i = ; i < readCnt; i++)
{
strRows.Append("<Row ss:AutoFitHeight=\"0\">");
for (int j = ; j < colCount; j++)
{
if (dt.Columns[j].DataType.Name == "DateTime" || dt.Columns[j].DataType.Name == "SmallDateTime")
{
if (dt.Rows[i][j].ToString() != string.Empty)
{
strRows.Append("<Cell><Data ss:Type=\"String\">" + Convert.ToDateTime(dt.Rows[i][j].ToString()).ToShortDateString() + "</Data></Cell>");
}
else
strRows.Append("<Cell><Data ss:Type=\"String\"></Data></Cell>");
}
//alter by taomin 2012-11-13 新增decimal类型数据的处理方式 避免decimal类型数据导入EXCEL是未被转化为数字型,不利于在excel中进行统计计算
else if (dt.Columns[j].DataType.Name == "Int32" || dt.Columns[j].DataType.Name == "Int64" || dt.Columns[j].DataType.Name.ToLower() == "decimal")
{
strRows.Append("<Cell><Data ss:Type= \"Number\">" + dt.Rows[i][j].ToString().Trim() + "</Data></Cell>");
}
else
{
strRows.Append("<Cell><Data ss:Type=\"String\">" + dt.Rows[i][j].ToString().Trim() + "</Data></Cell>");
}
}
strRows.Append("</Row>");
cnt++;
//到设定行数时,要输出一页,防止office打不开,同时要注意string和stringbuilder的长度限制
if (cnt >= pagerecords + )
{
sheetcolnum = cnt + ;
result += "<Worksheet ss:Name=\"Sheet" + page.ToString() + "\"><Table ss:ExpandedColumnCount=\"" + colCount.ToString() + "\" ss:ExpandedRowCount=\"" + sheetcolnum.ToString() + "\" x:FullColumns=\"1\" x:FullRows=\"1\" ss:DefaultColumnWidth=\"104\" ss:DefaultRowHeight=\"13.5\">" + strTitleRow.ToString() + strRows.ToString() + "</Table></Worksheet>";
strRows.Remove(, strRows.Length);
cnt = ; //下一个sheet重新计数
page++;
}
}
sheetcolnum = cnt + ;
result = result + "<Worksheet ss:Name='Sheet" + page.ToString() + "'><Table ss:ExpandedColumnCount='" + colCount.ToString() + "' ss:ExpandedRowCount='" + sheetcolnum.ToString() + "' x:FullColumns='1' x:FullRows='1' ss:DefaultColumnWidth='104' ss:DefaultRowHeight='13.5'>" + strTitleRow.ToString() + strRows.ToString() + "</Table></Worksheet></Workbook>";
return result;
}
/// <summary>
/// 导出Excel
/// 例子 Controller里面调用 ExcelExportProvider.DataTable2Excel(dt, "ClickExcel.xls");
/// </summary>
public static void DataTable2Excel(DataTable dt, string fileName)
{
string outputFileName = null;
HttpContext curContext = System.Web.HttpContext.Current;
string browser = curContext.Request.UserAgent.ToUpper();
if (browser.Contains("FIREFOX") == true)
{
outputFileName = "\"" + fileName + "\"";
}
else
{
outputFileName = HttpUtility.UrlEncode(fileName);
}
curContext.Response.ContentType = "application/ms-excel";
curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
curContext.Response.AppendHeader("Content-Disposition", ("attachment;filename=" + outputFileName));
curContext.Response.Charset = "";
curContext.Response.Write(BuildExportHTML(dt));
curContext.Response.Flush();
curContext.Response.End();
}
}
}
使用方法:
前台:
eg:<button id="ExportToExcel">导出到Excel</button>
 
$("#ExportToExcel").click(function(){
    Location.href= "/ExportToExcel.do"
});
 
后台:
public void ExportToExcel(DataTable dt)
{
    string fileName = "test.xls";
    ExcelExportProvider.DataTable2Excel(dt,fileName);
}

点击Button时会调用资源管理器的路径选择对话框,在此时选择文件存储路径

PS:转载请注明出处。

DataTable导出到Excel的更多相关文章

  1. [转].net 使用NPOI或MyXls把DataTable导出到Excel

    本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...

  2. DataTable 导出到 Excel 类

    底层类: #region DataTable 导出到 Excel /// <summary> /// DataTable 导出到 Excel /// </summary> // ...

  3. c# DataTable导出为excel

    /// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <param name="dt& ...

  4. C# datatable 导出到Excel

    datatable导出到Excel /// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <pa ...

  5. DataTable导出到Excel(.NET 4.0)

    最近在论坛里又看到很多关于DataTable(DataSet)导入Excel的帖子,我也温故知新一下,用VS2010重新整理了一个Sample.这个问题简化一下就是内存数据到文件,也就是遍历赋值,只不 ...

  6. NPOI使用Datatable导出到Excel

    首先要引用dll 下载地址:http://pan.baidu.com/s/1dFr2m 引入命名空间: using NPOI.HSSF.UserModel;using NPOI.SS.UserMode ...

  7. C# 将datatable导出成Excel

    public void Result( ){try{StringBuilder sql = new StringBuilder();List<SqlParameter> parameter ...

  8. csv/json/list/datatable导出为excel的通用模块设计

    导出excel的场景我一般都是一个List直接导出成一张sheet,用Npoi.Mapper库很方便,最近我经常是需要将接口返回的jsonarray转成一张excel表,比如从elasticsearc ...

  9. 将DataTable导出到Excel

    /// <summary> /// 导出Excel /// </summary> /// <param name="dtData"></p ...

随机推荐

  1. Ajax跨域实现

    Ajax Ajax,Asynchronus JavaScript and XML,字母意思:异步的 JavaScript 和 XML,是指一种创建交互式网页应用的网页开发技术.用于异步地去获取XML作 ...

  2. jquery Combo Select 下拉框可选可输入插件

    Combo Select 是一款友好的 jQuery 下拉框插件,在 PC 浏览器上它能模拟一个简单漂亮的下拉框,在 iPad 等移动设备上又能回退到原生样式.Combo Select 能够对选项进行 ...

  3. 用Model-View-ViewModel构建iOS App(转)

    转载自 Model-View-ViewModel for iOS [译] 如果你已经开发一段时间的iOS应用,你一定听说过Model-View-Controller, 即MVC.MVC是构建iOS a ...

  4. MSMQ学习

    一.理论准备 MSMQ(MicroSoft Message Queue,微软消息队列)官方的解释是:在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布 ...

  5. CodeForces 698C LRU

    吐槽一句:这数据造得真强-. 题意:有一个大小为k的缓存区,每次从n种物品中按照一定的概率选取一种物品尝试放进去.同一个物品每一次选取的概率都是相同的.如果这种物品已经放进去过就不再放进去.如果缓存区 ...

  6. windows下python的web环境搭建使用(观看Backbone的教程有感)

    pip安装a 下载 get-pip.py (https://pip.pypa.io/en/latest/installing/#python-os-support b python get-pip.p ...

  7. zookeeper原理解析-选举

    1)QuorumPeerMain加载 Zookeeper集群启动的入口类是QuorumPeerMain来加载配置启动QuorumPeer线程.首先我们来看下QuorumPeer, 谷歌翻译quorum ...

  8. java中获取路径的几种基本的方法

    package com.ygh.blog.realpath; import java.io.File; import java.io.IOException; import java.io.Input ...

  9. webapi集成owin使用Oauth认证时能获取accee_token仍无法登录的解决办法

    HttpConfiguration webapiConfig = new HttpConfiguration(); IIocBuilder iocBuilder = new OwinAutofacIo ...

  10. Eclipse换背景色

    上班后,长时间看代码,眼睛感觉有些疲惫,就想想如果能换个肤色就好了,于是在网上搜了一下,果真Eclipse提供了这个方面功能,心情小激动, 顿时感觉萌萌哒,于是乐呵呵的把肤色改了.在这感谢网上的亲们, ...