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

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

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

    C#導(dǎo)出Excel

    網(wǎng)上反應(yīng)比較強(qiáng)烈。本人也因?yàn)楣ぷ餍枰脑颍瑢⑵浞庋b了成了ExcelManager。企業(yè)當(dāng)中,做報(bào)表的數(shù)據(jù)來源肯定就是數(shù)據(jù)庫了。該ExcelManager目前只提供Ms Sql Server的支持,因?yàn)槲覀児臼褂玫木褪莔s sql server 2000 了。封裝后的ExcelManager,你只需傳入你的報(bào)表表頭(一級(jí)表頭、二級(jí)表頭。大部分有兩級(jí)也就夠了。如果你有多個(gè),可自行修改該類.),并將對(duì)應(yīng)的數(shù)據(jù)庫表字段傳入類庫中的方法DeclareExcelApp即可。
    同前一篇一樣,你可將下面代碼復(fù)制另存一個(gè)新類就可以了(不知為什么,我在家里上網(wǎng)老是傳附件不上來!faint...)。隨后,我會(huì)給出一個(gè)調(diào)用的方法的:
    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>
    ????????
    /// ?建構(gòu)函數(shù)
    ????????
    /// ? </summary>

    ???????? public ?ExcelManager(){}

    ????????
    /// ? <summary>

    ????????
    /// ?建構(gòu)函數(shù)
    ????????
    /// ? </summary>

    ????????
    /// ? <param?name="dbHL"> 一個(gè)Excel表格的最大記錄數(shù) </param>
    ????????
    /// ? <param?name="dbTotal"> 該數(shù)據(jù)庫表共查詢出多少條記錄 </param>
    ????????
    /// ? <param?name="intDivide"> 查詢出的記錄可分成幾個(gè)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>

    ????????
    /// ?建構(gòu)函數(shù)
    ????????
    /// ? </summary>

    ????????
    /// ? <param?name="dbHL"> 一個(gè)Excel表格的最大記錄數(shù) </param>
    ????????
    /// ? <param?name="strTableName"> 需查詢的數(shù)據(jù)庫的表名 </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>

    ????????
    /// ?取得總記錄數(shù)跟可分成幾個(gè)Excel?sheet.
    ????????
    /// ? </summary>

    ????????
    /// ? <param?name="strTableName"> 被查詢的數(shù)據(jù)庫的表名 </param>
    ????????
    /// ? <param?name="sqlConn"> sqlConnection </param>
    ????????
    /// ? <returns> 可分成Excel?Sheet的個(gè)數(shù) </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>

    ????????
    /// ?新建一個(gè)Excel實(shí)例
    ????????
    /// ? </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導(dǎo)出數(shù)據(jù)
    ????????
    /// ? </summary>

    ????????
    /// ? <param?name="intSheetNumber"> 導(dǎo)出第幾個(gè)sheet </param>
    ????????
    /// ? <param?name="blIsMoreThan"> 余下的數(shù)據(jù)是否大于指定的每個(gè)Sheet的最大記錄數(shù) </param>
    ????????
    /// ? <param?name="strTitle"> 表頭,需與查詢sql語句對(duì)齊一致。 </param>
    ????????
    /// ? <param?name="strSql"> 查詢的sql語句,表頭的文字需與該sql語句對(duì)齊一致。 </param>
    ????????
    /// ? <param?name="strTablName"> 查詢的表名 </param> ????
    ????????
    /// ? <param?name="strMastTitle"> 主標(biāo)題 </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
    );
    ????????}
    ????}
    }

    全盤復(fù)制另存新類后,調(diào)用方法示例如下:
    ???????? private ? void ?button2_Click( object ?sender,?EventArgs?e)
    ????????{
    ????????????
    #region ?ExcelManager封裝類導(dǎo)出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 []?{? " 編號(hào) " , " 供應(yīng)商編號(hào) " ?},? " ?OrderID,CustomerID? " ,? " Orders " ,? " 報(bào)表標(biāo)題 " );
    ????????????????
    // exc.SaveExcelApp();

    ????????????}
    ????????????
    catch
    (Exception?E)
    ????????????{
    ????????????????MessageBox.Show(E.ToString());
    ????????????}
    ????????????
    finally

    ????????????{
    ????????????????exc.Dispose();
    ????????????}
    ????????????
    #endregion
    ????????}?

    以上使用的是Excel 2002 英文版。2003有些方法稍有出入。可參照前篇的C#導(dǎo)出Excel源碼。另外,如果可能的話,我將封裝其它數(shù)據(jù)庫類型的Excel導(dǎo)出。有興趣的朋友,請(qǐng)繼續(xù)關(guān)繼!


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


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    <2006年10月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊(cè)

    收藏夾

    Java技術(shù)網(wǎng)站

    友情鏈接

    國內(nèi)一些開源網(wǎng)站

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 日本三级2019在线观看免费| 亚洲日本香蕉视频| 国产91在线免费| 国内精品免费麻豆网站91麻豆 | 午夜无码A级毛片免费视频| 免费精品视频在线| 在线观看亚洲AV每日更新无码| 亚洲国产精品久久久久网站 | 成年大片免费高清在线看黄| 亚洲一卡2卡3卡4卡乱码 在线| 婷婷亚洲久悠悠色悠在线播放| 亚洲国产精品一区二区第四页| 好男人视频社区精品免费| 91九色精品国产免费| 日韩插啊免费视频在线观看 | 国产成人涩涩涩视频在线观看免费| 久久精品一本到99热免费| 福利免费在线观看| 一级做a爰性色毛片免费| 久久亚洲中文无码咪咪爱| 亚洲熟妇无码AV不卡在线播放| 亚洲日韩乱码中文无码蜜桃| 亚洲av日韩av无码黑人| 亚洲女同成av人片在线观看 | 一本到卡二卡三卡免费高| 国产亚洲高清在线精品不卡| 蜜桃传媒一区二区亚洲AV | 免费a级毛片大学生免费观看| 免费看a级黄色片| 国产猛烈高潮尖叫视频免费| 四虎影视免费在线| 日韩中文无码有码免费视频 | 亚洲小视频在线观看| 亚洲AV本道一区二区三区四区| 国产亚洲无线码一区二区| 亚洲日韩av无码| 久久久久亚洲精品影视| 亚洲成av人影院| 亚洲v高清理论电影| 亚洲高清视频免费| 在线精品亚洲一区二区 |