<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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有些方法稍有出入。可參照前篇的C#導出Excel源碼。另外,如果可能的話,我將封裝其它數據庫類型的Excel導出。有興趣的朋友,請繼續關繼!


    posted on 2006-10-07 13:41 nbt 閱讀(895) 評論(0)  編輯  收藏 所屬分類: .Net技術


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2006年10月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    導航

    統計

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    收藏夾

    Java技術網站

    友情鏈接

    國內一些開源網站

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费看男人j放进女人j免费看| 日亚毛片免费乱码不卡一区| 免费黄色大片网站| 免费福利在线观看| 亚洲国产日韩一区高清在线| 日韩在线免费视频| 爱情岛论坛免费视频| 国产亚洲成av片在线观看| 国产免费女女脚奴视频网| 爱情岛亚洲论坛在线观看| 亚洲国产另类久久久精品黑人| 在线观看免费视频资源| 视频一区在线免费观看| 久久亚洲私人国产精品vA | 亚洲国产美女精品久久久| 亚洲国产精品一区二区三区久久 | 日本在线免费观看| 久久亚洲精品成人无码| 亚洲AV永久无码精品一百度影院| 无码人妻精品中文字幕免费东京热| 白白色免费在线视频| 亚洲高清视频免费| 亚洲国产成人久久综合一区77| 四虎免费影院ww4164h| 久久久WWW成人免费精品| 亚洲三级在线免费观看| 久久激情亚洲精品无码?V| 国产在线国偷精品产拍免费| a色毛片免费视频| 日韩欧美亚洲国产精品字幕久久久 | 97无码人妻福利免费公开在线视频 | 尤物永久免费AV无码网站| 欧洲精品99毛片免费高清观看| 老子影院午夜伦不卡亚洲| 亚洲午夜电影在线观看高清 | 免费a在线观看播放| 黄色片在线免费观看| 午夜免费福利片观看| www免费黄色网| 国产精品自拍亚洲| 亚洲最大中文字幕无码网站|