DataTable或者DataSet匯出Excel

因为工作上 有需要要求数据汇出Excel,所以参考了网上一些内容自己整理的代码如下,主要是实现DataTable/DataSet汇出Excel,同时保证不会影响客户原来自己的Excel操作。主要使用垃圾回收已经Office的Dll文件。

ContractedBlock.gif ExpandedBlockStart.gif Code
  1using System;
  2using System.Collections.Generic;
  3using System.Linq;
  4using System.Text;
  5using System.Windows.Forms;
  6using System.Reflection;
  7using System.Threading;
  8using Microsoft.Office.Interop.Excel;
  9
 10namespace Gmrbrian.Components
 11ExpandedBlockStart.gifContractedBlock.gif{
 12ContractedSubBlock.gifExpandedSubBlockStart.gif    匯出文件類#region 匯出文件類
 13
 14    public static class DataExport
 15ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 16        private static Microsoft.Office.Interop.Excel.ApplicationClass ObjExcel = null;
 17        private static Microsoft.Office.Interop.Excel.Workbook ObjWorkBook = null;
 18        private static Workbooks ObjWorkBooks = null;
 19        private static Sheets ObjSheets = null;
 20        private static object ObjMissing = System.Reflection.Missing.Value;
 21
 22ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
 23        /// 單表匯出Excel
 24        /// </summary>
 25        /// <param name="AColumnTitle">需要自定義table的ColumnTitle</param>
 26        /// <param name="ATable">輸出表</param>
 27        /// <param name="ASaveFileName">保存文件名包含路徑</param>

 28        public static void ExportToExcel(List<string> AColumnTitle, System.Data.DataTable ATable, string ASaveFileName)
 29ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 30            CreateExcelObject();
 31            if (AColumnTitle == null)
 32ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 33                ExportToExcel(ATable, (Worksheet)ObjWorkBook.ActiveSheet);
 34            }

 35            else
 36ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 37                FillExcelColumnTitle(AColumnTitle, (Worksheet)ObjWorkBook.ActiveSheet);
 38                FillExcelData(ATable, (Worksheet)ObjWorkBook.ActiveSheet);
 39            }

 40            SaveExcelFile(ASaveFileName);
 41        }

 42
 43ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
 44        /// 整個Dataset匯出Excel
 45        /// </summary>
 46        /// <param name="ADataSet"></param>
 47        /// <param name="ASaveFileName"></param>

 48        public static void ExportToExcel(System.Data.DataSet ADataSet, string ASaveFileName)
 49ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 50            CreateExcelObject();
 51
 52            if (ADataSet == null || ADataSet.Tables.Count <= 0)
 53                return;
 54            CreateExcelSheets(ADataSet.Tables.Count);
 55            for (int i = 0; i < ADataSet.Tables.Count; i++)
 56ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 57                ExportToExcel(ADataSet.Tables[i], ((Worksheet)ObjSheets.get_Item(i + 1)));
 58            }

 59
 60            SaveExcelFile(ASaveFileName);
 61        }

 62
 63ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
 64        /// 默認直接填充表內容
 65        /// </summary>
 66        /// <param name="ATable"></param>
 67        /// <param name="AWorkSheet"></param>

 68        private static void ExportToExcel(System.Data.DataTable ATable, Worksheet AWorkSheet)
 69ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 70            AWorkSheet.Name = ATable.TableName;
 71            for (int i = 0; i < ATable.Columns.Count; i++)
 72ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 73                AWorkSheet.Cells[1, i + 1= ATable.Columns[i].Caption;
 74            }

 75            for (int i = 0; i < ATable.Rows.Count; i++)
 76ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 77                for (int j = 0; j < ATable.Columns.Count; j++)
 78ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 79                    AWorkSheet.Cells[2 + i, j + 1= ATable.Rows[i][j].ToString();
 80                }

 81            }

 82        }

 83
 84        private static void FillExcelData(System.Data.DataTable ATable, Worksheet AWorkSheet)
 85ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 86            if (ATable.TableName.Length > 0)
 87                AWorkSheet.Name = ATable.TableName;
 88            for (int i = 0; i < ATable.Rows.Count; i++)
 89ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 90                for (int j = 0; j < ATable.Columns.Count; j++)
 91ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 92                    AWorkSheet.Cells[2 + i, j + 1= ATable.Rows[i][j].ToString();
 93                }

 94            }

 95        }

 96
 97        private static void FillExcelColumnTitle(List<string> AListStr,Worksheet AWorkSheet)
 98ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 99            for (int i = 0; i < AListStr.Count; i++)
100ExpandedSubBlockStart.gifContractedSubBlock.gif            {
101                AWorkSheet.Cells[1, i + 1= AListStr[i];
102            }

103        }

104
105        public static int CreateExcelSheets(int ACount)
106ExpandedSubBlockStart.gifContractedSubBlock.gif        {
107            CreateExcelObject();
108            if (ACount >= 3)
109ExpandedSubBlockStart.gifContractedSubBlock.gif            {
110                for (int i = 3; i < ACount; i++)
111ExpandedSubBlockStart.gifContractedSubBlock.gif                {
112                    ObjSheets.Add(ObjMissing, ObjSheets.get_Item(i), ObjMissing, ObjMissing);
113                }

114            }

115            return ObjSheets.Count;
116        }

117
118        private static void CreateExcelObject()
119ExpandedSubBlockStart.gifContractedSubBlock.gif        {
120            if (ObjSheets == null)
121ExpandedSubBlockStart.gifContractedSubBlock.gif            {
122                ObjExcel = new Microsoft.Office.Interop.Excel.ApplicationClass();
123                ObjWorkBooks = ObjExcel.Workbooks;
124                ObjWorkBook = ObjWorkBooks.Add(ObjMissing);
125                ObjSheets = ObjWorkBook.Worksheets;
126            }

127        }

128    
129        private static void SaveExcelFile(string AFileName)
130ExpandedSubBlockStart.gifContractedSubBlock.gif        {
131            SaveFileDialog sfd = new SaveFileDialog();
132            sfd.Filter = "*.xls|*.*";
133            sfd.FileName = AFileName;
134            if (sfd.ShowDialog() == DialogResult.OK)
135ExpandedSubBlockStart.gifContractedSubBlock.gif            {
136                ObjWorkBook.Close(true, AFileName, ObjMissing);
137            }

138            ObjExcel.Quit();
139            ClearExcelObject();
140            
141        }

142
143        private static void ClearExcelObject()
144ExpandedSubBlockStart.gifContractedSubBlock.gif        {
145            System.Runtime.InteropServices.Marshal.ReleaseComObject(ObjSheets);//xlsheet为表
146            System.Runtime.InteropServices.Marshal.ReleaseComObject(ObjWorkBook);//xlwb为工作簿
147            System.Runtime.InteropServices.Marshal.ReleaseComObject(ObjWorkBooks);//xlwb为工作簿
148            System.Runtime.InteropServices.Marshal.ReleaseComObject(ObjExcel);//xlapp为excel应用程序
149            ObjExcel = null;
150            ObjWorkBook = null;
151            ObjWorkBooks = null;
152            ObjSheets = null;
153            GC.Collect();    //垃圾回收會自動刪除該進程
154        }

155
156        public static void Test()
157ExpandedSubBlockStart.gifContractedSubBlock.gif        {
158            CreateExcelObject();
159            CreateExcelSheets(10);
160            SaveExcelFile("D:\\Test.xls");
161            //KillExcelProcess();
162        }

163
164ContractedSubBlock.gifExpandedSubBlockStart.gif        以后可能會用到Function#region 以后可能會用到Function
165ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
166        /// 太暴力會把用戶錯殺所有的Excel進程
167        /// </summary>

168        private static void KillExcelProcess()
169ExpandedSubBlockStart.gifContractedSubBlock.gif        {
170            foreach (System.Diagnostics.Process xlProcess in System.Diagnostics.Process.GetProcesses())
171ExpandedSubBlockStart.gifContractedSubBlock.gif            {
172                if (xlProcess.ProcessName.ToUpper().Equals("EXCEL"))
173ExpandedSubBlockStart.gifContractedSubBlock.gif                {
174                    //结束 excel 进程 
175                    xlProcess.Kill();
176                }

177            }

178
179        }

180
181ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
182        /// 只是使用反射原理調用Excel沒有實用價值
183        /// </summary>

184        private static void InvokeExcelObject()
185ExpandedSubBlockStart.gifContractedSubBlock.gif        {
186            if (ObjSheets == null)
187ExpandedSubBlockStart.gifContractedSubBlock.gif            {
188                try
189ExpandedSubBlockStart.gifContractedSubBlock.gif                {
190                    Type tExcel = Type.GetTypeFromProgID("Excel.Application");
191                    ObjExcel = (ApplicationClass)Activator.CreateInstance(tExcel);
192                    ObjWorkBooks = (Workbooks)ObjExcel.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, ObjExcel, null);
193                    ObjWorkBook = (Workbook)ObjWorkBooks.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, ObjWorkBooks, null);
194                    ObjSheets = (Sheets)ObjWorkBook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, ObjWorkBook, null);
195ExpandedSubBlockStart.gifContractedSubBlock.gif                    tExcel.InvokeMember("Visible", BindingFlags.SetProperty, null, ObjExcel, new object[] true });
196                }

197                catch (Exception E)
198ExpandedSubBlockStart.gifContractedSubBlock.gif                {
199
200                }

201                finally
202ExpandedSubBlockStart.gifContractedSubBlock.gif                {
203                    Thread.Sleep(500);
204                }

205            }

206        }

207        #endregion
 
208
209    }

210    #endregion

211}

212

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值