此技术需求:
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

相关文章:

  • 2021-11-26
  • 2022-01-10
  • 2021-07-08
  • 2021-11-16
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-19
  • 2022-12-23
  • 2022-12-23
  • 2021-07-06
  • 2022-02-09
  • 2022-12-23
  • 2021-09-04
相关资源
相似解决方案