none
如何將datagrid中的資料轉到excel呢?

    問題

  • 我用的語法是vb.net請問如何將查詢後的datagrid中資料轉到excel呢?語法到底是什麼呢?請各位達人解答一下好嗎?十分感激~~~~~~~~~~

    2006年8月2日 上午 07:39

解答

  • 1. 使用 Spreadsheet ML 方式把資料轉換成 XML(支援 Excel 2002 以上)

    2. 使用 OLE DB Provider 來產生與寫入資料到 Excel

    3. 存取 Excel Object Model(但這要伺服器上有 Excel,而且並不建議這樣做)

    4. 輸出 .csv 檔案,叫使用者用 Excel 開(可以轉檔)

    2006年8月2日 上午 08:01
  • 沒寫過這樣的需求,但是如果只是單純要秀出資料(沒有增刪改需求),

    您可以考慮使用ReportViewer去達成您的需求透過ReportViewer可以匯出Excel檔案。

    2006年8月2日 上午 09:35
  • HI,

    您可以這樣做:

    1. 加入參考, 參考:

        Microsoft Excel 11.0 Object Library

    2. 加入以下的程式碼:

            Dim app As Application = New Application
            Dim wb As Workbook = app.Workbooks.Add()
            Dim ws As Worksheet = wb.Worksheets.Add

            Dim i As Integer = 1
            Dim j As Integer = 1
            For Each dc As DataColumn In NORTHWNDDataSet.Suppliers.Columns
                ws.Cells(i, j) = dc.ColumnName
                J += 1
            Next

            '============================
            i = 2
            j = 1
            For Each dr As DataRow In NORTHWNDDataSet.Suppliers
                ws.Cells(i, j) = dr("SupplierID")
                ws.Cells(i, j + 1) = dr("CompanyName")
                ws.Cells(i, j + 2) = dr("ContactName")
                ws.Cells(i, j + 3) = dr("Phone")
                i += 1
            Next
            '============================     
            wb.Close()
            app.Quit()

    就可以將DataGridView的內容寫成Excel文件

    tihs

    2006年8月3日 上午 01:49
  • HI,

    您可以這樣試試看:

    For Each dr As DataRow In NORTHWNDDataSet.Suppliers
                ws.Cells(i, j) = dr("SupplierID")
                ws.Cells(i, j + 1) = dr("CompanyName")
                ws.Cells(i, j + 2) = dr("ContactName")
                ws.Cells(i, j + 3) = dr("Phone")

               If dr("欄位名稱")="True" Then

                   ws.Cells(i, j + 4) =1

               Else

                   ws.Cells(i, j + 4) =0

               End If
                i += 1
    Next

    tihs

    2006年8月4日 上午 09:20

所有回覆

  • 1. 使用 Spreadsheet ML 方式把資料轉換成 XML(支援 Excel 2002 以上)

    2. 使用 OLE DB Provider 來產生與寫入資料到 Excel

    3. 存取 Excel Object Model(但這要伺服器上有 Excel,而且並不建議這樣做)

    4. 輸出 .csv 檔案,叫使用者用 Excel 開(可以轉檔)

    2006年8月2日 上午 08:01
  •         這一段程式碼供您參考:

            Dim sw As New System.IO.StringWriter
            Dim hw As New System.Web.UI.HtmlTextWriter(sw)

            DataGrid1.RenderControl(hw)
            Response.Clear()
            Response.AppendHeader("Content-Disposition", "attachment; filename=excel.xls")
            Response.ContentType = "application/vnd.ms-excel"
            Response.Write(sw.ToString())
            Response.End()

    2006年8月2日 上午 08:15
  • 很感謝您的回覆,可是我用的語法是vb.net你的寫法應該是asp.net的寫法,所以很多都不行哩><"

    請問有vb.net的寫法嗎?

    2006年8月2日 上午 09:14
  • 如果要我要第二個方法請問該怎麼做呢?
    2006年8月2日 上午 09:16
  • 沒寫過這樣的需求,但是如果只是單純要秀出資料(沒有增刪改需求),

    您可以考慮使用ReportViewer去達成您的需求透過ReportViewer可以匯出Excel檔案。

    2006年8月2日 上午 09:35
  • 如何用ReportViewer呢?大概要怎麼做呢?能不能清楚說明一下,因為我不懂ReportViewer如何去應用><"

    謝謝~~

    2006年8月3日 上午 12:43
  • 這個http://www.gotreportviewer.com/網站介紹得很詳細,您可以參考並試著實做看看。
    2006年8月3日 上午 01:22
  • HI,

    您可以這樣做:

    1. 加入參考, 參考:

        Microsoft Excel 11.0 Object Library

    2. 加入以下的程式碼:

            Dim app As Application = New Application
            Dim wb As Workbook = app.Workbooks.Add()
            Dim ws As Worksheet = wb.Worksheets.Add

            Dim i As Integer = 1
            Dim j As Integer = 1
            For Each dc As DataColumn In NORTHWNDDataSet.Suppliers.Columns
                ws.Cells(i, j) = dc.ColumnName
                J += 1
            Next

            '============================
            i = 2
            j = 1
            For Each dr As DataRow In NORTHWNDDataSet.Suppliers
                ws.Cells(i, j) = dr("SupplierID")
                ws.Cells(i, j + 1) = dr("CompanyName")
                ws.Cells(i, j + 2) = dr("ContactName")
                ws.Cells(i, j + 3) = dr("Phone")
                i += 1
            Next
            '============================     
            wb.Close()
            app.Quit()

    就可以將DataGridView的內容寫成Excel文件

    tihs

    2006年8月3日 上午 01:49
  • 我在試你的程式,可是它會出現「語法錯誤」哩><"在For Each dc As DataColumn In NORTHWNDDataSet.Suppliers.Columns與For Each dr As DataRow In NORTHWNDDataSet.Suppliers那邊,那樣的語法是對的嗎?
    2006年8月4日 上午 01:57
  • HI,

    NORTHWNDDataSet.Suppliers的意思是取得DataSet中名稱為Suppliers的資料表, 您必須依照您的程式中的DataSet名稱和DataSet中的資料表名稱修改程式, 後續的欄位名稱也一樣, 請視需要修改:

     ws.Cells(i, j) = dr("SupplierID")
     ws.Cells(i, j + 1) = dr("CompanyName")
     ws.Cells(i, j + 2) = dr("ContactName")
     ws.Cells(i, j + 3) = dr("Phone")

    tihs

    2006年8月4日 上午 02:34
  • 很感謝你,我轉出來了,可是又碰到一個問題><”因為我其中有一欄的文字會比較多,帶到excel之後它那一欄會放大,可是其它欄也是會帶到,可是卻都沒有顯示出來,可是我點到其他欄是有資料的,我想大概是excel欄位問題,怎麼做調整呢?如何把轉到excel之後資料都看的到呢?麻煩請解答,十分感激~~
    2006年8月4日 上午 02:59
  • HI:

    如果您的意思是要設定欄位寬度的話, 可以這樣做:

    ws.Columns("A:A").ColumnWidth = 10  ' 將第A欄的寬度設定為10

    tihs

    2006年8月4日 上午 03:04
  • 我實在是太感謝您了~~~^_______^可是可不可以再問一個問題><"我可不可以把某些欄位匯到EXCEL就好了,不要全部都匯過去,因為有些欄位資料是不需要的,我該怎麼做呢?還有如果我想把其中欄位是"True"的改改"1"的話,我又該怎麼做呢?麻煩請解答,真的十分感激您~~~~~~~
    2006年8月4日 上午 03:19
  • HI,

    如果有欄位不想匯出到EXCEL文件, 您只要不要在以下的迴圈將資料填入EXCEL文件即可(當然連欄位名稱也不要輸出), 如果要依據欄位的內容填入不同的內容, 可以加上判斷式控制, 例如:

    For Each dr As DataRow In NORTHWNDDataSet.Suppliers
                ws.Cells(i, j) = dr("SupplierID")
                ws.Cells(i, j + 1) = dr("CompanyName")
                ws.Cells(i, j + 2) = dr("ContactName")
                ws.Cells(i, j + 3) = dr("Phone")

               If dr("欄位名稱")=True Then

                   ws.Cells(i, j + 4) =1

               Else

                   ws.Cells(i, j + 4) =0

               End If
                i += 1
    Next

    tihs

    2006年8月4日 上午 03:59
  • 欄位名稱ok了^^可是另外想問一下,如果我想把其中欄位是"True"的改改"1"的話,我又該怎麼做呢?麻煩請解答,真的十分感激您~~~~~~~
    2006年8月4日 上午 05:27
  • HI,

    您可以這樣試試看:

    For Each dr As DataRow In NORTHWNDDataSet.Suppliers
                ws.Cells(i, j) = dr("SupplierID")
                ws.Cells(i, j + 1) = dr("CompanyName")
                ws.Cells(i, j + 2) = dr("ContactName")
                ws.Cells(i, j + 3) = dr("Phone")

               If dr("欄位名稱")="True" Then

                   ws.Cells(i, j + 4) =1

               Else

                   ws.Cells(i, j + 4) =0

               End If
                i += 1
    Next

    tihs

    2006年8月4日 上午 09:20
  • 真的十分感激您~~我又遇到一個可惡的問題><”我試了二天了><"還是不行很挫敗><"我要用日期來查詢資料庫裡的資料我資料庫(Access)裡面的日期格式是用「文字」因為我當初要做「新增功能」時是用textbox.text=DateTimePicker.value方式來依textbox.text新增日期,我之前有試著要將資料庫裡日期格式用「日期/時間」格式然後依datetimepicker.value來做新增,可是會出現錯誤><"最後只好把資料庫裡的日期格式用「文字」之後依textbox.text來做新增,這樣就不會出現問題了,現在有一個大問題:我要依日期區間來做搜尋,可是出現的卻都不是我要的區間,比如說我的資料庫中明明就有2006/08/09與2006/08/10的資料可是我選擇2006/08/01~2006/08/31之間的資料全部show出來,可是它一筆都沒有show><"而我選擇2006/08/1~2006/08/08它卻秀出2006/08/10這一筆,到底怎麼一回事><"好像都要選到那一筆才會show出該筆資料,另外我發現它只抓比如[2006/08/1]這幾碼,它不會抓到0的部份,意思是它好像是用2006/08/1*來抓的樣子,所以如果是2006/08/02~2006/08/31它就抓不到2006/08/10因為它好像是抓從2006/08/0*怎麼會這樣~是因為我資料庫裡日期格式設定為「文字」的關係嗎?請問您之前有做過類似這樣的功能嗎?會出現和我一樣的問題嗎?如果不會的話,請問您是怎麼做的呢?您資料庫裡日期的格式又是什麼呢?真的很不好意思這樣一直麻煩您,可是我真的困惱了好久,一直在做修改,可是就是完成不了><"請再幫幫我,感激感激~~~~~~~~
    2006年8月5日 下午 01:21
  • HI,

    您的問題看起來像是程式在執行字串比對, 比較好的做法是日期資料不要當做文字來儲存會比較好, 您可以考慮將資料庫中的文字資料轉回成日期時間格式的資料, 再處理就應該沒有問題才對

    tihs

    2006年8月6日 上午 04:10
  • 真的是很感激您~~謝謝您這麼有耐心的回答我的問題^^現在的問題都解決了~~~真不知該怎麼表達我的感謝^^

    十分感謝您^^

    2006年8月7日 上午 03:27