DataTable导出到Excel
简单的导出到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();
}
}
}
点击Button时会调用资源管理器的路径选择对话框,在此时选择文件存储路径
PS:转载请注明出处。
DataTable导出到Excel的更多相关文章
- [转].net 使用NPOI或MyXls把DataTable导出到Excel
本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...
- DataTable 导出到 Excel 类
底层类: #region DataTable 导出到 Excel /// <summary> /// DataTable 导出到 Excel /// </summary> // ...
- c# DataTable导出为excel
/// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <param name="dt& ...
- C# datatable 导出到Excel
datatable导出到Excel /// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <pa ...
- DataTable导出到Excel(.NET 4.0)
最近在论坛里又看到很多关于DataTable(DataSet)导入Excel的帖子,我也温故知新一下,用VS2010重新整理了一个Sample.这个问题简化一下就是内存数据到文件,也就是遍历赋值,只不 ...
- NPOI使用Datatable导出到Excel
首先要引用dll 下载地址:http://pan.baidu.com/s/1dFr2m 引入命名空间: using NPOI.HSSF.UserModel;using NPOI.SS.UserMode ...
- C# 将datatable导出成Excel
public void Result( ){try{StringBuilder sql = new StringBuilder();List<SqlParameter> parameter ...
- csv/json/list/datatable导出为excel的通用模块设计
导出excel的场景我一般都是一个List直接导出成一张sheet,用Npoi.Mapper库很方便,最近我经常是需要将接口返回的jsonarray转成一张excel表,比如从elasticsearc ...
- 将DataTable导出到Excel
/// <summary> /// 导出Excel /// </summary> /// <param name="dtData"></p ...
随机推荐
- Android疑难杂症收集
在渲染前获取 View 的宽高 5种手势工具类 软键盘用法总结 Android中Shape的使用 Android只能动态注册的广播Action Android 悬浮窗权限各机型各系统适配大全 录音权限 ...
- CodeForces 261B Maxim and Restaurant 解法汇总
题意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a3-+ai,问满足Si<=p的i的最大值的期望.(p<=50) 这道题在网上有一些不同 ...
- [bigdata] 使用Redis队列来实现与机器无关的Job提交与执行 (python实现)
用例场景: 定时从远程多台机器上下载文件存入HDFS中.一开始采用shell 一对一的方式实现,但对于由于网络或者其他原因造成下载失败的任务无法进行重试,且如果某台agent机器down机,将导致它对 ...
- 每天一个 Linux 命令(21):find命令之xargs
在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出 ...
- CSS style和HTML style有什么区别?
https://zhidao.baidu.com/question/1238362131134658699.html 没有什么区别啊,都是样式的意思. 没有分别的!CSS提高代码重用性,加速浏览器下载 ...
- [教程] [授权翻译] 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程]
[教程] [授权翻译] 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程] http://bbs.pcbeta.com/viewthread-1571455-1-1.html [教程] [ ...
- sql语句,order by
ORDER BY子句必须出现在SELECT中的最后一个子句. 在排序的列中NULL值被认为是最大的. 在SQL语句中给表达式定义别名是一个好习惯. 多列排序时不管升序还是降序,每个列需要单独设置
- LR破解版录制手机脚本(一)模拟器录制
最近在网上听到好多童鞋都在问如何用LR做手机性能测试,恰好自己对这方面也挺感兴趣,经过查阅很多资料,形成此文档以做备注~!如果有感觉我写的不对的地方,敬请指正,谢谢~! 其实自从LR12出来之 ...
- c# .Net :Excel NPOI导入导出操作教程之数据库表信息数据导出到一个Excel文件并写到磁盘示例分享
string sql = @"select * from T_Excel"; ----------------DataTable Star---------------- ...
- coreseek安装过程
一.sphinx 全文检索 通过sphinx检索到id,然后到mysql里面拿到记录 什么是劝我呢检索?结构化数据: 具有固定格式或者长度的数据非结构化数据: 标题 内容 等不定长的数据非机构化数据还 ...