Moi, ce que je fais est de créer un objet Excel: alors je parcours les cellules du Datagrid et je crée une chaine (a travers un StringBuilder) que j'insère dans le Worksheet en utilisant le Clipboard:
Dim sbClip As New StringBuilder, txt As String
For iRow = 0 To Rows - 1
For iCol = 0 To Colmax - 1
txt = dg.Item(iRow, iCol)
txt = txt.Replace(vbTab, " ")
txt = txt.Replace(vbCrLf, " ")
sbClip.Append(dg.Item(iRow, iCol) & vbTab)
Next
sbClip.Append(dg.Item(iRow, iCol) & vbCrLf) ' CRLF instead of final tab
Next
Dim Clip As String = sbClip.ToString
rng = ws.Cells(7, 1)
Clipboard.SetDataObject(Clip)
rng.PasteSpecial(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteAll)
' Do an Autofit on the first 40 rows (or less if < 40)
Dim s As String = Chr(Colmax + 65)
Dim r As Integer = Math.Min(Rows, 40)
s &= CStr(r + 7)
rng = ws.Range(FirstFormatColumn & "7:" & s)
rng.EntireColumn.AutoFit()
Excel.Visible = True
wb.Activate()
Rows = Rows.Count de DataTable qui est le DataSource de mon Datagrid
rng = excel Range - je choisis la cellule 7,1 parce que j'ai déja inseré quelques lignes d'entete
ColMax = dans certains cas, je veux montrer seulement les premiers n colonnes - colmax = n -1
FirstFormatColumn = lettre qui indique le commencement du Range qui sera sujet au Autofit.
L'utilisateur peut donc imprimer comme il voudra.