2009-03-25 3 views
4

У меня есть datagridview в vb.net, который заполняется из базы данных. Я исследовал, и я узнал, что нет встроенной поддержки для печати непосредственно из datagridview. Я не хочу использовать хрустальный отчет, потому что я не знаком с ним.Как экспортировать datagridview для Excel с помощью vb.net?

Я планирую экспортировать его в excel, чтобы я мог генерировать отчет из datagridview.

Можете ли вы предоставить мне способы сделать это?

ответ

1

Что касается вашей необходимость «печать непосредственно из DataGridView», проверить эту статью на CodeProject:

The DataGridViewPrinter Class

Есть целый ряд подобных статей, но я имел счастье с одной я связан.

0

Dim rowNo1 Как Короткие Dim numrow Как Короткие Dim colNo1 Как Короткие Dim colNo2 Как Короткие

rowNo1 = 1 
    colNo1 = 1 
    colNo2 = 1 
    numrow = 1 

    ObjEXCEL = CType(CreateObject("Excel.Application"), Microsoft.Office.Interop.Excel.Application) 
    objEXCELBook = CType(ObjEXCEL.Workbooks.Add, Microsoft.Office.Interop.Excel.Workbook) 
    objEXCELSheet = CType(objEXCELBook.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet) 

    ObjEXCEL.Visible = True 

    For numCounter = 0 To grdName.Columns.Count - 1 
     ' MsgBox(grdName.Columns(numCounter).HeaderText()) 
     If grdName.Columns(numCounter).Width > 0 Then 
      ObjEXCEL.Cells(1, numCounter + 1) = grdName.Columns(numCounter).HeaderText() 
     End If 
     ' ObjEXCEL.Cells(1, numCounter + 1) = grdName.Columns.GetFirstColumn(DataGridViewElementStates.Displayed) 
    Next numCounter 

    ObjEXCEL.Range("A:A").ColumnWidth = 10 
    ObjEXCEL.Range("B:B").ColumnWidth = 25 
    ObjEXCEL.Range("C:C").ColumnWidth = 20 
    ObjEXCEL.Range("D:D").ColumnWidth = 20 
    ObjEXCEL.Range("E:E").ColumnWidth = 20 
    ObjEXCEL.Range("F:F").ColumnWidth = 25 

    For rowNo1 = 0 To grdName.RowCount - 1 
     For colNo1 = 0 To grdName.ColumnCount - 1 
      If grdName.Columns(colNo1).Width > 0 Then 
       If Trim(grdName.Item(colNo1, rowNo1).Value) <> "" Then 
        'If IsDate(grdName.Item(colNo1, rowNo1).Value) = True Then 
        ' ObjEXCEL.Cells(numrow + 1, colNo2) = Format(CDate(grdName.Item(colNo1, rowNo1).Value), "dd/MMM/yyyy") 
        'Else 
        ObjEXCEL.Cells(numrow + 1, colNo2) = grdName.Item(colNo1, rowNo1).Value 
        'End If 
       End If 
       If colNo2 >= grdName.ColumnCount Then 
        colNo2 = 1 
       Else 
        colNo2 = colNo2 + 1 
       End If 
      End If 
     Next colNo1 
     numrow = numrow + 1 
    Next rowNo1 
15

Код ниже создает Excel файл и сохраняет его в D: диск Он использует офис Microsoft 2007

FIRST ADD REFERRANCE (библиотека объектов Microsoft Office 12.0) к вашему проекту

Затем добавьте код, приведенный ниже, в Export bu tton нажмите событийно

Private Sub Export_Button_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles VIEW_Button.Click 

    Dim xlApp As Microsoft.Office.Interop.Excel.Application 
    Dim xlWorkBook As Microsoft.Office.Interop.Excel.Workbook 
    Dim xlWorkSheet As Microsoft.Office.Interop.Excel.Worksheet 
    Dim misValue As Object = System.Reflection.Missing.Value 
    Dim i As Integer 
    Dim j As Integer 

    xlApp = New Microsoft.Office.Interop.Excel.ApplicationClass 
    xlWorkBook = xlApp.Workbooks.Add(misValue) 
    xlWorkSheet = xlWorkBook.Sheets("sheet1") 


    For i = 0 To DataGridView1.RowCount - 2 
     For j = 0 To DataGridView1.ColumnCount - 1 
      For k As Integer = 1 To DataGridView1.Columns.Count 
       xlWorkSheet.Cells(1, k) = DataGridView1.Columns(k - 1).HeaderText 
       xlWorkSheet.Cells(i + 2, j + 1) = DataGridView1(j, i).Value.ToString() 
      Next 
     Next 
    Next 

    xlWorkSheet.SaveAs("D:\vbexcel.xlsx") 
    xlWorkBook.Close() 
    xlApp.Quit() 

    releaseObject(xlApp) 
    releaseObject(xlWorkBook) 
    releaseObject(xlWorkSheet) 

    MsgBox("You can find the file D:\vbexcel.xlsx") 
End Sub 

Private Sub releaseObject(ByVal obj As Object) 
    Try 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) 
     obj = Nothing 
    Catch ex As Exception 
     obj = Nothing 
    Finally 
     GC.Collect() 
    End Try 
End Sub 
+1

это работает :) спасибо, но как добавить рабочие листы? –

+0

Вы пишете все как текст, почему? Избавьтесь от .ToString –

+0

Кроме того, цикл является неправильным подходом. Вам нужно создать массив объектов и записать его в диапазон в Excel. Никакой цикл не нужен, кроме как создать массив объектов. –

0

В режиме конструктора: Установите DataGridView1 ClipboardCopyMode свойства EnableAlwaysIncludeHeaderText

или программного кода

DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText 

В время выполнения выбрать все ячейки содержимое (Ctrl + A) и скопируйте (Ctrl + C) и вставьте в программу Excel. Позвольте Excel делать все остальное

Извините за неудобное, я искал метод для печати данных непосредственно из datagridvew (создать отчет из vb.net VB2012) и не нашел результата удовлетворенности. Выше кода только мой, хотя, задаваясь вопросом, может ли мой пользователь приложений полагаться на простой шаг, это будет хорошо, и я мог бы перейти к следующему шагу по моему прогрессу.

2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    DATAGRIDVIEW_TO_EXCEL((DataGridView1)) ' PARAMETER: YOUR DATAGRIDVIEW 
End Sub 

Private Sub DATAGRIDVIEW_TO_EXCEL(ByVal DGV As DataGridView) 
    Try 
     Dim DTB = New DataTable, RWS As Integer, CLS As Integer 

     For CLS = 0 To DGV.ColumnCount - 1 ' COLUMNS OF DTB 
      DTB.Columns.Add(DGV.Columns(CLS).Name.ToString) 
     Next 

     Dim DRW As DataRow 

     For RWS = 0 To DGV.Rows.Count - 1 ' FILL DTB WITH DATAGRIDVIEW 
      DRW = DTB.NewRow 

      For CLS = 0 To DGV.ColumnCount - 1 
       Try 
        DRW(DTB.Columns(CLS).ColumnName.ToString) = DGV.Rows(RWS).Cells(CLS).Value.ToString 
       Catch ex As Exception 

       End Try 
      Next 

      DTB.Rows.Add(DRW) 
     Next 

     DTB.AcceptChanges() 

     Dim DST As New DataSet 
     DST.Tables.Add(DTB) 
     Dim FLE As String = "" ' PATH AND FILE NAME WHERE THE XML WIL BE CREATED (EXEMPLE: C:\REPS\XML.xml) 
     DTB.WriteXml(FLE) 
     Dim EXL As String = "" ' PATH OF/ EXCEL.EXE IN YOUR MICROSOFT OFFICE 
     Shell(Chr(34) & EXL & Chr(34) & " " & Chr(34) & FLE & Chr(34), vbNormalFocus) ' OPEN XML WITH EXCEL 

    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 

End Sub 
0

Простым способом создания отчета для печати из Datagridview является размещение datagridview на объекте Panel. Можно нарисовать растровое изображение панели.

Вот как я это делаю.

'создание растрового изображения с габаритами в панели Dim ВМР As New Bitmap (Panel1.Width, Panel1.Height)

' нарисовать панель в растровом формате "BMP" Panel1.DrawToBitmap (ВМР, Panel1.ClientRectangle)

Я создаю многостраничный файл, разбивая свои элементы datagridview на страницы. вот как я обнаруживаю начало новой страницы:

«Я добавляю строки в свой файл данных по одному, а затем проверяю, активна ли полоса прокрутки. «если полоса прокрутки активен я сохранить строку переменной, а затем я удалить его из » DataGridView и откат мой счетчик число на единицу (таким образом, следующий запуск будет включать в себя этот «ряд .

Private Function VScrollBarVisible() As Boolean 
    Dim ctrl As New Control 
    For Each ctrl In DataGridView_Results.Controls 
     If ctrl.GetType() Is GetType(VScrollBar) Then 
      If ctrl.Visible = True Then 
       Return True 
      Else 
       Return False 
      End If 
     End If 
    Next 
    Return Nothing 
End Function 

Я надеюсь, что это помогает

1

следующий код работает отлично для меня :)

Protected Sub ExportToExcel(sender As Object, e As EventArgs) Handles ExportExcel.Click 
     Try 
      Response.Clear() 
      Response.Buffer = True 
      Response.AddHeader("content-disposition", "attachment;filename=ExportEthias.xls") 
      Response.Charset = "" 
      Response.ContentType = "application/vnd.ms-excel" 
      Using sw As New StringWriter() 
       Dim hw As New HtmlTextWriter(sw) 
       GvActifs.RenderControl(hw) 
       'Le format de base est le texte pour éviter les problèmes d'arrondis des nombres 
       Dim style As String = "<style> .textmode { } </style>" 
       Response.Write(Style) 
       Response.Output.Write(sw.ToString()) 
       Response.Flush() 
       Response.End() 
      End Using 
     Catch ex As Exception 
      lblMessage.Text = "Erreur export Excel : " & ex.Message 
     End Try 
    End Sub 
    Public Overrides Sub VerifyRenderingInServerForm(control As Control) 
     ' Verifies that the control is rendered 
    End Sub 

Hopes это поможет вам.

+0

Спасибо, это помогло! – JT4U

5

Метод Excel

Этот метод отличается от многих вы увидите. Другие используют цикл для записи каждой ячейки и записи ячеек с типом текстовых данных.

Этот метод создает массив объектов из DataTable или DataGridView, а затем записывает массив в Excel. Это означает, что я могу писать в Excel без цикла и сохранять типы данных.

Я извлек это из своей библиотеки, и я думаю, что я изменил его достаточно, чтобы работать только с этим кодом, но может потребоваться более мелкая настройка. Если вы получите ошибки, просто сообщите мне, и я исправлю их для вас. Обычно я создаю экземпляр своего класса и вызываю эти методы. Если вы хотите использовать мою библиотеку, используйте эту ссылку, чтобы загрузить ее, и если вам нужна помощь, просто дайте мне знать.
https://zomp.co/Files.aspx?ID=zExcel


После копирования кода на решение, которое вы будете использовать его как это.

В коде кнопки добавьте это и измените имена на свои элементы управления.

WriteDataGrid("Sheet1", grid)

Чтобы открыть файл после экспорта использовать эту линию

System.Diagnostics.Process.Start("The location and filename of your file")

В методе WriteArray вы хотите изменить строку, которая сохраняет книгу, где вы хотите, чтобы сохранить его , Возможно, имеет смысл добавить это как параметр.

wb.SaveAs("C:\MyWorkbook.xlsx")


Public Function WriteArray(Sheet As String, ByRef ObjectArray As Object(,)) As String 
    Try 
     Dim xl As Excel.Application = New Excel.Application 
     Dim wb As Excel.Workbook = xl.Workbooks.Add() 
     Dim ws As Excel.Worksheet = wb.Worksheets.Add() 
     ws.Name = Sheet 
     Dim range As Excel.Range = ws.Range("A1").Resize(ObjectArray.GetLength(0), ObjectArray.GetLength(1)) 
     range.Value = ObjectArray 

     range = ws.Range("A1").Resize(1, ObjectArray.GetLength(1) - 1) 

     range.Interior.Color = RGB(0, 70, 132) 'Con-way Blue 
     range.Font.Color = RGB(Drawing.Color.White.R, Drawing.Color.White.G, Drawing.Color.White.B) 
     range.Font.Bold = True 
     range.WrapText = True 

     range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter 
     range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter 

     range.Application.ActiveWindow.SplitColumn = 0 
     range.Application.ActiveWindow.SplitRow = 1 
     range.Application.ActiveWindow.FreezePanes = True 

     wb.SaveAs("C:\MyWorkbook.xlsx") 
     wb.CLose() 
     xl.Quit() 
     xl = Nothing 
     wb = Nothing 
     ws = Nothing 
     range = Nothing 
     ReleaseComObject(xl) 
     ReleaseComObject(wb) 
     ReleaseComObject(ws) 
     ReleaseComObject(range) 

     Return "" 
    Catch ex As Exception 
     Return "WriteArray()" & Environment.NewLine & Environment.NewLine & ex.Message 
    End Try 
End Function 

Public Function WriteDataGrid(SheetName As String, ByRef dt As DataGridView) As String 
     Try 
      Dim l(dt.Rows.Count + 1, dt.Columns.Count) As Object 
      For c As Integer = 0 To dt.Columns.Count - 1 
       l(0, c) = dt.Columns(c).HeaderText 
      Next 

      For r As Integer = 1 To dt.Rows.Count 
       For c As Integer = 0 To dt.Columns.Count - 1 
        l(r, c) = dt.Rows(r - 1).Cells(c) 
       Next 
      Next 

      Dim errors As String = WriteArray(SheetName, l) 
      If errors <> "" Then 
       Return errors 
      End If 

      Return "" 
     Catch ex As Exception 
      Return "WriteDataGrid()" & Environment.NewLine & Environment.NewLine & ex.Message 
     End Try 
    End Function 


Public Function WriteDataTable(SheetName As String, ByRef dt As DataTable) As String 
     Try 
      Dim l(dt.Rows.Count + 1, dt.Columns.Count) As Object 
      For c As Integer = 0 To dt.Columns.Count - 1 
       l(0, c) = dt.Columns(c).ColumnName 
      Next 

      For r As Integer = 1 To dt.Rows.Count 
       For c As Integer = 0 To dt.Columns.Count - 1 
        l(r, c) = dt.Rows(r - 1).Item(c) 
       Next 
      Next 

      Dim errors As String = WriteArray(SheetName, l) 
      If errors <> "" Then 
       Return errors 
      End If 

      Return "" 
     Catch ex As Exception 
      Return "WriteDataTable()" & Environment.NewLine & Environment.NewLine & ex.Message 
     End Try 
    End Function 

Я на самом деле не использовать этот метод в своей программе базы данных, потому что это медленный метод, когда у вас есть много строк/столбцов. Вместо этого я создаю CSV из DataGridView. Запись в Excel с помощью автоматизации Excel полезна только тогда, когда вам нужно форматировать данные и ячейки, иначе вы должны использовать CSV. Вы можете использовать код после изображения для экспорта CSV.

DatabaseStudio


CSV Метод

Private Sub DataGridToCSV(ByRef dt As DataGridView, Qualifier As String) 
     Dim TempDirectory As String = "A temp Directory" 
     System.IO.Directory.CreateDirectory(TempDirectory) 
     Dim oWrite As System.IO.StreamWriter 
     Dim file As String = System.IO.Path.GetRandomFileName & ".csv" 
     oWrite = IO.File.CreateText(TempDirectory & "\" & file) 

     Dim CSV As StringBuilder = New StringBuilder() 

     Dim i As Integer = 1 
     Dim CSVHeader As StringBuilder = New StringBuilder() 
     For Each c As DataGridViewColumn In dt.Columns 
      If i = 1 Then 
       CSVHeader.Append(Qualifier & c.HeaderText.ToString() & Qualifier) 
      Else 
       CSVHeader.Append("," & Qualifier & c.HeaderText.ToString() & Qualifier) 
      End If 
      i += 1 
     Next 

     'CSV.AppendLine(CSVHeader.ToString()) 
     oWrite.WriteLine(CSVHeader.ToString()) 
     oWrite.Flush() 

     For r As Integer = 0 To dt.Rows.Count - 1 

      Dim CSVLine As StringBuilder = New StringBuilder() 
      Dim s As String = "" 
      For c As Integer = 0 To dt.Columns.Count - 1 
       If c = 0 Then 
        'CSVLine.Append(Qualifier & gridResults.Rows(r).Cells(c).Value.ToString() & Qualifier) 
        s = s & Qualifier & gridResults.Rows(r).Cells(c).Value.ToString() & Qualifier 
       Else 
        'CSVLine.Append("," & Qualifier & gridResults.Rows(r).Cells(c).Value.ToString() & Qualifier) 
        s = s & "," & Qualifier & gridResults.Rows(r).Cells(c).Value.ToString() & Qualifier 
       End If 

      Next 
      oWrite.WriteLine(s) 
      oWrite.Flush() 
      'CSV.AppendLine(CSVLine.ToString()) 
      'CSVLine.Clear() 
     Next 

     'oWrite.Write(CSV.ToString()) 

     oWrite.Close() 
     oWrite = Nothing  

     System.Diagnostics.Process.Start(TempDirectory & "\" & file) 

     GC.Collect() 

    End Sub 
+0

Удивительные варианты. Я не мог открыть файл zip. ReleaseComObject() не определен в вашем опубликованном коде. –

+0

Просто зайдите в свойства zip-файла и установите его в безопасное место или что-то в этом роде. Windows делает это, потому что это произошло из Интернета. –

+0

ReleaseCOMObject - это метод в System.Runtime.InteropServices.Marshal –

Смежные вопросы