此技术需求:
1.office2003需要它将模板导出生成xml文件.(点击文件->保存,选择xml表格保存方式)
2.将此Xml改为Xslt文件,并保存为st结尾的模板文件
3.用StringTemplate读取这个文件,在内存中生成一个Xslt文件
这个模板引敬可到下面网站下载
http://www.stringtemplate.org/download.html
4.用Xslt将一个DataTable的数据对象转换为一个Xml字符串.
5.用生成文本的方式将Xml字符串生成一个Excel文件.
using System;
using System.Collections.Generic;
using System.Net.Mime;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using DataTable=System.Data.DataTable;
using System.IO;
using System.Xml;
using System.Xml.Xsl;
using System.Threading;
using StringTemplate = Antlr.StringTemplate.StringTemplate;
using StringTemplateGroup = Antlr.StringTemplate.StringTemplateGroup;
namespace OPSS.Public.Common.Excel
{
///此是一个将DataTable转换为(xml格式)字符串的Excel帮助文件
public class ExcelHelper
{
#region 生成Excel
/// <summary>
/// 生成Excel字符串,保存在当前对象的strPrintf中,从外部导入生成Excel或CSV格式的数据第一种方式
/// </summary>
/// <param name="DetailsTable">生成Excel的表</param>
/// <param name="templePath">格式化模板相对路径</param>
public static string ExportDetails(DataTable DetailsTable, string templePath)
{
try
{
if (DetailsTable.Rows.Count == 0)
throw new Exception(DetailsTable.TableName + "数据不存在");
// 创建Dataset
DataSet dsExport = new DataSet("Export");
DataTable dtExport = DetailsTable.Copy();
dtExport.TableName = "Values";
dsExport.Tables.Add(dtExport);
// 获取字段名
string[] sHeaders = new string[dtExport.Columns.Count];
string[] sFileds = new string[dtExport.Columns.Count];
for (int i = 0; i < dtExport.Columns.Count; i++)
{
sHeaders[i] = dtExport.Columns[i].ColumnName;
sFileds[i] = dtExport.Columns[i].ColumnName;
}
return Export_with_XSLT_Windows(dsExport, sHeaders, sFileds, templePath);
}
catch (Exception Ex)
{
throw Ex;
}
}
/// <summary>
/// 从外部导入生成Excel或CSV格式的数据第二种方式
/// <param name="DetailsTable">生成Excel的表</param>
/// <param name="ColumnList">控制生成Excel的列表的顺序</param>
/// <param name="templePath">格式化模板相对路径</param>
/// </summary>
public static string ExportDetails(DataTable DetailsTable, int[] ColumnList, string templePath)
{
try
{
if (DetailsTable.Rows.Count == 0)
throw new Exception(DetailsTable.TableName + "数据不存在");
// 创建Dataset
DataSet dsExport = new DataSet("Export");
DataTable dtExport = DetailsTable.Copy();
dtExport.TableName = "Values";
dsExport.Tables.Add(dtExport);
if (ColumnList.Length > dtExport.Columns.Count)
throw new Exception("ExportColumn List超出Columns数据");
// 获取字段名
string[] sHeaders = new string[ColumnList.Length];
string[] sFileds = new string[ColumnList.Length];
for (int i = 0; i < ColumnList.Length; i++)
{
if ((ColumnList[i] < 0) || (ColumnList[i] >= dtExport.Columns.Count))
throw new Exception("ExportColumn List不在Columns范围");
sHeaders[i] = dtExport.Columns[ColumnList[i]].ColumnName;
sFileds[i] = dtExport.Columns[ColumnList[i]].ColumnName;
}
return Export_with_XSLT_Windows(dsExport, sHeaders, sFileds, templePath);
}
catch (Exception Ex)
{
throw Ex;
}
}
/// <summary>
/// 从外部导入生成Excel或CSV格式的数据第三种方式
/// <param name="DetailsTable">生成Excel的表</param>
/// <param name="ColumnList">控制生成Excel的列表的顺序</param>
/// <param name="ColumnList">控制生成Excel的列头</param>
/// <param name="templePath">格式化模板相对路径</param>
/// </summary>
public static string ExportDetails(DataTable DetailsTable, int[] ColumnList, string[] sHeaders, string templePath)
{
try
{
if (DetailsTable.Rows.Count == 0)
throw new Exception(DetailsTable.TableName + "数据不存在");
// 创建Dataset
DataSet dsExport = new DataSet("Export");
DataTable dtExport = DetailsTable.Copy();
dtExport.TableName = "Values";
dsExport.Tables.Add(dtExport);
if (ColumnList.Length != sHeaders.Length)
throw new Exception("ExportColumn List与 Columns数据长度不一致");
else if (ColumnList.Length > dtExport.Columns.Count || sHeaders.Length > dtExport.Columns.Count)
throw new Exception("ExportColumn List超出 Columns数据");
// 获取字段名
string[] sFileds = new string[ColumnList.Length];
for (int i = 0; i < ColumnList.Length; i++)
{
if ((ColumnList[i] < 0) || (ColumnList[i] >= dtExport.Columns.Count))
throw new Exception("ExportColumn List不在Columns范围");
sFileds[i] = dtExport.Columns[ColumnList[i]].ColumnName;
}
return Export_with_XSLT_Windows(dsExport, sHeaders, sFileds, templePath);
}
catch (Exception Ex)
{
throw Ex;
}
}
#endregion
#region Export_with_XSLT_Windows
/// <summary>
/// 在windows方式下生成的Excel或csv文档方式
/// </summary>
/// <param name="dsExport">数据集</param>
/// <param name="sHeaders">列头</param>
/// <param name="sFileds">列字段</param>
/// <param name="templePath">格式化模板相对路径</param>>
private static string Export_with_XSLT_Windows(DataSet dsExport, string[] sHeaders, string[] sFileds, string templePath)
{
MemoryStream ms=null;
TextWriter tr = null;
System.IO.StringWriter sw = null;
try
{
// XSLT to use for transforming this dataset.
string xmlStr = CreateStylesheet(sHeaders, sFileds, templePath);
ms = new MemoryStream();
tr = new StreamWriter(ms, Encoding.Default);
tr.WriteLine(xmlStr);
tr.Flush();
ms.Flush();
ms.Seek(0, SeekOrigin.Begin);
XmlDataDocument xmlDoc = new XmlDataDocument(dsExport);
XslCompiledTransform xslTran = new XslCompiledTransform();
xslTran.Load(new XmlTextReader(ms), null, null);
sw = new System.IO.StringWriter();
xslTran.Transform(xmlDoc, null, sw);
xmlStr = sw.ToString().Replace("utf-16","GB2312");
return xmlStr;
}
catch (Exception Ex)
{
throw Ex;
}
finally
{
ms.Close();
tr.Close();
sw.Close();
}
}
#endregion
#region CreateStylesheet
/// <summary>
/// 读取模板将数据用xml方式存储
/// <param name="sHeaders">列头</param>
/// <param name="sFileds">列字段</param>
/// <param name="templePath">格式化模板相对路径</param>>
/// </summary>
private static string CreateStylesheet(string[] sHeaders, string[] sFileds, string templePath)
{
string absoluteSkinRootDirectoryName = Path.Combine(new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.FullName, templePath.Substring(0, templePath.LastIndexOf("\\")));
try
{
StringTemplateGroup templates = new StringTemplateGroup("test", absoluteSkinRootDirectoryName);
StringTemplate page1ST = templates.GetInstanceOf(Path.GetFileNameWithoutExtension(templePath));
for (int i = 0; i < sHeaders.Length;i++ )
{
page1ST.SetAttribute("colHead" + i.ToString(), sHeaders[i]);
}
for (int i = 0; i < sFileds.Length; i++)
{
page1ST.SetAttribute("colName" + i.ToString(), sFileds[i]);
}
return page1ST.ToString();
}
catch (Exception e)
{
throw new Exception("生成Excel文档错误!", e);
}
finally { }
}
#endregion
}
}
========================================================
此是一个Xslt模板文件
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns="urn:schemas-microsoft-com:office:spreadsheet">
<xsl:output method="xml" version="1.0" encoding="GB2312" indent="yes"/>
<xsl:template match="/">
<?mso-application prog ></xsl:value-of></Data></Cell>
</Row>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
cs下取的工程路径
new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.FullName