Paste tekst van Excel in DataGridView
Excel is een hele handige tool om tekst in kolommen te bewerken en beheren. Vaak wordt Excel gebruikt voor diverse conversieslagen om bijvoorbeeld coördinatenlijsten om te zetten. En zo kan het voorkomen dat je bijvoorbeeld een hele serie coördinaten in AutoCAD wilt krijgen op een bepaalde manier. Bijvoorbeeld als tekst, of als blok met attribuut. Maar het is behoorlijk bewerkelijk als je elke keer andere data binnenkrijgt en wilt converteren. Meestal moet je na het sorteren, knippen en uitlijnen van de kolommen, dit omzetten naar een script of Lisp-tool. Data kan binnenkomen als spatiegescheiden, tabgescheiden, kommagescheiden, enzovoort. Soms is de komma de decimaalscheiding, soms een punt. Het zou prettig zijn als je hier geen last van hebt bij de conversie naar AutoCAD.
Een handige functie om iets te automatiseren is de volgende functie.
Imports System.Windows.Forms
Imports System.Text
' This function will paste text data from Clipboard into a DataGridView. The function will seperate the lines
' by a newline char and seperate colums by a given char. The function will create as many colums as needed.
Public Shared Function hzPasteClipboardTextIntoDGV(ByVal strColumSep As Char, ByRef dgvGrid As DataGridView) As Boolean
Dim intColumnCount As Integer = 0 ' current colums
If Clipboard.GetDataObject.GetDataPresent(DataFormats.Text) Then
' We have text data. We'll split by a newline.
Dim strClipboardDataArray() As String = Clipboard.GetText.Split(vbCrLf)
' Empty the DGV
dgvGrid.ColumnCount = 0
' Loop through the lines and seperate values by char.
For Each strClipboardDataRow As String In strClipboardDataArray
' Split into colums and count how many. We get an array of values per line. After evaluating the
' amount of values, we extend the colums in the DGV, after that, we paste the array.
Dim strClipboardDataRowArray() As String = strClipboardDataRow.Split(strColumSep)
If UBound(strClipboardDataRowArray) + 1 > intColumnCount Then
intColumnCount = UBound(strClipboardDataRowArray) + 1
dgvGrid.ColumnCount = intColumnCount
End If
' Paste the array of values into DGV
dgvGrid.Rows.Add(strClipboardDataRowArray)
Next
' There was text data to paste. Return True.
Return (True)
Else
' There is no text data to paste. Return False.
Return False
End If
End Function
In combinatie met een handige tool in AutoCAD kun je hier leuke dingen mee. We maken in VB.Net een Class en voegen een Form toe. In dit Form plaatsen we een DataGridView en een knop. De knop zorgt voor het plakken van het klembordgeheugen. Dit is overigens ook te ondervangen met een CTRL+V of de rechter muisknop op het DataGridView.

De handigheid is dat je in Excel geen export meer hoeft te doen. Je importeert je ingekomen data in Excel, je sloopt er kolommen af, sorteert het een en ander, converteert eventueel nog tekst of getallen naar andere formaten en dan kopieer je de tekst naar het klembord. In je tool verwijs je de knop naar bovenstaande functie. Zoals hieronder:
Private Sub btnPasteFromExcel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPasteFromExcel.Click
If Clipboard.GetDataObject.GetDataPresent(DataFormats.Text) Then
If Not hzPasteClipboardTextIntoDGV(vbTab, dgvImportedFromExcel) = True Then
MsgBox("Er is iets mis gegaan.")
End If
Else
MsgBox("Er is geen data om te plakken.")
End If
End Sub
Omdat data uit Excel in het klembord wordt gescheiden door een tab, is het eenvoudig om de regels uit te lezen als tekst en te splitsen op tabs. Deze zijn dan eenvoudig in te lezen in je DataGridView. In de functie is gelijk opgenomen dat het aantal kolommen uitgebreid moet worden als er meer waarden op een regel staan. Je hoeft vooraf dus niet te weten hoeveel kolommen je hebt en je bent daarin ook niet beperkt.
Uiteraard kun je nog extra conversies inbouwen. Bijvoorbeeld dat een komma vervangen moet worden door een punt. Dat kan handig zijn bij coördinaten met een decimale komma. Of een automatische doornummering. Hoewel dat laatste ook weer eenvoudig gaat in Excel. Gemak moet de mens dienen dus moet je goed kijken wat je wel of niet programmeert. Soms is een handige uitbreiding gelijk de doodsteek voor flexibiliteit.
Nadat je op deze wijze je data uit Excel in je DataGridView hebt, is het eenvoudig om zelf te verzinnen om dit in AutoCAD te krijgen. Op de wijze waarop je het liefst je data ziet.