Asp.net无须任何插件导出Excel
作者:翅膀的初衷 来源:本站原创 发布时间:2014-05-28 查看数:62668
将数据导出成Excel文件是相当常用的一个功能,我们经常在开发中用到。不过我们通常会借助.net的Office组件进行开发,在这里我教大家一种依赖任何外部环境的导出方法。
原理很简单﹐excel 2003及以上版本支持一种xml电子表格的格式﹐也只是说我们只要输出一种指定格式的XML,即可被excel视别。文本非常简单,以DataSet为例,全文代码如下:
protected void Page_Load(object sender, EventArgs e)
{
Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("content-disposition", "attachment; filename=123456.xls");
WriteExcelHead(Response.Output);
WriteDataSet(Response.Output, new DAL.SqlHelper().ExecuteTable("select * from zkxy_Category").DataSet);
WriteExcelFoot(Response.Output);
}
private void WriteExcelHead(System.IO.TextWriter writer)
{
writer.WriteLine("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>");
writer.WriteLine("<?mso-application progid=\"Excel.Sheet\"?>");
//Excel工作薄开始
writer.WriteLine("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");
writer.WriteLine(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
writer.WriteLine(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
writer.WriteLine(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");
writer.WriteLine(" xmlns:html=\"http://www.w3.org/TR/REC-html40//\">");
writer.WriteLine(" <DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">");
writer.WriteLine(" <Author>www.jiniannet.com</Author>");
writer.WriteLine(string.Format(" <Created>{0}T{1}Z</Created>", DateTime.Now.ToString("yyyy-mm-dd"), DateTime.Now.ToString("HH:MM:SS")));
writer.WriteLine(" <Company>www.jiniannet.com</Company>");
writer.WriteLine(" <Version>11.6408</Version>");
writer.WriteLine(" </DocumentProperties>");
writer.WriteLine(" <ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">");
writer.WriteLine(" <WindowHeight>8955</WindowHeight>");
writer.WriteLine(" <WindowWidth>11355</WindowWidth>");
writer.WriteLine(" <WindowTopX>480</WindowTopX>");
writer.WriteLine(" <WindowTopY>15</WindowTopY>");
writer.WriteLine(" <ProtectStructure>False</ProtectStructure>");
writer.WriteLine(" <ProtectWindows>False</ProtectWindows>");
writer.WriteLine(" </ExcelWorkbook>");
//Excel工作薄结束
//工作薄样式
writer.WriteLine("<Styles>");
writer.WriteLine("<Style ss:ID=\"Default\" ss:Name=\"Normal\">");
writer.WriteLine(" <Alignment/>");
writer.WriteLine(" <Borders/>");
writer.WriteLine(" <Font ss:FontName=\"宋体\" x:CharSet=\"134\" ss:Size=\"12\"/>");
writer.WriteLine(" <Interior/>");
writer.WriteLine(" <Protection/>");
writer.WriteLine("</Style>");
//文本样式
writer.WriteLine("<Style ss:ID=\"StringLiteral\">");
writer.WriteLine(" <NumberFormat ss:Format=\"@\"/>");
writer.WriteLine("</Style>");
//浮点型样式
writer.WriteLine("<Style ss:ID=\"Decimal\">");
writer.WriteLine(" <NumberFormat ss:Format=\"0.00\"/>");
writer.WriteLine("</Style>");
//整型样式
writer.WriteLine("<Style ss:ID=\"Integer\">");
writer.WriteLine(" <NumberFormat ss:Format=\"0\"/>");
writer.WriteLine("</Style>");
//日期样式
writer.WriteLine("<Style ss:ID=\"DateLiteral\">");
writer.WriteLine(" <NumberFormat ss:Format=\"mm/dd/yyyy;@\"/>");
writer.WriteLine("</Style>");
writer.WriteLine(" </Styles>");
}
private void WriteExcelFoot(System.IO.TextWriter writer)
{
writer.WriteLine("</Workbook>");
}
private void WriteDataSet(System.IO.TextWriter writer, DataSet ds)
{
for (int i = 0; i < ds.Tables.Count; i++)
{
int rows = ds.Tables[i].Rows.Count + 1;
int cols = ds.Tables[i].Columns.Count;
//第i个工作表
writer.WriteLine(string.Format("<Worksheet ss:Name=\"{0}\">", ds.Tables[i].TableName));
writer.WriteLine(string.Format(" <Table ss:ExpandedColumnCount=\"{0}\" ss:ExpandedRowCount=\"{1}\" x:FullColumns=\"1\"", cols.ToString(), rows.ToString()));
writer.WriteLine(" x:FullRows=\"1\" ss:DefaultColumnWidth=\"54\" ss:DefaultRowHeight=\"14.25\">");
//<Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="4" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
//ExpandedColumnCount:代表Excel文档中的列数
//ExpandedRowCount:代表Excel文档中的行数
//指定每一列的宽度
for (int c = 0; c < ds.Tables[i].Columns.Count; c++)
{
writer.WriteLine(string.Format("<Column ss:Index=\"{0}\" ss:AutoFitWidth=\"{1}\" ss:Width=\"{2}\"/> ", c + 1, 1, 80));
}
//生成标题
//writer.WriteLine(string.Format("<Row ss:AutoFitHeight=\"{0}\" ss:Height=\"{1}\">", 0, 28.5));
writer.WriteLine("<Row>");
foreach (DataColumn eachCloumn in ds.Tables[i].Columns)
{
writer.Write("<Cell ss:StyleID=\"Default\"><Data ss:Type=\"String\">");
writer.Write(eachCloumn.ColumnName.ToString());
writer.WriteLine("</Data></Cell>");
}
writer.WriteLine("</Row>");
//生成数据记录
foreach (DataRow eachRow in ds.Tables[i].Rows)
{
//writer.WriteLine("<Row ss:AutoFitHeight=\"0\">");
writer.WriteLine("<Row>");
for (int currentRow = 0; currentRow != cols; currentRow++)
{
object[] getValue = ExcelContent(eachRow[currentRow]);
writer.Write(string.Format("<Cell ss:StyleID=\"{0}\"><Data ss:Type=\"{1}\">", getValue[0], getValue[1]));
writer.Write(getValue[2]);
writer.WriteLine("</Data></Cell>");
}
writer.WriteLine("</Row>");
}
writer.WriteLine("</Table>");
writer.WriteLine("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");
writer.WriteLine("<Selected/>");
writer.WriteLine("<Panes>");
writer.WriteLine("<Pane>");
writer.WriteLine(" <Number>3</Number>");
writer.WriteLine(" <ActiveRow>1</ActiveRow>");
writer.WriteLine("</Pane>");
writer.WriteLine("</Panes>");
writer.WriteLine("<ProtectObjects>False</ProtectObjects>");
writer.WriteLine("<ProtectScenarios>False</ProtectScenarios>");
writer.WriteLine("</WorksheetOptions>");
writer.WriteLine("</Worksheet>");
}
}
private static object[] ExcelContent(object Value)
{
object[] strValue = new object[3];
System.Type rowType = Value.GetType();
switch (rowType.ToString())
{
case "System.String":
case "System.Guid":
string XMLstring = Value.ToString();
XMLstring = XMLstring.Trim();
XMLstring = XMLstring.Replace("&", "&");
XMLstring = XMLstring.Replace(">", ">");
XMLstring = XMLstring.Replace("<", "<");
strValue[0] = "StringLiteral";
strValue[1] = "String";
strValue[2] = XMLstring;
break;
case "System.DateTime":
DateTime XMLDate = (DateTime)Value;
string XMLDatetoString = ""; //Excel Converted Date
//把日期时间转化为:“yyyy-MM-ddTHH:mm:ss”这种Excel中的格式
XMLDatetoString = XMLDate.ToString(System.Globalization.DateTimeFormatInfo.CurrentInfo.SortableDateTimePattern);
strValue[0] = "DateLiteral";
strValue[1] = "DateTime";
if (XMLDate < Convert.ToDateTime("1900-1-1"))
{
strValue[0] = "StringLiteral";
strValue[1] = "String";
XMLDatetoString = string.Empty;
}
strValue[2] = XMLDatetoString;
break;
case "System.Boolean":
strValue[0] = "StringLiteral";
strValue[1] = "String";
strValue[2] = Value.ToString();
break;
case "System.Int16":
case "System.Int32":
case "System.Int64":
case "System.Byte":
strValue[0] = "Integer";
strValue[1] = "Number";
strValue[2] = Value.ToString();
break;
case "System.Byte[]":
strValue[0] = "StringLiteral";
strValue[1] = "String";
strValue[2] = (byte[])Value;
break;
case "System.Decimal":
case "System.Double":
strValue[0] = "Decimal";
strValue[1] = "Number";
strValue[2] = Value.ToString();
break;
case "System.DBNull":
strValue[0] = "StringLiteral";
strValue[1] = "String";
strValue[2] = "";
break;
default:
throw (new Exception(rowType.ToString() + " not handled."));
}
return strValue;
}
过段时间我把代理整理一下,做成通用的类库。希望大家喜欢!\