C#中写入Excel



using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Data;
namespace Common.BaseClass
{
public class FileExport
{
#region 导出文件为 Excel文件 文本格式
/// <summary>
/// 导出文件为 Excel文件
/// </summary>
/// <param name="dt">数据集</param>
/// <param name="FileName">导出文件名称</param>
/// <param name="headers">列名</param>
/// <param name="remark">备注</param>
public void CreateExcel(DataTable dt, string FileName, string[] headers, string[] remark)
{

HttpResponse resp;
resp 
= HttpContext.Current.Response;
resp.ContentEncoding 
= System.Text.Encoding.GetEncoding("GB2312");
resp.AppendHeader(
"Content-Disposition""attachment;filename=" + FileName);
//标题 内容
string colHeaders = "", ls_item = "";
int i = 0;

DataRow[] myRow 
= dt.Select("");
for (i = 0; i < remark.Length; i++)
{
colHeaders 
+= remark[i] + "\n";
}
//取得数据表各列标题,各标题之间以\t分割,最后一个列标题后加回车符
for (i = 0; i < headers.Length; i++)
{
colHeaders 
+= headers[i] + "\t";
}
colHeaders 
+= "\n";
//向HTTP输出流中写入取得的数据信息
resp.Write(colHeaders);
//逐行处理数据
foreach (DataRow row in myRow)
{
//在当前行中,逐列获得数据,数据之间以\t分割,结束时加回车符\n
for (i = 0; i < dt.Columns.Count; i++)
{
ls_item 
+= row[i].ToString() + "\t";
//当前行数据写入HTTP输出流,并且置空ls_item以便下行数据
}
ls_item 
+= "\n";
resp.Write(ls_item);
ls_item 
= "";
}

//写缓冲区中的数据到HTTP头文件中
resp.End();
}
#endregion
/// <summary>
/// 将Dataset中的表导出到Excel中
/// </summary>
/// <param name="source">源数据集</param>
/// <param name="fileName">保存的文件名</param>
/// <param name="title">标题</param>
/// <param name="headers">列名</param>
/// <param name="explain">文件生成说明</param>
/// <param name="ps">注释</param>
public static void ExportToExcel(DataTable source, string fileName, string[] headers, string title, string explain,string []ps)
{
HttpResponse resp;
resp 
= HttpContext.Current.Response;
resp.ContentEncoding 
= System.Text.Encoding.GetEncoding("utf-8");
resp.AppendHeader(
"Content-Disposition""attachment;filename=" + fileName);


string startExcelXML = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet""
xmlns:o=""urn:schemas-microsoft-com:office:office""
xmlns:x=""urn:schemas- microsoft-com:office:excel""
xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"">
<Styles>
<Style ss:ID=""Default"" ss:Name=""Normal"">
<Alignment ss:Horizontal=""Center"" ss:Vertical=""Center""/>
<Font/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID=""BoldColumn"">
<Borders>
<Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
</Borders>
<Font ss:FontName=""宋体"" ss:Bold=""1"" x:CharSet=""134"" ss:Size=""12"" />
<Interior ss:Color=""#D2EAF6"" ss:Pattern=""Solid""/>
</Style>
<Style ss:ID=""StringLiteral"">
<NumberFormat ss:Format=""@""/>
<Borders>
<Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
</Borders>
<Font ss:FontName=""宋体"" x:CharSet=""134"" ss:Size=""12"" />
</Style>
<Style ss:ID=""Decimal"">
<NumberFormat ss:Format=""0.00""/>
<Borders>
<Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
</Borders>
<Font ss:FontName=""宋体"" x:CharSet=""134"" ss:Size=""12"" />
</Style>
<Style ss:ID=""Integer"">
<NumberFormat ss:Format=""0""/>
<Borders>
<Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
</Borders>
<Font ss:FontName=""宋体"" x:CharSet=""134"" ss:Size=""12"" />
</Style>
<Style ss:ID=""DateLiteral"">
<NumberFormat ss:Format=""yyyy-MM-dd HH:mm;@""/>
<Borders>
<Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
</Borders>
<Font ss:FontName=""宋体"" x:CharSet=""134"" ss:Size=""12"" />
</Style>
<Style ss:ID=""ps""><!--注释-->
<Alignment ss:Horizontal=""Left"" ss:Vertical=""Center""/>
<Font ss:FontName=""宋体"" x:CharSet=""134""/>
<Interior ss:Color=""#FFFFCC"" ss:Pattern=""Solid""/>
</Style>
<Style ss:ID=""explain""><!--说明:数据跟据什么而来-->
<Alignment ss:Horizontal=""Left"" ss:Vertical=""Center""/>
<Borders>
<Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
<Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
</Borders>
<Font ss:FontName=""宋体"" x:CharSet=""134"" ss:Size=""12""/>
</Style>
<Style ss:ID=""Title""><!--大标题-->
<Alignment ss:Horizontal=""Center"" ss:Vertical=""Center""/>
<Borders>
<Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
</Borders>
<Font ss:FontName=""宋体"" x:CharSet=""134"" ss:Size=""16"" ss:Bold=""1""/>
</Style>
</Styles>
";
string endExcelXML = "\r\n</Workbook>";

int rowCount = 0;
int sheetCount = 0;
resp.Write(startExcelXML);
sheetCount
++;
resp.Write(
"\r\n<Worksheet ss:Name=\"" + title + "\">");
resp.Write(
"\r\n<Table>");

//写标题
resp.Write("\r\n<Row>\r\n<Cell ss:MergeAcross=\"" + (source.Columns.Count - 1) + "\" ss:StyleID=\"Title\"><Data ss:Type=\"String\">" + title + "</Data></Cell>\t\t\t\r\n</Row>");
//写数据来源
resp.Write("\r\n<Row>\r\n<Cell ss:MergeAcross=\"" + (source.Columns.Count - 1) + "\" ss:StyleID=\"explain\"><Data ss:Type=\"String\">" + explain + "</Data></Cell>\r\n</Row>");

resp.Write(
"\r\n<Row>");
//得到数据集有多少列
//for (int x = 0; x < source.Columns.Count; x++)
//{
// resp.Write("<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">");
// resp.Write(source.Columns[x].ColumnName);
// resp.Write("</Data></Cell>");
//}//New 自己定义列名
for (int x = 0; x < headers.Length; x++)
{
resp.Write(
"\r\n<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">");
resp.Write(headers[x]);
resp.Write(
"</Data></Cell>");
}
resp.Write(
"</Row>");

//便历出数据集中的每一行数据
foreach (DataRow x in source.Rows)
{
rowCount
++;
//如果行数超过 陆万肆仟行,则新起一页
if (rowCount == 64000)
{
rowCount 
= 0;
sheetCount
++;
resp.Write(
"\r\n</Table>");
resp.Write(
" \r\n</Worksheet>");
resp.Write(
"\r\n<Worksheet ss:Name=\"" + source.TableName + sheetCount + "\">");
resp.Write(
"\r\n<Table>");
}

resp.Write(
"\r\n<Row>"); //ID=" + rowCount + "

for (int y = 0; y < source.Columns.Count; y++)
{
System.Type rowType;
//获得将要写入数据的数据类型
rowType = x[y].GetType();
switch (rowType.ToString())
{
case "System.String":
string XMLstring = x[y].ToString();
XMLstring 
= XMLstring.Trim();
XMLstring 
= XMLstring.Replace("&""&");
XMLstring 
= XMLstring.Replace(">"">");
XMLstring 
= XMLstring.Replace("<""<");
resp.Write(
"\r\n<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
resp.Write(XMLstring);
resp.Write(
"</Data></Cell>");
break;
case "System.DateTime":
//Excel has a specific Date Format of YYYY-MM-DD followed by
//the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000
//The Following Code puts the date stored in XMLDate
//to the format above
DateTime XMLDate = (DateTime)x[y];
string XMLDatetoString = ""//Excel Converted Date
XMLDatetoString = XMLDate.Year.ToString() +
"-" +
(XMLDate.Month 
< 10 ? "0" +
XMLDate.Month.ToString() : XMLDate.Month.ToString()) 
+
"-" +
(XMLDate.Day 
< 10 ? "0" +
XMLDate.Day.ToString() : XMLDate.Day.ToString()) 
+
"T" +
(XMLDate.Hour 
< 10 ? "0" +
XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) 
+
":" +
(XMLDate.Minute 
< 10 ? "0" +
XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) 
+
":" +
(XMLDate.Second 
< 10 ? "0" +
XMLDate.Second.ToString() : XMLDate.Second.ToString()) 
+
".000";
resp.Write(
"\r\n<Cell ss:StyleID=\"DateLiteral\">" +
"<Data ss:Type=\"DateTime\">");
resp.Write(XMLDatetoString);
resp.Write(
"</Data></Cell>");
break;
case "System.Boolean":
resp.Write(
"\r\n<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
resp.Write(x[y].ToString());
resp.Write(
"</Data></Cell>");
break;
case "System.Int16":
case "System.Int32":
case "System.Int64":
case "System.Byte":
resp.Write(
"\r\n<Cell ss:StyleID=\"Integer\">" +
"<Data ss:Type=\"Number\">");
resp.Write(x[y].ToString());
resp.Write(
"</Data></Cell>");
break;
case "System.Decimal":
case "System.Double":
resp.Write(
"\r\n<Cell ss:StyleID=\"Decimal\">" +
"<Data ss:Type=\"Number\">");
resp.Write(x[y].ToString());
resp.Write(
"</Data></Cell>");
break;
case "System.DBNull":
resp.Write(
"\r\n<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
resp.Write(
"");
resp.Write(
"</Data></Cell>");
break;
default:
throw (new Exception(rowType.ToString() + " not handled."));
}
}
resp.Write(
"\r\n</Row>");
}
//注释
foreach (string str in ps)
{
resp.Write(
"\r\n<Row>\r\n<Cell ss:MergeAcross=\"" + (source.Columns.Count - 1) + "\" ss:StyleID=\"ps\"><Data ss:Type=\"String\">" + str + "</Data></Cell>\r\n</Row>");
}
resp.Write(
"\r\n</Table>");
resp.Write(
"\r\n</Worksheet>");

resp.Write(endExcelXML);

resp.End();
}
}
}


转载于:https://www.cnblogs.com/raindust/archive/2007/08/16/857479.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这C语言写法谁见过

这是一个读者发给我的&#xff0c;我自己也没有见过这样的写法&#xff0c;有谁知道的&#xff0c;可以评论说下。谢谢各位&#xff01;

一号团队-团队任务3:每日立会(2018-12-01)

一.基本信息 团队序号&#xff1a;一号 开发的软件名称&#xff1a;Java教学官网 撰写人&#xff1a;张浩洋 学号:2016035107283 职务:项目经理 二.团队汇报 1.汇报文字版 一号团队全体成员与2018年12月01日在第一组项目群中针对2018年11月30日工作任务进行汇报&#xff0c;汇总…

老陈学 C++ 序列之二: 友元函数

class one{ public: one(){}; operator two ( ) const { return two(); } friend ostream& operator << ( ostream& os, const one& o) //成员函数还是全局函数&#xff1f; { return os << " i " << o.i; } int i; …

40 岁的中年失业

大家好&#xff0c;我是写代码的篮球球痴&#xff0c;昨天发了一篇文章&#xff0c;有一个朋友转发了&#xff0c;然后看到有人评论&#xff0c;如下&#xff1a;前两天有朋友问我&#xff0c;说腾讯裁员好严重&#xff0c;还有如何如何&#xff0c;我是这样回答的。很多事情我…

Linux/Windows系统内核性能调优

做过Linux平台性能测试的童鞋平时可能会遇到如下问题&#xff1a; 1、 TCP端口号不够用导致并发上不去&#xff08;即与服务器端建立新连接失败&#xff09; 2、 TIME_WAIT状态连接过多导致应用服务器&#xff08;Nginx、Haproxy、Redis、Tomcat等&#xff09;性能下降或假死…

hwclock: Open of /dev/rtc failed, errno=19: No such device.

今早一台服务器故障&#xff0c;后来有空上来查看故障日志&#xff0c;未果&#xff0c;发现时间不对&#xff0c;如下&#xff1a; [rootcache06 ~]# hwclock -w Cannot access the Hardware Clock via any known method. Use the --debug option to see the details of our s…

MCU复位和程序启动那些事

大家好&#xff0c;这篇文章转自电源漫谈&#xff0c;文章从专业的角度说明了MCU复位经过的过程&#xff0c;对大家学习很有帮助。MCU通常会在工作之前&#xff0c;先经历复位和启动的一个过程&#xff0c;在用户使用过程中往往在这个阶段的工作不是那么的清楚&#xff0c;这里…

逆波兰表达式[栈 C 语言 实现]

逆波兰表达式 逆波兰表达式又叫做后缀表达式。在通常的表达式中&#xff0c;二元运算符总是置于与之相关的两个运算对象之间&#xff0c;这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法&#xff0c;按此方法&#xff0c;每一运算符…

FireFox不支持cursor:hand

这个在IE/Firefox下都支持可以使用cursor:pointer;转载于:https://www.cnblogs.com/kaixin110/archive/2007/08/22/865287.html

Red Hat 6.0 Installation Steps

1) 注册和下载 - 需要一个公司email地址来接收RH的确认邮件 https://cn.redhat.com/products/enterprise-linux/server/download.html 下载免费红帽企业 Linux 30 天评估版 - 注册完毕转入下载页面 https://access.redhat.com/downloads/ -选择免费评估版本, 收到确认邮件, 找到…

若有所思

今天出来​逛了下&#xff0c;没有准备文章&#xff0c;刚好一个朋友有一段思考&#xff0c;给大家分享下。深圳动物园是一个值得去的地方​-----佚名海边的夏天&#xff0c;太阳公公当空照&#xff0c;照的大地滚烫&#xff0c;海水湛蓝。人们都躲到树荫下&#xff0c;享受舶风…

HDU 4383 To The Moon 解题报告

HDU 4383 To The Moon 题意翻译 已知一个长为\(n\)的序列\(a\)&#xff0c;你需要进行下面的四种操作。 C l r d 将区间\([l,r]\)中的数加上\(d\),同时时间加\(1\) Q l r 查询当前时间区间\([l,r]\)中所有数的和 H l r t 查询时间为\(t\)时区间\([l,r]\)中所有数的和 B t 将当前…

第三章 阴阳的工作机制(1)

一、道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物1.易有太极&#xff0c;是生两仪上面&#xff0c;对阴阳已经讨论了很多&#xff0c;对这个问题已经有所了解。现在我们来讨论"阴阳的工作机制"&#xff0c;弄清楚这个以后对理解《伤寒论》的许多…

tcp窗口滑动以及拥塞控制

转自&#xff1a;http://blog.chinaunix.net/uid-26275986-id-4109679.html TCP协议作为一个可靠的面向流的传输协议&#xff0c;其可靠性和流量控制由滑动窗口协议保证&#xff0c;而拥塞控制则由控制窗口结合一系列的控制算法实现。 一、滑动窗口协议 关于这部分自己不…

jquery 操作日期、星期、元素的追加

主要实现日期的显示&#xff0c;获取年月日&#xff0c;时分秒、星期、判断闰年<script language"javascript" >$(document).ready(function(){function show(){var mydatenew Date();var str "" mydate.getFullYear() "年"; …

简单易懂的芯片科普漫画,帮你打开高深的新技术大门

大家好&#xff0c;我是写代码的篮球球痴&#xff0c;今天给大家推荐一本新书&#xff0c;是华为麒麟团队出版的&#xff0c;主要是让大家了解芯片的结构&#xff0c;这对很多人理解计算机是非常有帮助的。希望大家喜欢。喜欢书籍的同学在文章下面评论&#xff0c;我们会选出评…

UDT协议详细分析

UDT协议的主要特性有哪些&#xff1f; 基于UDP的应用层协议&#xff1a; 有基本网络知识的朋友都知道TCP和UDP的区别和使用场景&#xff0c;但是有没有一种协议能同时兼顾TCP协议的安全可靠和UDP协议的高效&#xff0c;那么UDT就是一种。 面向连接的协议&#xff1a;面向连接…

书摘---创业36条军规1:创业是怎么回事

这本书是电子版&#xff0c;是我这几年唯一购买的一本电子版本的图书。一来是想尝尝新鲜&#xff0c;二来是想看看书中有什么可以学习的东西。 本人一直在打工&#xff0c;所以不太了解创业的情况&#xff0c;站在巨人的肩膀上才能看的更远&#xff0c;看了此书不代表我就想创业…

在STM32上模拟Linux自动初始化过程

Linux中有很多编程思想可以学习&#xff0c;很多大佬把这些思想、机制运用到单片机的编程上&#xff0c;STM32 模拟Linux kernel自动初始化流程。通常我们写程序都是按照这个套路&#xff0c;一个函数一个函数按照顺序逻辑一个一个的执行下去。如果逻辑非常复杂&#xff0c;涉及…

日志配置(springboot、mybatis、Lombok)

Spring Boot在所有内部日志中使用Commons Logging&#xff0c;但是默认配置也提供了对常用日志的支持&#xff0c;如&#xff1a;Java Util Logging&#xff0c;Log4J, Log4J2和Logback。每种Logger都可以通过配置使用控制台或者文件输出日志内容 SLF4J——Simple Logging Faca…