使用Xml模版文檔導出Excel

该博客介绍了一种使用XML模板导出Excel的方法,通过创建Excel模板并保存为XML计算表,然后使用C#代码解析XML模板并替换特定字段,实现数据的动态导出。示例代码展示了如何创建和调用此功能,支持多个工作表的导入,并提供了一个简单的调用方法。
摘要由CSDN通过智能技术生成

/*
 * 功能﹕使用Xml模版文檔導出Excel-已經更親于2010-6-8 添加多個Sheet工作表的導入功能
 * 編寫人:盧定煥

 * 編寫時間:2008/10/25--已經更親于2010-6-8
 * 修改功能﹕

 * 修改人:
 * 修改時間:
 *
 *我在一些網站看到有人轉載我這個代碼.
 * 這里我給你們講一下這里的用法吧.
 *首先建立Excel表格,然後編輯你想在的格式表頭,,格式是你想要導出的數據的[字段名]來代替將要導入的數據,如:
 * [id] [name] [sex]  只有這些寫在同一行就可以了,其它的格式可以隨便寫;另一些特殊的參數,也就是單個數據。非表格內容的
 *用{0}這樣的格式寫,如同C#里的string.Format("{0}",5),本功能就是用這樣子來取代內容的。
 *
 *編完Excel之后我們將Excel保存成“XML計算表(*.XML)”在保存的格式選項里有
 *
 * 簡單調用方法如下:
 *  
*      ExportTo et = new ExportTo(@"D:/Inetpub/wwwroot/RecruiPerson/RecruitPerson/WebUILayer/ExcelTemplate/UsersInfo2.xml", this);
        et.XmlSelectDataTable("Sheet2 (2)", UsersRelationHandle.GetAllRecords(""), 5,6);
        et.XmlSelectDataTable("Sheet2", UsersRelationHandle.GetAllRecords(""), "A",8);
        et.ExportToExcel();
*如果看不懂請給我留言提問,我會給大家解答的
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Xml;
using System.IO;
using System.Data;
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Xml;
using System.IO;
using System.Data;
namespace Foxconn.BusinessLogicLayer.Comm
{
    /// <summary>
    /// 使用Xml模版文檔導出Excel
    /// </summary>
    public  partial  class ExportTo
    {
        private string m_strTemplateXmlPath = string.Empty;
        private XmlDocument mXmlDoc = new XmlDocument();
        private Page m_page =null;
        /// <summary>
        /// 初始化Xml模版文件,將Xml模版產生准備導出Excel使用的Xml文檔
        /// </summary>
        /// <param name="xmlPath">Xml模版文件路經﹐使用絕對路經</param>
        /// <param name="p">使用頁面</param>
        public ExportTo(string xmlPath,Page p)
        {
            m_strTemplateXmlPath = xmlPath;
            m_page = p;

            mXmlDoc.Load(m_strTemplateXmlPath);
        }

        public void XmlSelectDataTable(DataTable dt, params object[] pOthers)
        {
            XmlSelectDataTable("Sheet1", dt, pOthers);
        }
        /// <summary>
        /// Excel的Xml文檔開始接受DataTable及其它參數的設定,默認為對第一個WorkSheet操作,否測按用戶所給的WorkSheetName操作
        /// </summary>
        /// <param name="dt">DataTable數據﹐此數據的字段名稱與Excel的Xml文檔相對應,則輸出到Xml文檔中相應的字段</param>
        /// <param name="pOthers">Xml文檔其它參數格式與C#相同如string.format("{0}{1}{2}" ,para1,para2,para3),這里的pOthers接收para1,para2,para3</param>
        public   void XmlSelectDataTable(string pSheetName,DataTable dt, params object[] pOthers)
        {
            string TemXml = m_strTemplateXmlPath;
            //set Xml Doc
         
            //取得第一個sheet
            XmlNode XmlObjectWorkBook = null;
            XmlNode XmlObjectWorksheet = null;
            XmlNode XmlObjectTable = null;
            XmlObjectWorkBook = mXmlDoc.LastChild;
            if (XmlObjectWorkBook == null || XmlObjectWorkBook.Name != "Workbook")
            {
                XmlObjectWorkBook = GetChildObjectByName(mXmlDoc.ChildNodes, "Workbook");
            }
            XmlObjectWorksheet = XmlObjectWorkBook.LastChild;

            if (XmlObjectWorksheet == null || XmlObjectWorksheet.Name != "Worksheet" || XmlObjectWorksheet.Attributes[0].Value.ToUpper().Trim() != pSheetName.ToUpper().Trim())
            {
                XmlObjectWorksheet = GetWorksheetByName(XmlObjectWorkBook.ChildNodes, pSheetName);
            }

            XmlObjectTable = GetChildObjectByName(XmlObjectWorksheet.ChildNodes, "Table");


            ResetExcelObject(XmlObjectTable, dt);

            //參數為{n}的格式化
            if (pOthers.Length > 0)
            {
                try
                {
                    XmlObjectWorksheet.InnerXml = string.Format(XmlObjectWorksheet.InnerXml, pOthers);
                }
                catch
                {

                }
            }
         
        }

        private XmlNode GetWorksheetByName(XmlNodeList pChildNodes, string pSheetName)
        {
            
            XmlNode XmlObjectWorksheet = null;
            foreach (XmlNode n in pChildNodes)
            {
                if (n.Name == "Worksheet" && n.Attributes[0].Value.ToUpper().Trim() == pSheetName.ToUpper().Trim())
                {
                    XmlObjectWorksheet = n;
                }
            }
            return XmlObjectWorksheet;
        }
        private XmlNode GetChildObjectByName(XmlNodeList pChildNodes, string pName)
        {
            XmlNode XmlObject = null;
                foreach (XmlNode n in pChildNodes)
                {
                    if (n.Name == pName)
                    {
                        XmlObject = n;
                        break;
                    }
                }
           
            return XmlObject;
        }

        /*
         * 創建時間 09/8/27 修改人:吳星
         */
        /// <summary>
        /// 將XmlDocument存儲到指定URL地址和文件格式
        /// </summary>
        /// <param name="s"></param>
        public void SaveToExcel(string s)
        {
            mXmlDoc.Save(s);
        }
        private void ResetExcelObject(XmlNode XmlObjectTable, DataTable dt)
        {
            string _strColFormat = "yyyy/MM/dd";
            //取得行

            XmlNodeList XmlObjectTableRows = XmlObjectTable.ChildNodes;
            //產生行

            XmlNode XmlCreateRow = null;
            //取得行值

            int iRowCount = int.Parse(XmlObjectTable.Attributes[1].Value);
            //保存行值

            int iRow = iRowCount;
            for (int i = 0; i < iRow; i++)
            {
                //搜索到行
                if (XmlObjectTableRows[i].Name == "Row")
                {
                    //搜索到行內帶有[的

                    int indx = XmlObjectTableRows[i].InnerXml.IndexOf("[");
                    if (indx > 0)
                    {
                        for (int j = 0; j < dt.Rows.Count; j++)
                        {   //產生副本的行結點
                            bool _isTrue = false;
                             XmlCreateRow = XmlObjectTableRows[i].Clone();
                             XmlAttribute xmlat = XmlCreateRow.Attributes["ss:Index"];
                             if (xmlat != null&&j>0)
                                 XmlCreateRow.Attributes.Remove(xmlat);
                             for (int ixmlc = 0; ixmlc < XmlCreateRow.ChildNodes.Count; ixmlc++)
                             {
                                 int _startIndex = 0;
                                 _startIndex = XmlCreateRow.ChildNodes[ixmlc].InnerText.IndexOf("[");
                                 //排除不帶有[符號的單元格
                                 if (_startIndex < 0)
                                     continue;
                                 int _endIndex = 0;
                                 string ComName = string.Empty;
                                 _endIndex = XmlCreateRow.ChildNodes[ixmlc].InnerText.IndexOf("]");
                                 //排除不帶]符號的單元格
                                 if (_endIndex < 0)
                                     continue;
                               string  CName = XmlCreateRow.ChildNodes[ixmlc].InnerText.Substring(_startIndex + 1, _endIndex - _startIndex - 1);
                               string[] cs = CName.Split('|');
                                 ComName = cs[0];
                                 if (cs.Length > 1)
                                 {
                                     _strColFormat = cs[1];

                                     XmlCreateRow.ChildNodes[ixmlc].ChildNodes[0].InnerText = XmlCreateRow.ChildNodes[ixmlc].ChildNodes[0].InnerText.Replace(CName, ComName);
                                 }
                                 //排除不是表內字段的單元格
                                 if (dt.Columns.IndexOf(ComName.Trim()) < 0)
                                     continue;
                                 //給單元格賦值

                                 string _strDataCellText = dt.Rows[j][ComName].ToString();
                                 switch (dt.Columns[ComName].DataType.Name)
                                 {
                                     case "DateTime":
                                         try
                                         {  if(dt.Rows[j][ComName].ToString().Trim()!="")
                                             _strDataCellText = DateTime.Parse(dt.Rows[j][ComName].ToString().Trim()).ToString(_strColFormat);
                                         }
                                         catch { }
                                         break;
                                 }
                                 XmlCreateRow.ChildNodes[ixmlc].ChildNodes[0].InnerText = XmlCreateRow.ChildNodes[ixmlc].ChildNodes[0].InnerText.Replace("[" + ComName + "]", _strDataCellText.Trim());
                                 _isTrue = true;
                             }
                            //產生行排除沒有數據需要替代的
                             if (!_isTrue)
                                 break;
                            //把副本放入表中,放到數據行的下面
                            XmlObjectTable.InsertAfter(XmlCreateRow, XmlObjectTableRows[i+j]);
                            iRowCount++;//表內行增加

                            XmlObjectTable.Attributes[1].Value = iRowCount.ToString();

                        }
                        //完成后刪除么內為[]這個符號的行

                        XmlObjectTable.RemoveChild( XmlObjectTableRows[i]);
                        break;
                    }
                }
                else
                {//因為行name不為Row的結點要遍歷所以把搜索值增加

                    iRow++;
                }
            }
        }
        /// <summary>
        /// 立即導出Excel文檔
        /// </summary>
        public void ExportToExcel()
        {
            ExportToExcel("record.xls");
        }
        /// <summary>
        /// 一般方式直接導出Excel,默認的WorkSheet是第一個,否則按所給的WorkSheetName
        /// </summary>
        /// <param name="p">調用方法頁面</param>
        /// <param name="xmlPath">Xml文檔的絕對路經</param>
        /// <param name="dt">要寫入導出Excel文檔的DataTable數據</param>
        /// <param name="pOthers">其它參數﹐注﹕參數個數要與Xml模版的參數個數相同</param>
        public static void ExportToExcel(Page p, string xmlPath, DataTable dt, params object[] pOthers)
        {
            ExportTo et = new ExportTo(xmlPath, p);
            et.XmlSelectDataTable(dt, pOthers);
            et.ExportToExcel();
        }
        /// <summary>
        ///  一般方式直接導出Excel,默認的WorkSheet是第一個,否則按所給的WorkSheetName
        /// </summary>
        ///<param name="pWorksheetName">導出時的所要寫入數據的WorkSheet</param>
        /// <param name="p">調用方法頁面</param>
        /// <param name="xmlPath">Xml文檔的絕對路經</param>
        /// <param name="dt">要寫入導出Excel文檔的DataTable數據</param>
        /// <param name="pOthers">其它參數﹐注﹕參數個數要與Xml模版的參數個數相同</param>
        public static void ExportToExcelWithWorksheetName(Page p, string xmlPath, string pWorksheetName, DataTable dt, params object[] pOthers)
        {
            ExportTo et = new ExportTo(xmlPath, p);
            et.XmlSelectDataTable(pWorksheetName,dt, pOthers);
            et.ExportToExcel();
        }
        public void ExportToExcel(string pExcelName)
        {
            if (mXmlDoc == null) return;
            if (!pExcelName.ToLower().EndsWith(".xls"))
            {
                pExcelName = pExcelName + ".xls";
            }
            m_page.Response.AddHeader("content-disposition", "attachment; filename=" + pExcelName + "");
            m_page.Response.ContentType = "application/vnd.ms-excel";
            m_page.Response.Write(mXmlDoc.InnerXml);
            m_page.Response.End();
        }
    }

 

}

 

Excel模版格式制作如下图

 

 

然后另存格式

 

这是导出后的格式

 

 

 

 

现在最新更新已上传到我的资源,里面还有个例子

资源下载地址

http://d.download.csdn.net/down/2710026/gs0038

 

 爱情公寓第四季

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值