【C# winfrom】datagrid导出为excel、html、xml、xslt源码123

来源:百度文库 编辑:神马文学网 时间:2024/04/29 10:48:03
转自:江边孤鸟 http://blog.csdn.net/jbgh608/
1、添加Excel引用

2、编写导出方法
using System;
using System.Windows.Forms;
using System.Diagnostics;
using XcjwHIS.PubicBaseClasses;
using System.Data;
using System.IO;
using System.Xml;
using System.Text;

namespace 江边孤鸟 http://blog.csdn.net/jbgh608/

...{
    /**//// 
    /// DataGrid、报表 导出为Excel文件,XML文件
    /// add by hxc20070830 who‘s email is jbgh608@163.com
    /// 

    public class ExportDataGrid
    ...{
        /**//// 
        /// 源DataGrid
        /// 

        private DataGrid ExportGrid;
        /**//// 
        /// 调用窗口
        /// 

        private Form ParentWindow=null;

        private DataTable mytb;
        /**//// 
        /// DataGrid 导出 Excel文件
        /// 

        /// 父亲窗口
        /// 要导出的DataGrid
        public ExportDataGrid(Form parentWindow,DataGrid grid)
        ...{
            ExportGrid=grid;
            ParentWindow= parentWindow;
        }
        /**//// 
        /// 报表导出为Excel文件
        /// 

        /// 父亲窗口
        /// 数据源
        public ExportDataGrid(Form parentWindow,DataSet ds)
        ...{
            mytb=ds.Tables[0].Copy();
            ParentWindow= parentWindow;
        }
        保存对话框#region 保存对话框
        /**//// 
        /// 导出文件
        /// 

        /// 文件类型 1 Excel ;2 xml and html
        public void SaveFileDialog(int ExportType)
        ...{
            string localFilePath,fileNameExt,newFileName,FilePath;
            SaveFileDialog sfd = new SaveFileDialog ( ) ;
            sfd.AddExtension=true;
            sfd.Filter= " txt files(*.xls)|*.xls|All files(*.*)|*.*"  ;
            sfd.FilterIndex = 2  ;
            sfd.RestoreDirectory = true  ;
            if ( sfd.ShowDialog ( ) == DialogResult.OK )
            ...{
                localFilePath=sfd.FileName.ToString();
                fileNameExt = localFilePath.Substring(localFilePath.LastIndexOf("\") + 1);
                FilePath= localFilePath.Substring(0,localFilePath.LastIndexOf("\") );
                newFileName = DateTime.Now.ToString("yyyyMMdd") + fileNameExt;
                this.ParentWindow.Cursor=new Cursor(Constant.ApplicationDirectory+"\wait.cur");
                //this.ParentWindow.Cursor=PublicStaticFun.GetCursor("Xc_db_rygl.wait.cur",GetType());
                switch( ExportType)
                ...{
                        //江边孤鸟 http://blog.csdn.net/jbgh608/
                    case 1:
                        ExportExcel(FilePath+"\"+newFileName,fileNameExt);
                        break;
                    case 2:
                        ExportHtml( FilePath+"\"+newFileName,fileNameExt);
                        ExportXslt(fileNameExt);
                        ExportXml(FilePath+"\"+newFileName,fileNameExt);
                        break;
                }

            }
        }

        #endregion

        导出Excel#region 导出Excel
        /**//// 
        /// 导出Excel
        /// 

        /// 文件路径
        /// 表头
        /// 
        public bool ExportExcel(string FilePath,string p_ReportName)
        ...{
            if ( this.ExportGrid.TableStyles.Count == 0 ) return false;
            DataGridTableStyle ts = this.ExportGrid.TableStyles[0];

            // 创建Excel对象
            Excel.Application xlApp = new Excel.ApplicationClass();
            if ( xlApp == null )
            ...{
                MessageBox.Show("Excel无法启动");
                return false;
            }
            // 创建Excel工作薄
            Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
            Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets[1];

            // 设置标题
            Excel.Range range = xlSheet.get_Range(xlApp.Cells[1,1],xlApp.Cells[1,ts.GridColumnStyles.Count]);
            range.MergeCells = true;
            xlApp.ActiveCell.FormulaR1C1 = p_ReportName;
            xlApp.ActiveCell.Font.Size = 20;
            xlApp.ActiveCell.Font.Bold = true;
            xlApp.ActiveCell.HorizontalAlignment = Excel.Constants.xlCenter;

            // 列索引,行索引,总列数,总行数
            int colIndex = 0;
            int RowIndex = 0;
            int colCount = ts.GridColumnStyles.Count;
            int RowCount = this.ParentWindow.BindingContext[this.ExportGrid.DataSource,this.ExportGrid.DataMember].Count;

            // 创建缓存数据
            object[,] objData = new object[RowCount + 1, colCount ];
            // 获取列标题
            foreach(DataGridColumnStyle cs in ts.GridColumnStyles)
            ...{
                objData[RowIndex,colIndex++] = cs.HeaderText;
            }
            // 获取数据
            for(RowIndex =1;RowIndex<=RowCount;RowIndex++)
            ...{
                for(colIndex=0;colIndex < colCount;colIndex++)
                ...{
                    objData[RowIndex,colIndex] = this.ExportGrid[RowIndex-1,colIndex].ToString();
                }
                Application.DoEvents();
            }
            // 写入Excel
            xlApp.get_Range(xlApp.Cells[2,   1],   xlApp.Cells[2,   colIndex]).Font.Bold   =   true;
            range = xlSheet.get_Range(xlApp.Cells[2,1],xlApp.Cells[RowCount+2,colCount]);
            range.Value2 = objData;

            // 保存
            try
            ...{
                xlApp.Cells.EntireColumn.AutoFit();
                xlApp.Cells.VerticalAlignment   =   Excel.Constants.xlCenter;
                xlApp.Cells.HorizontalAlignment   =   Excel.Constants.xlCenter;
                //xlApp.Visible   =   true;
                xlBook.Saved  = true;
                xlBook.SaveCopyAs(FilePath + ".xls");
            }
            catch
            ...{
                MessageBox.Show("保存出错,请检查!");
                return false;
            }
            finally
            ...{
                xlApp.Quit();
                GC.Collect();
                KillProcess("excel") ;
                this.ParentWindow.Cursor=Cursors.Default;
            }
            return true;
        }
        #endregion

        杀死进程#region 杀死进程
        private void KillProcess(string processName)
        ...{
            System.Diagnostics.Process myproc= new System.Diagnostics.Process();
            //得到所有打开的进程
            try
            ...{
                foreach (Process thisproc in Process.GetProcessesByName(processName))
                ...{
                    thisproc.Kill();
                }
            }
            catch(Exception Exc)
            ...{
                throw new Exception("",Exc);
            }
        }
        #endregion

        导出Xml#region 导出Xml
        /**//// 
        /// datagrid导出xml
        /// 

        /// 保存路径
        /// 文件名称
        /// 
        private bool ExportXml(string FilePath,string p_ReportName)
        ...{
            string path=Constant.ApplicationDirectory+"\xml\"+p_ReportName+".xslt";
            string  PItext   ="type=‘text/xsl‘ href=‘"+path+"‘";
            DataSet ds=new DataSet();
            try
            ...{
                DataTable tb = (DataTable)this.ExportGrid.DataSource;
                DataTable ExportTb=tb.Copy();
                ds.Tables.Add(ExportTb);
                XmlTextReader XTReader = new XmlTextReader(ds.GetXml(),XmlNodeType.Element,null);
                XmlTextWriter XTWriter = new XmlTextWriter(FilePath+".xml",Encoding.UTF8);
                XTWriter.WriteStartDocument();
                XTWriter.WriteProcessingInstruction("xml-stylesheet",PItext);
                string fieldName = "" ;
                while(XTReader.Read())
                ...{
                    switch(XTReader.NodeType)
                    ...{
                        case XmlNodeType.Element:
                            XTWriter.WriteStartElement(XTReader.Name);
                            fieldName = XTReader.Name;
                            break;
                        case XmlNodeType.Text:
                            if(fieldName.ToLower() == "brithday"||fieldName.ToLower() == "gzsj"||fieldName.ToLower() == "rdsj"||fieldName.ToLower() == "zzsj")
                            ...{
                                DateTime dt = DateTime.Parse (XTReader.Value.ToString());
                                XTWriter.WriteString(dt.ToString("yyyy-MM-dd"));
                            }
                            else
                                XTWriter.WriteString(XTReader.Value);
                            break;
                        case XmlNodeType.EndElement:
                            XTWriter.WriteEndElement();
                            break;
                        default:
                            break;
                    }
                }
                XTWriter.Close();
                this.ParentWindow.Cursor=Cursors.Default;
            }
            catch
            ...{
                MessageBox.Show("保存出错,请检查!");
                return false;
            }
            finally
            ...{
                //GC.Collect();
                //ds.Clear();
                //ds.Dispose();
            }
            return true;
        }
        #endregion

        导出Xslt#region 导出Xslt
        /**//// 
        /// 导出xslt样式
        /// 

        /// 文件名称
        private void ExportXslt( string p_ReportName )
        ...{
            DataGrid d=this.ExportGrid;
            string fileName=Constant.ApplicationDirectory+"\xml\"+p_ReportName+".xslt";
            string title =p_ReportName;
            string s1=" ";
            string  s2=" ";
            string s3=" "+title+" "+title+" ";
            string s4=" ";
            string s5=string.Empty;
            string s6=" ";
            string s7=string.Empty;
            string s8=" ";
            try
            ...{
                foreach( DataGridColumnStyle gc in d.TableStyles[0].GridColumnStyles )
                ...{
                    s5 += "" + gc.HeaderText + " ";
                }
                foreach( DataGridColumnStyle gc in d.TableStyles[0].GridColumnStyles )
                ...{
                    s7 += " ";
                }
                string sXslt=s1+s2+s3+s4+s5+s6+s7+s8;
                Stream stream =File.OpenWrite(fileName);
                using(StreamWriter writer =new StreamWriter(stream))
                ...{
                    writer.Write(sXslt);
                }
            }
            catch(Exception e)
            ...{
                MessageBox.Show(e.Message+" "+e.StackTrace+" "+e.Source);
            }

        }
        #endregion

        导出html#region 导出html
        /**//// 
        /// datagrid导出html
        /// 

        /// 保存路径
        /// 名称
        public  void ExportHtml( string FilePath,string p_ReportName)
        ...{
            DataGrid d =this.ExportGrid;
            DataTable dt = d.DataSource as DataTable;
            string path =FilePath+".html";
            string title =p_ReportName;
            string s1 =  "" + title ;<br><img style='max-width:300px;' id="img360" src="http://image2.360doc.cn/DownloadImg/2008/11/5/80136_1880450_7.gif" />            string s2 =  "" + "" +title+"";
            string s3 = string.Empty;
            string s4= "";
            if( dt == null || dt.Rows.Count == 0 ) return;
            int len = d.TableStyles[0].GridColumnStyles.Count;
            foreach( DataGridColumnStyle gc in d.TableStyles[0].GridColumnStyles )
            ...{
                s2 += "" + gc.HeaderText + "";
            }
            foreach( DataRow dr in dt.Rows )
            ...{
                s3 += "";
                for( int i = 0; i < len; i ++ )
                ...{
                    s3 += "" + dr[ i ].ToString() + "";
                }
                s3 += "";
            }
            string s = s1 + s2 + s3 + s4;
            try
            ...{
                using( FileStream fs = File.Create( path ) )
                ...{
                    using( StreamWriter sw = new StreamWriter( fs ) )
                    ...{
                        sw.Write( s );
                    }
                }
            }
            catch( Exception ex )
            ...{
                MessageBox.Show( ex.Message + " " + ex.StackTrace + " " + ex.Source );
            }
        }
        #endregion
    }
}