0

Я могу быть слепым, но это немного отличается от обычного экспорта в Excel. Я создал решение и хотел бы знать, является ли это наилучшим способом. Или даже если есть другой способ сделать это.Экспорт отображаемых столбцов в dataGridView в Excel

Фон: WinForms, VisualBasic, VS2012, N-Tier (backend - DB2). Мои DTO настроены по порядку таблиц DB2. Мои пользователи хотят видеть поля в определенном порядке в DGV и иметь возможность экспортировать поля в том же порядке. Пользователи также могут изменять и скрывать столбцы. Скрытые столбцы не должны экспортироваться.

Мое решение делает обычную копию поля dgv по полю, чтобы преуспеть. Разница в том, что мне пришлось использовать DataGridViewColumnCollection, чтобы я мог использовать DataGridViewElementStates.Visible, чтобы убедиться, что я только экспортирую видимые столбцы.

Вот код.

Private Sub ExportToExcelToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExportToExcelToolStripMenuItem.Click 
    If((dgv.Columns.Count = 0) Or (dgv.Rows.Count = 0)) Then Exit Sub 
    Dim XlApp = New Excel.Application With {.Visible = True} 
    xlApp.Workbooks.Add(Excel.XlSheetType.xlWorksheet) 
    Dim xlWS = xlApp.ActiveSheet 
    xlWS.Name = "Exported Data" 

    'Copy visible data from DGV to Excel 
    Dim columnCollection As DataGridViewColumnCollection = dgv.Columns 
    Dim currentVisibleColumn AS DataGridViewColumn = columnCollection.GetFirstColumn(DataGridViewElementStates.Visible) 
    Dim lastColumnExported As DataGridViewColumn = currentVisibleColumn 
    Dim visibleColumntCount As Integer = columnCollection.GetColumnCount(DataGridViewElementStates.Visible) 

    'Finally export the data 
    For c = 1 to VisibleColumnCount 
    xlWS.Cells(1,c) = currentVisibleColumn.HeaderText 
    currentVisibleColumn = columnCollection.GetNextColumn(lastColumnExported, DataGridViewElementStates.Visible, DataGridViewElementStates.None) 
    lastColumnExported = currentVisibleColumn 
    Next 

    'Only export visible cells 
    For r = 0 To dgv.Rows.Count - 1 
    'Reset values 
    currentVisibleColumn = columnCollection.GetFirstColumn(DataGridViewElementStates.Visible) 
    lastColumnExported = currentVisibleColumn 
    For c = 1 to visibleColumnCount 
     Dim value = dgv.Rows(r).Cells(currentVisibleColumn.Index).Value 
     If value <> vbNullString Then 
      xlWS.Cells(r + 2, c) = value.ToString() 
     End If 
     currentVisibleColumn = columnCollection.GetNextColumn(lastColumnExported, DataGridViewElementStates.Visible, DataGridViewElementStates.None) 
     lastColumnExported = currentVisibleColumn 
    Next 
    Next 

    'Autosize columns in excel 
    Dim columns = xlWS.UsedRange.Columns 
    columns.AutoFit() 
End Sub 

Благодарим вас за отзыв. Брайан.

+0

Что именно ваш вопрос? Это просто «был ли этот код хорошо написан»? – davidsbro

+0

Вопрос в том, «Есть ли другой способ сделать это, который работает лучше? Или это способ сделать это?» Впервые я столкнулся с этой ситуацией, поэтому хочу, чтобы я делал все правильно. – PHBeagle

ответ

0

Theres - это более простой способ сделать это, и он должен выполнять if statmente на каждой итерации процесса копирования ячеек. Вы спрашиваете, является ли этот столбец в этом индексе видимым, если видно, что вы скопируете еще что-нибудь, вы можете пропустить этот столбец и сделать следующий.

0

спасибо это работает только пришлось изменить две строки

Если значение равно vbNullString Тогда

  ElseIf value IsNot vbNullString Then 
Смежные вопросы