小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

生成/讀取(反向更新數(shù)據(jù)庫) Excel文件(示例代碼下載)

 悟靜 2011-04-10

(一).內(nèi)容

   在操作Excel的過程中遇到了一些問題. 比如: 訪問Com組件權(quán)限,無法讀取Excel等
   文章描述了怎樣雙向操作(讀取和生成)Excel文件,以及怎樣解決遇到的問題!

(二).代碼
   開始時用了下面兩個方法進行生成和讀取 Excel:
    1.生成Excel文件方法一:     

 ' <summary>
    '  下載Excel方法1(用流實現(xiàn))
    ' </summary>
    ' <param name="dt">要轉(zhuǎn)換為Excel文件的表</param>
    ' <param name="page">頁面Page對象,用法: 將me.Page傳遞過來即可</param>
    Public Sub DownLoadExcelToClient1(ByVal dt As DataTable, ByVal FileName As String)
        Dim resp As HttpResponse
        resp 
= Page.Response
        resp.ContentEncoding 
= System.Text.Encoding.Default 

'System.Text.Encoding.GetEncoding("GB2312")
        resp.AppendHeader("Content-Disposition""attachment;filename=" + FileName)
        Dim colHeaders As String 
= "", ls_item = ""
        Dim i As Int16 
= 0

        
'取得數(shù)據(jù)表各列標題,各標題之間以 分割,最后一個列標題后加回車符 
        For i = 0 To dt.Columns.Count - 2
            colHeaders 
+= dt.Columns(i).Caption.ToString() & Chr(9)
        Next
        colHeaders 
+= dt.Columns(i).Caption.ToString() & Chr(13)
        
'向HTTP輸出流中寫入取得的數(shù)據(jù)信息 
        resp.Write(colHeaders)

        Dim row As DataRow
        
'逐行處理數(shù)據(jù)   
        For Each row In dt.Rows
            
'在當前行中,逐列獲得數(shù)據(jù),數(shù)據(jù)之間以 分割,結(jié)束時加回車符  
            For i = 0 To dt.Columns.Count - 2
                ls_item 
&= row(i).ToString() & Chr(9)
            Next i
            ls_item 
&= row(i).ToString() & Chr(13)

            
'當前行數(shù)據(jù)寫入HTTP輸出流,并且置空ls_item以便下行數(shù)據(jù)     
            resp.Write(ls_item)
            ls_item 
= ""
        Next
        
'寫緩沖區(qū)中的數(shù)據(jù)到HTTP頭文件中 
        resp.End()
    End Sub


    2.讀取Excel文件      

' <summary>
    '  讀取Excel文件
    ' </summary>
    ' <param name="dt">要轉(zhuǎn)換為Excel文件的表</param>
    ' <param name="page">頁面Page對象,用法: 將me.Page傳遞過來即可</param>
    ' <return>數(shù)據(jù)集DataSet</return>
    Public Function ReadExcelFileToDataSet(ByVal strFileName As String) As DataSet
        Try

            
'建立一個專門存放Excel文件的目錄
            If Directory.Exists(Page.Server.MapPath("ExcelFolder")) = False Then
                Directory.CreateDirectory(Page.Server.MapPath(
"ExcelFolder"))
            End If

            Dim strConn As String
            strConn 
= "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & 

Page.Server.MapPath(
"."& "ExcelFolder" & strFileName & ";" & "Extended 

Properties
=Excel 8.0;"
            Dim conn As OleDb.OleDbConnection = New OleDb.OleDbConnection(strConn)
            Dim strExcel As String 
= "select * from [sheet1$]"
            Dim ds As DataSet 
= New DataSet
            conn.Open()
            Dim adapter As OleDbDataAdapter 
= New OleDbDataAdapter(strExcel, strConn)
            adapter.Fill(ds)
            Return ds
        Catch ex As Exception
            Throw ex
        End Try
    End Function


        生成是成功的,但讀取不成功,提示:"數(shù)據(jù)源格式有誤!"
   一直是認為:ReadExcelFileToDataSet方法有誤,調(diào)試了半天,找了N多資料也不能成功!
   后來經(jīng)過"時間的流逝",終久確認第二個方法沒有錯誤,是完全正確的,是第一個方法
   生成格式的問題. 于是我將第一個方法換為下面的方法,讀取和寫入就OK了.

    另外還可以讀取指定范圍內(nèi)的單元格:
      對 Excel 工作簿中表(或范圍)的有效引用。
      若要引用完全使用的工作表的范圍,請指定后面跟有美元符號的工作表名稱。例如:
      select * from [Sheet1$]
      若要引用工作表上的特定地址范圍,請指定后面跟有美元符號和該范圍的工作表名稱。例如: 
      select * from [Sheet1$A1:B10]
      若要引用指定的范圍,請使用該范圍的名稱。例如:
      select * from [MyNamedRange]

 3.生成Excel文件方法二:

    ' <summary>
    
'  下載Excel方法2(用office-Excel-Com組件對象實現(xiàn))
    
' </summary>
    
' <param name="dt">要轉(zhuǎn)換為Excel文件的表</param>
    
' <param name="page">頁面Page對象,用法: 將me.Page傳遞過來即可</param>
    Public Sub DownLoadExcelToClient2(ByVal dt As DataTable)
        
'生成Excel操作相關(guān)對象
        Dim xlApp As Excel.Application
        Dim xlBook As Excel.Workbook
        Dim xlSheet As Excel.Worksheet
        xlApp 
= CType(CreateObject("Excel.Application"), Excel.Application)
        xlBook 
= CType(xlApp.Workbooks.Add, Excel.Workbook)
        xlSheet 
= CType(xlBook.Worksheets(1), Excel.Worksheet)


        
'xlSheet.Range("A1:B1").Merge(0) '合并單元格
        
'xlSheet.Cells(1, 1) = "員工資料信息:"

        '
賦標題(Excel文件中的標題)
        Dim rowIndex As Integer 
= 2
        Dim colIndex As Integer =
 0
        Dim Col As DataColumn
        Dim Row As DataRow
        For Each Col In dt.Columns
            colIndex =
 colIndex + 1
            xlApp.Cells(rowIndex, colIndex) 
= Col.ColumnName
        Next

        
'將表dt的所有行寫入xlApp對象(Excel文件中的內(nèi)容)
        For Each Row In dt.Rows
            rowIndex 
= rowIndex + 1
            colIndex =
 0
            For Each Col In dt.Columns
                colIndex =
 colIndex + 1
                xlApp.Cells(rowIndex, colIndex) 
= Row(Col.ColumnName)
            Next
        Next

        xlSheet.Application.Visible 
= True   '置為可見

        '
建立一個專門存放Excel文件的目錄
        If Directory.Exists(Page.Server.MapPath(
"ExcelFolder")) = False Then
            Directory.CreateDirectory(Page.Server.MapPath(
"ExcelFolder"))
        End If

        
'刪除服務端臨時文件: download.xls
        If File.Exists(Page.Server.MapPath(
"."& "ExcelFolderdownload.xls"= True Then
            File.Delete(Page.Server.MapPath(
"."& "ExcelFolderdownload.xls")
        End If

        
'在服務端保存download.xls
        xlSheet.SaveAs(Page.Server.MapPath(
"."& "ExcelFolderdownload.xls")

        
'殺死Excel進程
        Dim myproc As System.Diagnostics.Process 
= New System.Diagnostics.Process
        Dim proc As Process
        Dim procs() As Process 
= Process.GetProcessesByName("excel")   '得到所有打開的進程
        Try
            For Each proc In procs
                If Not proc.CloseMainWindow() Then
                    proc.Kill()
                End If
            Next
        Catch
        End Try

        
'這里用到個goto語句,是因為: 線程是異步執(zhí)行的,下面的代碼要訪問download.xls文件,但有
少數(shù)情況下上面的線程'
未能及時釋放download.xls文件的指針,那么下面代碼執(zhí)行語句時會拋出異常, 當發(fā)生異常時需要等待資源釋放后,'再重新訪問該文件, 保證下載文件能夠正確下載
again:  Try
            
'輸出到客戶端()
            If File.Exists(Page.Server.MapPath(
"."& "ExcelFolderdownload.xls") Then
                Dim TargetFile As FileInfo 
= New FileInfo(Page.Server.MapPath("."

"ExcelFolderdownload.xls")
                
'清除緩沖區(qū)流中的所有內(nèi)容輸出.
                Page.Response.Clear()
                
'向輸出流添加HTTP頭 [指定下載/保存 對話框的文件名]
                Page.Response.AppendHeader(
"Content-Disposition""attachment; filename=

+ Page.Server.UrlEncode(TargetFile.Name))
                
'向輸出流添加HTTP頭 [指定文件的長度,這樣下載文件就會顯示正確的進度
                Page.Response.AppendHeader(
"Content-Length", TargetFile.Length.ToString())
                
'表明輸出的HTTP為流[stream],因此客戶端只能下載.
                Page.Response.ContentType 
= "application/octet-stream"
                '
發(fā)送文件流到客戶端.
                Page.Response.WriteFile(TargetFile.FullName)
                
'停止執(zhí)行當前頁
                Page.Response.End()
            End If
        Catch
            Thread.Sleep(
10)
            GoTo again
        End Try
    End Sub


這說明:
    a. 生成Excel文件后,用戶經(jīng)過修改,還要反向讀取此Excel文件(比如:反向更新到數(shù)據(jù)庫中)
       就只能用: 3 和 2方法結(jié)合使用. 
    b. 如果只是單向輸出Excel文件,用1和2方法都可以. 不過用2的話還要安裝Office-Excel,
       一般還要設置一下Com組件訪問權(quán)限,添加對Com組件的引用: 添加: 引用->com->Microsoft Excel 11.0 object Library

(三).不能讀取的原因 以及 權(quán)限問題解決

  a. 原因是:  方法 1 是用流的格式實現(xiàn)的,簡單的說它不是真正的Excel格式,而 3 是調(diào)用的
     Excel Com組件,生成的是真正的Excel文檔,所以能讀取(1也可以讀取,但也要用Stream類讀取,

    如果數(shù)據(jù)有些復雜的話,會很麻煩).  用1和3方法生成的文件及文件圖標一模一樣,并且用Excel 

    應用程序打開后顯示效果也是一樣的.  但當用記事本分別打開1和3生成的*.xls文件時,就明
     顯看到它們的不同了.(您可以下載一下本示例代碼程序,分別生成兩個文件,對比一下)

  b.在使用Excel com組件時除了裝Office-Excel以外,一般還要設置一下Com的訪問權(quán)限,步驟如下: 
     I.如果是Window2003 ->控制面版 -> 管理工具 -> 組件服務 ->
       打開樹級目錄找到子目錄DCOM配置 -> Microsoft Excel 應用程序
       -> 右擊選“屬性” -> 在彈出對話窗口中選“安全”選項卡->
       -> 將啟動和激活權(quán)限設為自定義->點擊編輯按鈕->
       ->在新窗口中將Everyone用戶加入,選中復選框"啟動權(quán)限",給予啟動權(quán)限

     II.如果是WindowXP ->控制面版 -> 管理工具 -> 組件服務(繁體為"元件服務") ->
       打開樹級目錄找到子目錄DCOM配置 -> Microsoft Excel 應用程序
       -> 右擊選“屬性” -> 在彈出對話窗口中選“安全”選項卡->
       -> 將啟動和激活權(quán)限設為自定義->點擊編輯按鈕->
       ->在新窗口中將Everyone用戶加入,選中復選框"遠程啟動",給予遠程啟動權(quán)限
(四).使用Excel模板
       雖然Com組件功能已經(jīng)比較全面,可以對任意一個單元格設置和賦值.但是如果數(shù)據(jù)集DataSet比

   較復雜的話,全部用Com提供的方法實現(xiàn)就很麻煩了. 尤其是文檔頭和尾最難處理.
    這時可以這樣處理:
    a.先用Excel應用程序建立一個Excel文件,設置好頭/尾樣式和以及所有單元格的布局和格式
      (這里就是作用office 家簇的 excel進行表格布局,可以任意操作)   
    b.將此文件保存到工程的一個文夾下面即可.
      用法:
      只需將2中的:
        xlBook = CType(xlApp.Workbooks.Add, Excel.Workbook)
           改為: 
        xlBook = xlApp.Workbooks.Add(page.MapPath(".") + "ExcelTemplate.xls")'使用現(xiàn)有模板
      即可。 這樣xlBook實際上是基于自己創(chuàng)建的模板的.
    這樣操作,一般表頭和標題列,表尾列一般不用設置,只顯示DataSet中的主要數(shù)據(jù)(甚至也不用顯

   示DataSet列名)

    最近給客戶做一些Excel報表,我們是這樣做的,直接把客戶給的Excel需求文件作為了模板.
    非常簡便,更爽的是這樣做報表跟客戶要求的完全相同。

(五).代碼示例下載

   http://www.cnblogs.com/Files/ChengKing/OPExcel.rar

 此示例在配置環(huán)境:   WinXP(繁體) VS.net 2002    WinXP(簡體) Vs.net 2003 

                                    Win2003 VS.net 2003  測試能夠正確運行!

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多