2016-05-23 3 views
0

Может ли кто-нибудь помочь мне импортировать данные из datagridview в Microsoft Excel вместе с именами столбцов и данными. И еще одна вещь - дата становится хэштегами. Мне нужно развернуть столбец, чтобы показать дату.Экспорт из datagridview в excel vb.net

У меня есть кнопка, и когда я нажимаю ее, Microsoft Excel должен открыться с экспортированными данными.

+1

Возможный дубликат http://stackoverflow.com/questions/680199/how-to-export-datagridview-to-excel-using-vb-net –

+0

Если вы экспортируете много данных, тогда это будет более эффективно для создания CSV-файла, затем откройте его с помощью Excel. Я могу показать вам код для этого, если хотите. У меня также есть библиотека, которая обертывает автоматизацию Excel. Он содержит метод, который записывает DataTable в Excel. Я предполагаю, что у вашего DataGridView есть источник данных DataTable. –

ответ

-1

Метод 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

то что я надену в свою кнопку? я сожалею, но я новичок в vb.net – catchyourwaves

+0

'WriteDataTable (" Sheet1 ", dt)' - Вам придется преобразовать это, чтобы использовать DataGridView, что не сложно. –

+0

Этот код не будет работать без остальной части моей библиотеки. Он призван помочь вам написать свои собственные, но не стесняйтесь использовать мою библиотеку. - https://zomp.co/Files.aspx?ID=zExcel –

-1

Вот еще одно решение, которое вы можете попробовать, он использует GemBox.Spreadsheet библиотеку, и она будет держать тип данных и форматирование, которое используется в DataGridView:

Dim ef As New ExcelFile() 
Dim ws = ef.Worksheets.Add("DGV Sheet") 

' From DataGridView to ExcelFile. 
DataGridViewConverter.ImportFromDataGridView(ws, dataGridView1, 
    New ImportFromDataGridViewOptions() With {.ColumnHeaders = True}) 

' Auto fit excel columns. 
Dim count As Integer = ws.CalculateMaxUsedColumns() 
For index As Integer = 0 To count - 1 
    ws.Columns(index).AutoFit() 
Next 

ef.Save("DGV Book.xlsx") 

Также here вы можете найти другой образец.

+0

Бесплатная версия позволяет экспортировать только 150 строк. Вы можете легко сделать то, что делает эта библиотека. Фактически, я предоставил этот код. –

+0

Да, вы правы, свободный режим имеет ограничение по размеру. Тем не менее, этого было достаточно для моих потребностей и, надеюсь, это и для OP. Что касается вашего комментария, я не уверен, что вы можете легко делать то, что делает эта библиотека. Прежде всего, вы можете выбрать формат, который вы хотите (CSV, XLS, XLSX, ODS и т. Д.), Во-вторых, он сохранит стиль и форматирование, которые используются в DataGridView (например, жирный, курсив, цвет, выравнивание и т. Д.). , в-третьих, он не экспортирует только текстовые данные, а также гиперссылки, изображения и т. д. – Phouttrat

+0

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

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