Datagridview Export zu Word fehlt eine Decimal stelle

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von andi-n.

    Datagridview Export zu Word fehlt eine Decimal stelle

    Hallo,

    ich habe in Form1 2 DGV, von DGV1 kopiere ich die markierte Zeile in DGV2.
    DGV1 ist gebunden, Daten kommen von einer Access Datenbank, DGV2 ist ungebunden.
    Alles wird richtig angezeigt in DGV2 auch die 2 Spalten " E-Preise u. Summe " mit Währungen € und 2 Decimal stellen.
    Nun, wenn ich die Daten von DGV2 zu Word exportiere passiert folgendes:

    1) in DGV2 stehen zum Beispiel in Spalte E-Preise der Betrag 133,60 € in Word kommt das raus 133,6 es fehlt die 0 .
    2) "" "" "" "" "" "" "" "" "" "" 10,00 € "" "" "" "" "" 10 es fehlt das komma und die zwei 00 .

    Es fehlt immer die Null dahinter ....

    Habe es mit 2 verschiede Code's zum Testen versucht zum Exportieren nach Word aber immer das selbe.

    Hier der erste Code:

    Visual Basic-Quellcode

    1. Private Sub Button7_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    2. Dim r As Integer, c As Integer
    3. Dim oTable As Word.Table = objDoc.Tables.Add(objDoc.Bookmarks.Item("\endofdoc").Range,
    4. Datagridview2.RowCount, Datagridview2.ColumnCount, Datagridview2.ColumnHeadersVisible = True)
    5. For r = 0 To Datagridview2.RowCount - 2
    6. For c = 0 To Datagridview2.Columns.Count - 1
    7. If Datagridview2.Rows(r).Cells(4).Value IsNot DBNull.Value Then
    8. sum += Datagridview2.Rows(r).Cells(4).Value
    9. End If
    10. objDoc.Tables(1).Cell(r + 1, c + 1).Range.Text = Datagridview2(c, r).Value.ToString
    11. Next
    12. Next
    13. Dim oCell As Cell
    14. oTable = objDoc.Tables(1)
    15. For Each oCell In oTable.Range.Cells
    16. If oCell.RowIndex > 0 Then
    17. Select Case oCell.ColumnIndex
    18. Case 1
    19. oCell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter
    20. oCell.Range.Font.Color = WdColor.wdColorBrown
    21. oCell.Range.Font.Bold = False
    22. oCell.Range.Columns.Width = 65
    23. Case 2
    24. oCell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter
    25. oCell.Range.Font.Color = WdColor.wdColorDarkYellow
    26. oCell.Range.Font.Bold = False
    27. oCell.Range.Columns.Width = 35
    28. Case 3
    29. oCell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft
    30. oCell.Range.Font.Color = WdColor.wdColorDarkTeal
    31. oCell.Range.Font.Bold = False
    32. oCell.Range.Columns.Width = 280
    33. Case 4
    34. oCell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight
    35. oCell.Range.Font.Color = WdColor.wdColorBrown
    36. oCell.Range.Font.Bold = False
    37. oCell.Range.Columns.Width = 70
    38. Case 5
    39. oCell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight
    40. oCell.Range.Font.Color = WdColor.wdColorRed
    41. oCell.Range.Font.Bold = False
    42. oCell.Range.Columns.Width = 70
    43. End Select
    44. End If
    45. Next
    46. End Sub


    Hier der zweite Code :

    Visual Basic-Quellcode

    1. Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.Click
    2. Dim objWord As Word.Application
    3. Dim objDoc As Word.Document
    4. objWord = CreateObject("Word.Application")
    5. objWord.Visible = True
    6. objWord.WindowState =
    7. Word.WdWindowState.wdWindowStateNormal
    8. objDoc = objWord.Documents.Add
    9. Dim objPara As Word.Paragraph
    10. Dim i As Integer
    11. 'For i = 1 To 5
    12. For i = 0 To DataGridView1.ColumnCount - 1
    13. objPara = objDoc.Paragraphs.Add
    14. objPara.Range.Text = DataGridView1.Rows(i).Cells(0).Value & " " & DataGridView1.Rows(i).Cells(1).Value & " " & DataGridView1.Rows(i).Cells(2).Value & " " & DataGridView1.Rows(i).Cells(3).Value & " " & DataGridView1.Rows(i).Cells(4).Value & " " & DataGridView1.Rows(i).Cells(5).Value & " " & DataGridView1.Rows(i).Cells(6).Value & " " & DataGridView1.Rows(i).Cells(7).Value & " " & DataGridView1.Rows(i).Cells(8).Value
    15. objPara.Range.InsertParagraphAfter()
    16. Next
    17. End Sub


    Wie gesagt in DGV1 und DGV2 wird alles richtig angezeigt, finde den Fehler nicht.

    Gruß Andi
    @andi-n
    Mir scheint, Du programmierst in VB.NET, nicht aber in VB6.
    Ändere mal fix den Titel dieses Deines Threads.
    Was für Daten überträgst Du denn nach Word?
    - Datentyp,
    - Format
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi RodFromGermany,

    sorry das mit VB6 war ein versehen,

    Ich übertrage folgende Spalten :

    Aston-Nr. = Text da auch Buchstaben vorkommen
    Menge = Zahl
    Artikelbezeichnung = Text
    E-Preise = Währung mit 2 Decimal stellen und €
    Summe = Währung mit 2 Decimal stellen und €

    In der Access Datenbank und DGV1, DGV2 das selbe

    Gruß
    Andi
    Setz mal im 2. Snippet in Zeile 17 einen Haltepunkt und gib im Überwachen-Fenster DataGridView1.Rows(i).Cells(0).Value ein.
    Wird da das Euro-Zeichen mit angezeigt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,
    habe Haltepunk gesetzt bei Zeile 17....
    kein Euro Zeichen es kommt dabei dieses raus :

    DataGridView1.Rows(i).Cells(0).Value "6.010024" Object {String}
    DataGridView1.Rows(i).Cells(1).Value "20.01.746" Object {String}
    DataGridView1.Rows(i).Cells(2).Value "XHA2" Object {String}
    DataGridView1.Rows(i).Cells(3).Value "Filter,Öl DB24/4/5/6 Mann{Mahle" Object {String}
    DataGridView1.Rows(i).Cells(4).Value "08.08.24" Object {String}
    DataGridView1.Rows(i).Cells(5).Value "L001" Object {String}
    DataGridView1.Rows(i).Cells(6).Value 3 Object {Double}
    DataGridView1.Rows(i).Cells(7).Value 20.45 Object {Double}
    DataGridView1.Rows(i).Cells(8).Value 61.349999999999994 Object {Double}

    In Code 2 übertrage ich alle Cells von 1-8

    In Code 1 übertrage ich nur Cells 1, 3, 6, 7 und 8

    Gruß
    Andi
    Sorry, ich hatte zumindest Deine Geld-Werte erwartet, die sehen da wohl analog aus.
    Wie sieht denn Deine Formatierung in Word aus, was @petaod ansprach?
    Ich hatte ein ähnliches Problem in Excel, da half auch nur die Formatierung in Excel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi RodFromGermany,

    es gibt in Word keine Formatierung, ich erstelle das Word Dokument aus einer leeren Vorlage.
    Alle Daten , Adressen, Tabelle habe ich im VB Net Code hinterlegt und wird in Word eingefügt.
    Was vielleicht mein Vermutung sein könnte ist ich habe Testweise eine neue Access Datenbank angelegt
    auch mit den 2 Spalten E-Preis und Summe, beide habe ich mit Währung und 2 Decimal stellen hinterlegt.
    Im DGV wird wieder alles richtig angezeigt nur beim Export zu Word nicht.
    Ich glaube langsam das es am DGV selber liegt das dies ein Problem mit Export zu Word hat oder bei
    Imports Microsoft.Office.Interop
    Imports Microsoft.Office.Interop.Word zu tun hat.
    Weiß keinen Rat mehr, komme nicht weiter, alles andere wird richtig Übertragen nur die Währung nicht.

    Gruß
    Andi
    Du trägst in Word Text ein.
    Dan kannst du vorher formatieren.

    andi-n schrieb:

    objPara.Range.Text = DataGridView1.Rows(i).Cells(0).Value & " " & DataGridView1.Rows(i).Cells(1).Value

    VB.NET-Quellcode

    1. objPara.Range.Text = DataGridView1.Rows(i).Cells(0).Value.ToString("0.00") & " " & DataGridView1.Rows(i).Cells(1).Value.ToString("0.00 €")

    Du kannst auch andere Formate wie z.B. ​C2 verwenden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi petaod,

    diese und andere Varianten hatte ich auch schon mal versucht, immer das gleiche Problem :(
    Auf was ich heute gestoßen bin zufällig ist, ich Kopiere ja von DGV1 die Selectierten Zeilen nach DGV2
    wo ja alles Super funktioniert, auch die Währung € und Decimal werden mir korrekt angezeigt in DGV2
    nur bei Export zu Word eben nicht.
    Nun habe ich mal Testweise bevor ich DGV2 nach Word Exportiere in der Spalte E-Preise " habe ja den Wert von 133,60 € von DGV1 übernommen "
    diesen mal entfernt und in DGV2 manuell Neu eingeben.
    Dann auf Word Exportieren geklickt und schon hat es funktioniert, in Word kam dann 133,60 raus allerdings ohne € Zeichen aber immerhin.
    Das ist natürlich nicht die Lösung da ich ja in DGV2 bis zu 50 Teile mit E-Preise teilweise habe und diese manuell zu ändern ist ja verrückt.
    Verstehe das überhaupt nicht, wenn ich es manuell überschreibe in DGV2 geht es, wenn nicht fehlen die Decimal stellen.
    Das muss doch am DGV selber liegen oder verstehe ich was falsch ? .

    Gruß
    Andi
    Hi petaod,

    es betrifft im DGV2 die Spalte " E-Preise = Cell (4) und Gesamt = Cell (5) " beide im DGV2 mit Währung € und 2 Decimal stellen.

    hier der mal der Code zum hinzufügen von DGV1 zu DGV2 :

    VB.NET-Quellcode

    1. Dim d, f As Integer
    2. For f = 0 To DataGridView1.Columns.Count - 1
    3. Next
    4. For d = 0 To DataGridView1.Rows.Count - 1
    5. If DataGridView1.Rows(d).Cells(1).Selected Then
    6. DataGridView1.Rows(d).Cells(8).Value = DataGridView1.Rows(d).Cells(7).Value * DataGridView1.Rows(d).Cells(6).Value
    7. Datagridview2.Rows.Add(DataGridView1.Rows(d).Cells(1).Value, DataGridView1.Rows(d).Cells(6).Value, DataGridView1.Rows(d).Cells(3).Value, DataGridView1.Rows(d).Cells(7).Value, DataGridView1.Rows(d).Cells(8).Value, DataGridView1.Rows(d).Cells(5).Value, DataGridView1.Rows(d).Cells(6).Value, DataGridView1.Rows(d).Cells(7).Value, DataGridView1.Rows(d).Cells(8).Value)
    8. 'DataGridView1.Rows(c).Cells(8).Value = DataGridView1.Rows(c).Cells(7).Value * DataGridView1.Rows(c).Cells(6).Value
    9. Datagridview2.Columns(0).Visible = True
    10. Datagridview2.Columns(1).Visible = True
    11. Datagridview2.Columns(2).Visible = True
    12. Datagridview2.Columns(3).Visible = True
    13. Datagridview2.Columns(4).Visible = True
    14. 'Datagridview2.Columns(5).Visible = False
    15. 'Datagridview2.Columns(6).Visible = True
    16. 'Datagridview2.Columns(7).Visible = True
    17. 'Datagridview2.Columns(8).Visible = True
    18. End If
    19. Next


    Gruß
    Andi
    Hi petaod,

    es ist nur DGV1 gebunden, DGV ist ungebunden.
    Im DGV2 steht jetzt in E-Preis und Gesamt 133,60 €
    Beim Debuggen kommt aber 133,6 raus genau wie bei Word.

    Artikel-Nr. Menge Artikel-Bezeichnung E-Preise Gesamt
    B.502 1 Side vent finisher-LH 133,6 133,6

    Kann es einfach nicht mehr verstehen, wie gesagt wenn ich den Wert 133,60 € im DGV2 manuell
    mit 133,60 eingebe kommt auch bei Word 133,60 raus,allerdings ohne € Zeichen.

    Gruß
    Andi

    andi-n schrieb:

    Beim Debuggen kommt aber 133,6 raus genau wie bei Word.
    Das habe ich erwartet.
    Deshalb musst du diese Zahlenwerter jeweils beim Schreiben als Word-Text formatieren wie bereits in Post #11 vorgeschlagen.
    .ToString("0.00 €")
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi petaod,

    deinen .ToString("0.00 €") hatte ich ja schon versucht aber das war das gleich Negative Ergebnis.
    Habe gerade vor 10 Minuten die Lösung, Problem gefunden, funktioniert jetzt alles Perfekt.
    Denke das wird dir in Zukunft auch helfen oder in einem deiner Programme was ändern.
    Wenn du möchtest schicke ich dir die Lösung die gerade bei mir besonders war.

    Gruß
    Andi

    andi-n schrieb:

    Wenn du möchtest schicke ich dir die Lösung die gerade bei mir besonders war.
    Ja, gerne.
    Aber besser wäre, die Lösung hier zu publizieren, dann hat jeder etwas davon, der dieses Problem irgendwann mal hat.
    Das ist der eigentliche Sinn des Forums.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi petaod,

    erstmal Vielen Vielen Dank für deine Unterstützung und Hilfsbereitschaft zu meinem Problem :)

    Wie meinst du das mit publizieren ?, reicht es wenn ich dir die Lösung sende
    oder muss ich was anderes machen ?

    Hier mal eine Beschreibung der diesen Fehler verursachte :

    Das grundlegende Problem betrifft hierbei die Datentypen und das Verständnis, wie der Computer den Unterschied zwischen Zahlentypen und Zeichenfolgen erkennt.

    Der tatsächliche Wert, der für Ihr DataGridView bereitgestellt wird, ist (hoffentlich) eine Dezimalzahl (es könnte auch eine Double-/Float-/usw.-Zahl sein, aber bei der Arbeit mit Geld ist nur die Dezimalzahl korrekt ).

    Wenn Sie einen gut formatierten Wert wie auf dem Bildschirm sehen 11,60 €, sehen Sie eine Zeichenfolge und keine Dezimalzahl. Sie erhalten diese Zeichenfolge, weil die DataGridView so konfiguriert ist, dass diese Spalte als Währung behandelt und entsprechend formatiert wird. Der tatsächliche Wert in der Zelle ist jedoch immer noch eine Binärzahl ohne jegliches für Menschen lesbares Format.

    MS Word kennt Ihre DataGridView-Formatierung jedoch nicht. Es sieht nur den Wert. Es weiß nicht, dass der Wert Geld darstellt, führt also eine einfache Konvertierung in eine Zeichenfolge durch, anstatt eine schön formatierte Konvertierung in eine Zeichenfolge, die eine Währung darstellt.

    Um dies zu beheben, sollten Sie im Voraus überlegen, welche Art von Zeichenfolge Sie für jede Spalte erstellen müssen. Dann können Sie entweder .ToString()den Originalwert mit der entsprechenden Formatzeichenfolge aufrufen. Oder Sie können beim Exportieren für Word die FormattedValue Eigenschaft in der Rasterzelle anstelle der Basiseigenschaft betrachten Value.

    Die Lösung betraf in meinen fall dieser Code Abschnitt:

    VB.NET-Quellcode

    1. Dim r As Integer, c As Integer
    2. Dim oTable As Word.Table = objDoc.Tables.Add(objDoc.Bookmarks.Item("\endofdoc").Range,
    3. Datagridview2.RowCount, Datagridview2.ColumnCount, Datagridview2.ColumnHeadersVisible = True)
    4. For r = 0 To Datagridview2.RowCount - 2
    5. For c = 0 To Datagridview2.Columns.Count - 1
    6. objDoc.Tables(1).Cell(r + 1, c + 1).Range.Text = Datagridview2(c, r).FormattedValue <---- die Lösung ---> Fehler Value.ToString()
    7. Next
    8. Next
    9. Danke nochmal...
    10. Gruß Andi


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „andi-n“ ()