亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

再現C#導出Excel源碼

2019-11-18 17:01:47
字體:
來源:轉載
供稿:網友

接我上一篇C#導出Excel源碼.
網上反應比較強烈。本人也因為工作需要的原因,將其封裝了成了ExcelManager。企業當中,做報表的數據來源肯定就是數據庫了。該ExcelManager目前只提供Ms Sql Server的支持,因為我們公司使用的就是ms sql server 2000 了。封裝后的ExcelManager,你只需傳入你的報表表頭(一級表頭、二級表頭。大部分有兩級也就夠了。如果你有多個,可自行修改該類.),并將對應的數據庫表字段傳入類庫中的方法DeclareExcelApp即可。
同前一篇一樣,你可將下面代碼復制另存一個新類就可以了(不知為什么,我在家里上網老是傳附件不上來!faint...)。隨后,我會給出一個調用的方法的:
namespace ExportToExcel
{
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    /***********************************************************************************
     ****Class Name :   ExcelManger
     ****Author:            KingNa
     ****Create Date :   2006-9-1
     ****CopyRight:     Reserve this info if you want to User this Class
    ***********************************************************************************/
    public class ExcelManager:IDisposable
    {
        Excel.Range m_objRange = null;
        Excel.application m_objExcel = null;
        Excel.Workbooks m_objBooks = null;
        Excel._Workbook m_objBook = null;
        Excel.Sheets m_objSheets = null;
        Excel._Worksheet m_objSheet = null;
        Excel.QueryTable m_objQryTable = null;
        object m_objOpt = System.Reflection.Missing.Value;
        //DataBase-used variable
        PRivate System.Data.SqlClient.SqlConnection sqlConn = null;
        private string strConnect = string.Empty;
        private System.Data.SqlClient.SqlCommand sqlCmd = null;

        //Sheets variable
        private double dbSheetSize = 65535;//the hight limit number in one sheet
        private int intSheetTotalSize = 0;//total record can divied sheet number
        private double dbTotalSize = 0;//record total number


        /// <summary>
        /// 建構函數
        /// </summary>
        public ExcelManager(){}

        /// <summary>
        /// 建構函數
        /// </summary>
        /// <param name="dbHL">一個Excel表格的最大記錄數</param>
        /// <param name="dbTotal">該數據庫表共查詢出多少條記錄</param>
        /// <param name="intDivide">查詢出的記錄可分成幾個Excel</param>
        /// <param name="conn">sqlConnection</param>
        public ExcelManager(Double dbHL,Double dbTotal,int intDivide,SqlConnection conn )
        {
            dbSheetSize = dbHL;
            intSheetTotalSize = intDivide;
            dbTotalSize = dbTotal;
            sqlConn = conn;
        }
        /// <summary>
        /// 建構函數
        /// </summary>
        /// <param name="dbHL">一個Excel表格的最大記錄數</param>
        /// <param name="strTableName">需查詢的數據庫的表名</param>
        /// <param name="conn">sqlConnection</param>
        public ExcelManager(Double dbHL,string strTableName,SqlConnection conn)
        {
            dbSheetSize = dbHL;
            sqlConn = conn;
            intSheetTotalSize = GetTotalSize(strTableName,sqlConn);
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        private void Dispose(bool disposing)
        {
            if(disposing)
            {
                // Dispose managed resources.
                Marshal.FinalReleaseComObject(m_objExcel);
                m_objRange = null;
                m_objSheet = null;
                m_objSheets = null;
                m_objBooks = null;
                m_objBook = null;
                m_objExcel = null;
            }
        }
        /// <summary>
        /// 取得總記錄數跟可分成幾個Excel sheet.
        /// </summary>
        /// <param name="strTableName">被查詢的數據庫的表名</param>
        /// <param name="sqlConn">sqlConnection</param>
        /// <returns>可分成Excel Sheet的個數</returns>
        private int GetTotalSize(string strTableName,SqlConnection sqlConn)
        {
            //sqlConn = new System.Data.SqlClient.SqlConnection(strConnect);
            sqlCmd = new System.Data.SqlClient.SqlCommand("Select Count(*) From "+strTableName, sqlConn);
            if(this.sqlConn.State == ConnectionState.Closed) sqlConn.Open();
            dbTotalSize = (int)sqlCmd.ExecuteScalar();
            sqlConn.Close();
            return (int)Math.Ceiling(dbTotalSize / this.dbSheetSize);
        }

        /// <summary>
        /// 新建一個Excel實例
        /// </summary>
        /// <param name="strTitle">Excel表頭上的文字</param>
        public void DeclareExcelApp(string[] strTitle,string strSql,string strTableName,string strMastTitle)
        {
            m_objExcel = new Excel.ApplicationClass();
            m_objExcel.Visible = true;
            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
            m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
            m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
            if (intSheetTotalSize <= 3)
            {
                if (this.dbTotalSize <= this.dbSheetSize)
                {
                    this.ExportDataByQueryTable(1, false,strTitle,strSql,strTableName,strMastTitle );
                    return;
                }
                else if (this.dbTotalSize <= this.dbSheetSize * 2)
                {
                    this.ExportDataByQueryTable(1, false,strTitle,strSql,strTableName,strMastTitle );
                    this.ExportDataByQueryTable(2, true,strTitle,strSql,strTableName,strMastTitle );
                    return;
                }
                else
                {
                    this.ExportDataByQueryTable(1, false,strTitle,strSql,strTableName,strMastTitle );
                    this.ExportDataByQueryTable(2, true,strTitle,strSql,strTableName,strMastTitle );
                    this.ExportDataByQueryTable(3, true,strTitle,strSql,strTableName,strMastTitle );
                    return;
                }
            }
            for (int i = 3; i < intSheetTotalSize; i++)
            {
                m_objSheets.Add(m_objOpt, m_objSheets.get_Item(i), m_objOpt, m_objOpt);
            }
            ExportDataByQueryTable(1, false,strTitle,strSql,strTableName,strMastTitle );
            for (int i = 2; i <= m_objSheets.Count; i++)
            {
                ExportDataByQueryTable(i, true,strTitle,strSql,strTableName,strMastTitle );
            }
        }
        /// <summary>
        /// 以用戶輸入的文件名保存文件
        /// </summary>
        public void SaveExcelApp()
        {
            string excelFileName = string.Empty;
            SaveFileDialog sf = new SaveFileDialog();
            sf.Filter = "*.xls|*.*";
            if (sf.ShowDialog() == DialogResult.OK)
            {
                excelFileName = sf.FileName;
            }
            else
            {
                return;
            }
            m_objBook.SaveAs(excelFileName, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt,
                Excel.XlSaveAsaccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt,m_objOpt);
            if (m_objExcel != null)
                m_objExcel = null;
        }
        /// <summary>
        /// 利用Excel的QueryTable導出數據
        /// </summary>
        /// <param name="intSheetNumber">導出第幾個sheet</param>
        /// <param name="blIsMoreThan">余下的數據是否大于指定的每個Sheet的最大記錄數</param>
        /// <param name="strTitle">表頭,需與查詢sql語句對齊一致。</param>
        /// <param name="strSql">查詢的sql語句,表頭的文字需與該sql語句對齊一致。</param>
        /// <param name="strTablName">查詢的表名</param>   
        /// <param name="strMastTitle">主標題</param>
        /// </summary>
        public void ExportDataByQueryTable(int intSheetNumber, bool blIsMoreThan,string[] strTitle,string strSql,string strTablName,string strMastTitle)
        {
            string strQuery = string.Empty;
            if (blIsMoreThan)
            {
                strQuery = "Select Top " +
                    this.dbSheetSize + strSql + "  From " + strTablName + " Where Not  OrderID In (Select Top " +
                    dbSheetSize * (intSheetNumber - 1) + "  OrderID From " + strTablName + ")";
            }
            else
            {
                strQuery = "Select Top " + this.dbSheetSize + strSql+ "  From "+strTablName;

            }
            m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(intSheetNumber));

            m_objSheet.Cells[1,1] = strMastTitle;
            m_objSheet.Cells[2,1] = "打印日期"+DateTime.Now.ToShortDateString();
            for(int i = 1;i<=strTitle.Length;i++)
            {
                m_objSheet.Cells[4,i] = strTitle[i-1].ToString();
            }
            m_objRange = m_objSheet.get_Range("A5", m_objOpt);
            m_objQryTable = m_objSheet.QueryTables.Add("OLEDB;Provider=SQLOLEDB.1;" + sqlConn.ConnectionString, m_objRange, strQuery);
            m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;
            m_objQryTable.FieldNames = false;
            m_objQryTable.Refresh(false);
        }
    }
}

全盤復制另存新類后,調用方法示例如下:
        private void button2_Click(object sender, EventArgs e)
        {
            #region ExcelManager封裝類導出Excel
            String strConnet ="Data Source='localhost';PassWord = ;User ID=sa;Initial Catalog=Northwind";
            System.Data.SqlClient.SqlConnection sqlConn =
                new System.Data.SqlClient.SqlConnection(strConnet);
            ExcelManager exc = new ExcelManager(65530, "Orders", sqlConn);
            try
            {
                exc.DeclareExcelApp(new string[] { "編號","供應商編號" }, " OrderID,CustomerID ", "Orders", "報表標題");
                //exc.SaveExcelApp();
            }
            catch(Exception E)
            {
                MessageBox.Show(E.ToString());
            }
            finally
            {
                exc.Dispose();
            }
            #endregion
        }
以上使用的是Excel 2002 英文版。2003有些方法稍有出入??蓞⒄涨捌腃#導出Excel源碼。另外,如果可能的話,我將封裝其它數據庫類型的Excel導出。有興趣的朋友,請繼續關繼!
http://www.49028c.com/jinliangliu/archive/2006/09/01/492633.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美在线看| 久久av在线看| 萌白酱国产一区二区| 亚洲影视九九影院在线观看| 精品中文字幕在线观看| 久久777国产线看观看精品| 岛国视频午夜一区免费在线观看| 欧美性猛交xxxx乱大交3| 欧美极品少妇xxxxⅹ裸体艺术| 午夜欧美大片免费观看| 国产999精品久久久| 日韩在线观看免费高清完整版| 性欧美视频videos6一9| 欧美激情aaaa| 国产亚洲福利一区| 欧美人与性动交a欧美精品| 亚洲国产成人精品久久久国产成人一区| 色狠狠av一区二区三区香蕉蜜桃| 久久夜色精品亚洲噜噜国产mv| 国产福利成人在线| 亚洲成人精品久久久| 久久免费精品日本久久中文字幕| 亚洲女人初尝黑人巨大| 久久成人亚洲精品| 欧美电影在线观看完整版| 欧美亚洲第一页| 欧美老女人在线视频| 亚洲精品不卡在线| 成人黄色在线观看| 成人女保姆的销魂服务| 国产日本欧美一区二区三区在线| 国产成人综合精品在线| 成人久久一区二区三区| 亚洲人成自拍网站| 精品久久久久久亚洲国产300| 成人黄色网免费| 欧美中文字幕在线| 九九热这里只有精品免费看| 97超级碰碰碰久久久| 久久福利视频网| 久久久精品一区二区三区| 美女久久久久久久久久久| 国产福利精品在线| 少妇av一区二区三区| 日韩av中文字幕在线播放| 欧美黑人狂野猛交老妇| 国产99久久精品一区二区| 亚洲精品国产电影| 91精品久久久久久久久中文字幕| 久久综合伊人77777蜜臀| 亚洲女同性videos| 精品国产视频在线| 日本免费在线精品| 久久久久国产精品免费网站| 欧美中文字幕在线视频| 色综合天天综合网国产成人网| 亚洲国产精品成人精品| 日本久久中文字幕| 4438全国亚洲精品在线观看视频| 亚洲欧美日韩一区二区三区在线| 日韩在线精品视频| 国产精品久久久久久亚洲调教| 欧美人交a欧美精品| 国产精品夜色7777狼人| 精品久久久精品| 欧美又大又硬又粗bbbbb| www.亚洲一二| 在线观看精品自拍私拍| 欧美视频在线观看免费| 1769国内精品视频在线播放| 亚洲毛片在线观看| 精品久久中文字幕| 国产综合久久久久| 欧美激情videoshd| 伊人久久男人天堂| 成人字幕网zmw| 高清一区二区三区日本久| 日韩最新av在线| 欧美激情一二区| 狠狠躁夜夜躁人人爽天天天天97| 精品国产一区久久久| 日韩欧美一区二区三区| www.亚洲免费视频| 亚洲欧美在线免费观看| 国产欧美精品va在线观看| 亚洲人成亚洲人成在线观看| 欧美日本黄视频| 久久久久国产精品免费网站| 亚洲欧洲一区二区三区久久| 国产精品一区二区女厕厕| 国产精品成人免费视频| 国产亚洲视频在线观看| 日韩精品极品视频免费观看| 国精产品一区一区三区有限在线| 国产精品视频一区二区高潮| 影音先锋欧美在线资源| 最近2019中文字幕大全第二页| 欧美极品少妇xxxxⅹ喷水| 欧美国产精品va在线观看| 日韩麻豆第一页| 中文字幕日韩免费视频| 欧美日韩国产一区中文午夜| 国产精品夫妻激情| 欧美一级片一区| 在线观看国产精品淫| 国产精品中文久久久久久久| 亚洲精品在线视频| 中文字幕亚洲欧美在线| 欧美午夜视频一区二区| 日日噜噜噜夜夜爽亚洲精品| 国产成人精品视频在线| 亚洲免费视频观看| 中文字幕欧美国内| 国产精品视频自拍| 少妇久久久久久| 成人激情免费在线| 亚洲乱码国产乱码精品精天堂| 丝袜美腿精品国产二区| 在线观看视频99| 国产成人精品综合| 欧美日韩性视频| 国产99久久精品一区二区永久免费| 久热99视频在线观看| 久久人人97超碰精品888| 韩国三级日本三级少妇99| 欧美日韩国产精品一区二区不卡中文| 91产国在线观看动作片喷水| 久久精品久久久久电影| 成人久久久久久| 一区二区三区视频免费| 在线电影欧美日韩一区二区私密| 久久人人看视频| 日韩免费在线免费观看| 岛国精品视频在线播放| 亚洲欧美在线免费| 不卡av在线网站| 国产精品一区二区三区毛片淫片| 国产丝袜一区视频在线观看| 欧洲午夜精品久久久| 日韩精品在线视频| 久久亚洲综合国产精品99麻豆精品福利| 亚洲精品日韩丝袜精品| 九九热精品视频| 国语自产精品视频在免费| 日韩av手机在线看| 亚洲第一中文字幕| 亚洲视频在线观看免费| 91地址最新发布| 欧美激情区在线播放| 欧美性猛交xxxx黑人猛交| 国产xxx69麻豆国语对白| 国内精品久久久久影院 日本资源| 国产精品黄色影片导航在线观看| 亚洲精品国产精品国自产观看浪潮| 久久亚洲一区二区三区四区五区高| 久久色在线播放| 欧美成人免费va影院高清| 亚洲一区二区三区四区视频| 精品视频偷偷看在线观看| 亚洲欧洲偷拍精品| 日韩不卡在线观看| 另类天堂视频在线观看| 成人在线视频福利| 国产精品美腿一区在线看|