• <tfoot id="ukgsw"><input id="ukgsw"></input></tfoot>
    
    • 久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
      分享

      在 ASP.NET 中進(jìn)行 EXCEL 開(kāi)發(fā)

       趨明 2012-03-28

      在 ASP.NET 中進(jìn)行 EXCEL 開(kāi)發(fā)

      在顯示大量數(shù)據(jù)的時(shí)候,使用 EXCEL 無(wú)疑是一個(gè)很好的選擇,以網(wǎng)格為基本的數(shù)據(jù)單元,配合上眾多的計(jì)算公式和顏色、線條可以組成功能強(qiáng)大而美觀的數(shù)據(jù)報(bào)表。 在現(xiàn)代企業(yè)中,這種應(yīng)用也是最為廣泛的。因此在 Web 項(xiàng)目中,生成并輸出 EXCEL 報(bào)表也成了非常常見(jiàn)的功能。 但是,在 ASP.NET 中使用 EXCEL 卻一直存在著以 EXCEL 進(jìn)程無(wú)法釋放為代表的幾個(gè)比較討厭而且難于解決的問(wèn)題,在這篇文章中將給出完整的解決方案。 其中包含以下幾個(gè)方面:

      開(kāi)發(fā)環(huán)境

      配置DCOM

      在 ASP.NET 中進(jìn)行 EXCEL 編程

      優(yōu)化 EXCEL 的執(zhí)行效率

      在 Web 項(xiàng)目中使用 EXCEL 的其他方案

      本文使用了下列技術(shù):

      .NET、C# 或 Visual Basic .NET、Visual Studio .NET、EXCEL

      本頁(yè)內(nèi)容

      開(kāi)發(fā)環(huán)境

      本文討論的是在 ASP.NET 中使用 Microsoft Excel Object Library 進(jìn)行開(kāi)發(fā)的過(guò)程,開(kāi)發(fā)環(huán)境的配置如下:

      Windows 2000 + SP4
      Office XP + SP1
      Visual Studio.NET 2003

      注意:在這里,請(qǐng)確認(rèn)一下你的操作系統(tǒng)和 Office 的版本,包括補(bǔ)丁的版本。
      雖然在絕大多數(shù)情況下 Windows2000/WindowsXP、Office2000/OfficeXP 的任意組合都能正常工作,但也確實(shí)存在同樣的代碼在僅僅是SP版本不同的兩臺(tái)機(jī)器上一個(gè)執(zhí)行正常,而另一個(gè)卻出現(xiàn)異常的情況。
      所以,強(qiáng)烈建議使用與服務(wù)器環(huán)境完全一致的開(kāi)發(fā)環(huán)境。

      配置DCOM

      對(duì) Excel 進(jìn)行編程,實(shí)際上就是通過(guò) .Net Framework 去調(diào)用 Excel 的 COM 組件,所有要在 Web 環(huán)境下調(diào)用 COM 組件的時(shí)候,都需要對(duì)其進(jìn)行相應(yīng)的配置。
      很多朋友都反映在 Windows 環(huán)境下調(diào)試正常的程序,一拿到 Web 環(huán)境中就出錯(cuò),實(shí)際上就是因?yàn)槿鄙倭诉@一步。
      下面就詳細(xì)介紹 DCOM 的配置過(guò)程。

      1、運(yùn)行“dcomcnfg”,打開(kāi) DCOM 配置程序。



      2、在應(yīng)用程序列表中找到“Microsoft Excel 應(yīng)用程序”,點(diǎn)擊“屬性”。



      3、將 “常規(guī)” 選項(xiàng)卡中的 “身份驗(yàn)證級(jí)別” 設(shè)為 “無(wú)”。



      4、選中 “安全性” 選項(xiàng)卡中的 “使用自定義配置權(quán)限”,點(diǎn)擊 “編輯”。



      5、在打開(kāi)的對(duì)話框中添加 “Internet來(lái)賓用戶”(通常是IUSR_機(jī)器名) ,訪問(wèn)類型設(shè)為“完全控制”。



      6、將 “身份標(biāo)識(shí)” 選項(xiàng)卡中的用戶設(shè)為 “交互式用戶” 。



      7、點(diǎn)擊“應(yīng)用”之后,關(guān)閉屬性頁(yè)和 DCOM 配置程序。配置完成 。

      這里只給出了 DCOM 的配置方法,關(guān)于為什么要這么配置,以及更多的關(guān)于 DCOM 的知識(shí)就不屬于這篇文章的討論范圍了,有興趣的朋友可以自己去查閱相關(guān)資料。

      在 ASP.NET 中進(jìn)行 EXCEL 編程

      相信 99% 的閱讀本文的朋友,對(duì)關(guān)于如何引用 Excel 對(duì)象已經(jīng)是非常熟悉了的。但是為了保證這篇文章的完整性,就讓我再對(duì)剩下的 1%的朋友再多羅嗦幾句。

      打開(kāi)VS.NET,創(chuàng)建一個(gè)Web應(yīng)用程序,點(diǎn)擊 “項(xiàng)目” 菜單中的 “添加引用” ,在打開(kāi)的對(duì)話框的 “COM” 選項(xiàng)卡中找到 “Microsoft Excel 10.0 Object Library”,將其添加到項(xiàng)目中。
       
      10.0 的版本號(hào)表示這是 OfficeXP ,同樣的 9.0 是 Office2000,11.0 是 Office2003,這取決于你所安裝的Office。

      在我們正式開(kāi)始編程之前,還有2件事要做。第一件,在 web.config 文件的節(jié)中,加入以下這條:

      <identity  impersonate="true" />

      第二件,確認(rèn)一下“ASPNET”用戶是否對(duì)你將要操作的 Excel 文件的所在目錄擁有讀寫(xiě)權(quán)限。比如,我的 Web 項(xiàng)目是在默認(rèn)的 “C:/Inetpub/wwwroot” 目錄中,但我要讀寫(xiě)的 Excel 文件卻放在 “D:/TEMP” 中,那么你就要在 “D:/TEMP” 的安全屬性中加入 “ASPNET” 用戶,并賦予相應(yīng)的權(quán)限。

      至此,執(zhí)行 Excel 所需要的所有配置都已完成。

      在即將開(kāi)始的 ASP.NET 編程中,我將使用 VB.NET 語(yǔ)言,這可能會(huì)讓 C# 的擁護(hù)者們感到失望,但我相信在省去了大量的 Missing 和類型轉(zhuǎn)換之后,你可以更清晰的看到在程序中是如何控制 Excel 的。 其實(shí),我也只有在對(duì) Excel 進(jìn)行編程的時(shí)候才用 VB.NET 的:)。

      本文的示例在最后完成的時(shí)候,將輸出下面這樣的結(jié)果:


      為了更清楚的理解 Excel 編程的結(jié)構(gòu),我們先簡(jiǎn)單的輸出一下標(biāo)題部分,代碼如下:

      Dim filePath As String

      filePath 
      = Server.MapPath("testFile.xls")

      Dim xlApp As Excel.Application
      Dim xlBook As Excel.Workbook
      Dim xlSheet As Excel.Worksheet
      Dim xlRange As Excel.Range

      Try

        xlApp 
      = New Excel.Application

        
      ''不顯示Excel窗口,自動(dòng)釋放,不顯示提示信息
        xlApp.Visible 
      = False
        xlApp.UserControl 
      = False
        xlApp.DisplayAlerts 
      = False

        
      ''打開(kāi)一個(gè)作為輸出模板的文件
        
      'xlBook = xlApp.Workbooks.Open(filePath)
        ''或是新建一個(gè)文件
        xlBook 
      = xlApp.Workbooks.Add()

        
      ''選擇當(dāng)前的 Sheet 
        
      ''【注意】索引的下標(biāo)是從1開(kāi)始的,而不是0
        xlSheet 
      = xlBook.Sheets(1)

        Dim strTitle As String
        Dim strPos As String

        strTitle 
      = "大航海時(shí)代4 補(bǔ)給港口列表"

        
      ''選擇單元格
        strPos 
      = "A1:F1"
        xlRange 
      = xlSheet.Range(strPos)

        
      ''設(shè)置單元格內(nèi)容
        xlRange.Formula 
      = strTitle

        
      ''字體:18號(hào),粗體
        xlRange.Font.Size 
      = 18
        xlRange.Font.Bold 
      = True

        
      ''合并單元格
        xlRange.MergeCells 
      = True

        
      ''設(shè)置背景色
        
      ''使用內(nèi)置的顏色
        
      ''xlRange.Interior.ColorIndex = 40
        
      ''或者直接設(shè)置RGB顏色
        xlRange.Interior.Color 
      = RGB(255204153)

        
      ''設(shè)置居中
        xlRange.HorizontalAlignment 
      = Excel.XlHAlign.xlHAlignCenter

        
      ''設(shè)置行高
        xlRange.RowHeight 
      = 25

        
      ''保存打開(kāi)的文件
        
      'xlBook.Save()
        ''保存新建的文件
        xlBook.SaveAs(filePath)

      Catch ex As Exception
        Throw ex
      Finally

        
      ''釋放對(duì)象資源
        ReleaseComObject(xlRange)
        ReleaseComObject(xlSheet)

        If Not xlBook Is Nothing Then
              xlBook.Close()
              ReleaseComObject(xlBook)
        End If

        If Not xlApp Is Nothing Then
              xlApp.Quit()
              ReleaseComObject(xlApp)
        End If

        
      ''強(qiáng)制回收內(nèi)存
        GC.Collect()
      End Try
              

      其中的ReleaseComObject方法:

        Sub ReleaseComObject(ByVal obj As Object)
          
      If Not obj Is Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj 
      = Nothing
          
      End If
        
      End Sub

      將這段代碼放到你的項(xiàng)目中,執(zhí)行之后,你就會(huì)在 Web 項(xiàng)目的目錄中找到輸出的 “testFile.xls”文件。

      現(xiàn)在,我們將整個(gè)過(guò)程的關(guān)鍵部分提出來(lái),就簡(jiǎn)化為下面這樣的結(jié)構(gòu):

      [定義Excel對(duì)象]

      Try

        [使用Excel對(duì)象]

      Catch ex As Exception
        
      Throw ex
      Finally

        [釋放Excel對(duì)象]

        [強(qiáng)制回收內(nèi)存]

      End Try

      這種結(jié)構(gòu)是保證 Excel 進(jìn)程可以被正確釋放的關(guān)鍵,也就是說(shuō),你必須保證所有使用過(guò)的 Excel 對(duì)象都被釋放了。
      為了讓你對(duì)這種結(jié)構(gòu)有更清楚的認(rèn)識(shí),我們將上面的代碼按照不同的級(jí)別重新整理一下。

      這樣我們就可以更清楚的看到,釋放對(duì)象的原則就是:在本函數(shù)中定義并使用的 Excel 對(duì)象,一定要在本函數(shù)中釋放。

      整理過(guò)的代碼如下所示:

      Sub ExportExcel(ByVal filePath As String)

        
      Dim xlApp As Excel.Application
        
      Dim xlBook As Excel.Workbook


        
      Try
          xlApp 
      = New Excel.Application

          
      ''不顯示Excel窗口,自動(dòng)釋放,不顯示提示信息
          xlApp.Visible = False
          xlApp.UserControl 
      = False
          xlApp.DisplayAlerts 
      = False

          
      ''打開(kāi)一個(gè)作為輸出模板的文件
          'xlBook = xlApp.Workbooks.Open(filePath)
          ''或是新建一個(gè)文件
          xlBook = xlApp.Workbooks.Add()


          FillSheet(xlBook, 
      1)

          
      ''保存打開(kāi)的文件
          'xlBook.Save()
          ''保存新建的文件
          xlBook.SaveAs(filePath)
        
      Catch ex As Exception
          
      Throw ex
        
      Finally

          
      ''釋放對(duì)象資源
          If Not xlBook Is Nothing Then
            xlBook.Close()
            ReleaseComObject(xlBook)
          
      End If

          
      If Not xlApp Is Nothing Then
            xlApp.Quit()
            ReleaseComObject(xlApp)
          
      End If

          
      ''強(qiáng)制回收內(nèi)存
          GC.Collect()
        
      End Try
      End Sub



      Sub FillSheet(ByVal xlBook As Excel.Workbook, ByVal index As Integer)

        
      Dim xlSheet As Excel.Worksheet

        
      Try

          xlSheet 
      = xlBook.Sheets(index)

          SetTitle(xlSheet)

        
      Catch ex As Exception
          
      Throw ex
        
      Finally
          ReleaseComObject(xlSheet)
        
      End Try
      End Sub



      Sub SetTitle(ByVal xlSheet As Excel.Worksheet)

        
      Dim xlRange As Excel.Range
        
      Dim xlFont As Excel.Font

        
      Try

          
      Dim strTitle As String
          
      Dim strPos As String

          strTitle 
      = "大航海時(shí)代4 補(bǔ)給港口列表"

          
      ''選擇單元格
          strPos = "A1:F1"
          xlRange 
      = xlSheet.Range(strPos)

          
      ''設(shè)置單元格內(nèi)容
          xlRange.Formula = strTitle

          
      ''字體:18號(hào),粗體
          xlFont = xlRange.Font
          xlFont.Size 
      = 18
          xlFont.Bold 
      = True

          
      ''合并單元格
          xlRange.MergeCells = True

          
      ''設(shè)置背景色
          ''使用內(nèi)置的顏色
          ''xlRange.Interior.ColorIndex = 40
          ''或者直接設(shè)置RGB顏色
          xlRange.Interior.Color = RGB(255204153)

          
      ''設(shè)置居中
          xlRange.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter

          
      ''設(shè)置行高
          xlRange.RowHeight = 25

        
      Catch ex As Exception
          
      Throw ex
        
      Finally

          ReleaseComObject(xlFont)
          ReleaseComObject(xlRange)
        
      End Try

      End Sub

              

      值得注意的一個(gè)地方是,在 SetTitle 函數(shù)中,我們又定義了一個(gè) Excel.Font 對(duì)象,對(duì)字體的設(shè)置通過(guò)這個(gè)對(duì)象來(lái)完成,并且在執(zhí)行后釋放掉。
      在通常情況下,我們不需要使用這么麻煩的方法,但在某些時(shí)候,如果不釋放這些間接引用的對(duì)象(比如xlRange.Font.Size中的Font對(duì)象)的話,就無(wú)法正常中止 Excel 進(jìn)程。如果我們非常不幸的遇到了這種情況的時(shí)候,就需要仔細(xì)檢查代碼,保證不存在間接引用(簡(jiǎn)單的說(shuō)就是沒(méi)有使用兩個(gè)“.”同時(shí)出現(xiàn)的代碼)。

      關(guān)于如何設(shè)置單元格,其實(shí)并沒(méi)有什么值得說(shuō)的,基本上所有的問(wèn)題都可以通過(guò)在 Excel 中錄制宏來(lái)解決。 此外,當(dāng)你還希望了解更多的關(guān)于 Excel 對(duì)象的信息的時(shí)候,可以去看 Excel 的 VBA 參考手冊(cè),在我的機(jī)器上, 它位于 “F:/Program Files/Microsoft Office/Office10/2052/VBAXL10.chm” 。
      如果你在你的機(jī)器上沒(méi)有找到這個(gè)文件,那就需要添加安裝 Office 安裝選項(xiàng)中 “Office共享功能” 下面的 “Visual Basic for Applictions” 組件中的 “Visual Basic 幫助” 。

      優(yōu)化 EXCEL 的執(zhí)行效率

      通過(guò)前面的介紹,我們已經(jīng)可以在 ASP.NET 中進(jìn)行 Excel 開(kāi)發(fā)了,但如果是要進(jìn)行企業(yè)級(jí)的開(kāi)發(fā)的話,我們就必須考慮一下效率的問(wèn)題了。這是因?yàn)椋?BR>1、每當(dāng)一個(gè)用戶提交請(qǐng)求時(shí), Web 服務(wù)器上都需要?jiǎng)?chuàng)建一個(gè) Excel 進(jìn)程,每個(gè)進(jìn)程都會(huì)占用大量的內(nèi)存,少則幾M多則20~30M。
      2、每次對(duì)Excel單元格的寫(xiě)操作都是非常花時(shí)間的,高達(dá)幾十ms(測(cè)試機(jī)為P4 3.0,1G內(nèi)存)。

      在我曾經(jīng)參加過(guò)的一個(gè)項(xiàng)目中,輸出的一個(gè)Excel文件里,最多要有8個(gè)Sheet。最大的一個(gè)Sheet中,每條記錄要占20行197列,整個(gè)模版文件就2M多。在優(yōu)化之前,輸出這樣一個(gè)文件大概要40分鐘(測(cè)試人員掐表算的,我沒(méi)敢試-_-!! )。

       對(duì) Excel 的操作程序進(jìn)行優(yōu)化的原則非常簡(jiǎn)單,就是
      1、在一次操作中盡可能做更多的事。
      2、不需要做的事情不做。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多

        主站蜘蛛池模板: 免费观看的AV毛片的网站| 日本一区二区在线高清观看| 人人澡人摸人人添| 日韩免费码中文在线观看| 国产精品欧美一区二区三区不卡 | 久久伊人精品青青草原APP| 又大又硬又爽18禁免费看| 亚洲人成电影网站 久久影视| 国产SUV精品一区二区88L| 青青青爽在线视频观看| 日韩免费码中文在线观看| jizz视频在线观看| 欧美午夜成人片在线观看| 免费无码肉片在线观看| 强行无套内大学生初次| 日韩有码av中文字幕| 久久五十路丰满熟女中出| 双乳奶水饱满少妇呻吟免费看| 波多野结衣久久一区二区| 人成午夜免费大片| 强奷漂亮少妇高潮伦理| 亚洲蜜臀av乱码久久| 人妻在线无码一区二区三区| 国厂精品114福利电影免费| 亚洲人成无码WWW久久久| 精品国产乱码久久久久APP下载| 亚洲欧洲精品日韩av| 美女乱子伦高潮在线观看完整片| 亚洲中文字幕一区二区| 人人妻人人添人人爽欧美一区 | 国产激情电影综合在线看| 国产不卡一区二区四区| 99久久99久久精品国产片 | 老司机午夜精品视频资源| 国产精品久久国产三级国不卡顿 | 国精产品一区二区三区有限公司| 国产360激情盗摄全集| 国产爆乳无码一区二区麻豆| 久久影院午夜伦手机不四虎卡| 亚洲欧美日韩成人综合一区| 国产丰满美女A级毛片 |