乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       悟靜 2011-04-10

      (一).內(nèi)容

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

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

       ' <summary>
          '  下載Excel方法1(用流實(shí)現(xiàn))
          ' </summary>
          ' <param name="dt">要轉(zhuǎn)換為Excel文件的表</param>
          ' <param name="page">頁面Page對(duì)象,用法: 將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ù)表各列標(biāo)題,各標(biāo)題之間以 分割,最后一個(gè)列標(biāo)題后加回車符 
              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
                  
      '在當(dāng)前行中,逐列獲得數(shù)據(jù),數(shù)據(jù)之間以 分割,結(jié)束時(shí)加回車符  
                  For i = 0 To dt.Columns.Count - 2
                      ls_item 
      &= row(i).ToString() & Chr(9)
                  Next i
                  ls_item 
      &= row(i).ToString() & Chr(13)

                  
      '當(dāng)前行數(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對(duì)象,用法: 將me.Page傳遞過來即可</param>
          ' <return>數(shù)據(jù)集DataSet</return>
          Public Function ReadExcelFileToDataSet(ByVal strFileName As String) As DataSet
              Try

                  
      '建立一個(gè)專門存放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ù)源格式有誤!"
         一直是認(rèn)為:ReadExcelFileToDataSet方法有誤,調(diào)試了半天,找了N多資料也不能成功!
         后來經(jīng)過"時(shí)間的流逝",終久確認(rèn)第二個(gè)方法沒有錯(cuò)誤,是完全正確的,是第一個(gè)方法
         生成格式的問題. 于是我將第一個(gè)方法換為下面的方法,讀取和寫入就OK了.

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

       3.生成Excel文件方法二:

          ' <summary>
          
      '  下載Excel方法2(用office-Excel-Com組件對(duì)象實(shí)現(xiàn))
          
      ' </summary>
          
      ' <param name="dt">要轉(zhuǎn)換為Excel文件的表</param>
          
      ' <param name="page">頁面Page對(duì)象,用法: 將me.Page傳遞過來即可</param>
          Public Sub DownLoadExcelToClient2(ByVal dt As DataTable)
              
      '生成Excel操作相關(guān)對(duì)象
              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) = "員工資料信息:"

              '
      賦標(biāo)題(Excel文件中的標(biāo)題)
              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對(duì)象(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   '置為可見

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

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

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

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

              
      '這里用到個(gè)goto語句,是因?yàn)? 線程是異步執(zhí)行的,下面的代碼要訪問download.xls文件,但有
      少數(shù)情況下上面的線程'
      未能及時(shí)釋放download.xls文件的指針,那么下面代碼執(zhí)行語句時(shí)會(huì)拋出異常, 當(dāng)發(fā)生異常時(shí)需要等待資源釋放后,'再重新訪問該文件, 保證下載文件能夠正確下載
      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頭 [指定下載/保存 對(duì)話框的文件名]
                      Page.Response.AppendHeader(
      "Content-Disposition""attachment; filename=

      + Page.Server.UrlEncode(TargetFile.Name))
                      
      '向輸出流添加HTTP頭 [指定文件的長度,這樣下載文件就會(huì)顯示正確的進(jìn)度
                      Page.Response.AppendHeader(
      "Content-Length", TargetFile.Length.ToString())
                      
      '表明輸出的HTTP為流[stream],因此客戶端只能下載.
                      Page.Response.ContentType 
      = "application/octet-stream"
                      '
      發(fā)送文件流到客戶端.
                      Page.Response.WriteFile(TargetFile.FullName)
                      
      '停止執(zhí)行當(dāng)前頁
                      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,
             一般還要設(shè)置一下Com組件訪問權(quán)限,添加對(duì)Com組件的引用: 添加: 引用->com->Microsoft Excel 11.0 object Library

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

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

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

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

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

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

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

         示DataSet列名)

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

      (五).代碼示例下載

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

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

                                          Win2003 VS.net 2003  測試能夠正確運(yùn)行!

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(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)論公約

        類似文章 更多