Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Excel -> Stringgrid = Umlauteproblem
D. Annies - Di 22.04.08 16:02
Titel: Excel -> Stringgrid = Umlauteproblem
Hi, Delpher,
hab im Netz nichts gefunden zu folgendem Problem:
Ich lese eine ExcelTabelle in ein Stringgrid ein - klappt super, wenn in dem Feldinhalt (also in der Excelzelle) kein Umlaut vorkommt. Ist das der Fall, wird der Eintrag vollständig unterdrückt, also bei c1r1 Tanja c2r1 Möller sehe ich nur c1r1 Tanja und die Zelle c2r1 ist leer.
Wer weiß dazu eine Lösung?
Vielen Dank für Hilfe,
Detlef
Narses - Di 22.04.08 16:17
Moin!
Lies doch die Zelle mal in eine temp. StringVar aus und gib sie mit ShowMessage aus, um auszuschließen, dass das StringGrid irgendwelche Probleme mit dem Inhalt hat. Zumindest ein erster Schritt... :?
cu
Narses
D. Annies - Di 22.04.08 18:46
Hi, Narses,
vielen Dank für deine Idee!
Ich habe in der Zwischenzeit Folgendes gemacht: Ich habe die Tabelle eingelesen, die "fehlenden" - mir aber zum Glück bekannten Namen - eingetragen .. options := options + [goediting] ... , abgespeichert und wieder eingelesen, und siehe da, alles bestens! Also, wer weiß, mit welchem Programm / auf welche Weise die Daten mal abgespeichert wurden. Die Schriftart war nämlich auch gleich.
So geht's - es lebe Delphi und ver... sei MicroSchrott!
Grüße,
Detlef
D. Annies - So 04.05.08 12:20
Hi, Delpher,
ich muss mich noch einmal zu diesem Problem melden.
Die Excel-Tabelle lese ich mit folgendem Code ein:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| function TForm4.Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean; const xlCellTypeLastCell = $0000000B; var XLApp, Sheet : OLEVariant; RangeMatrix : Variant; x, y, k, r : Integer; begin Result := False; XLApp := CreateOleObject('Excel.Application'); try XLApp.Visible := False; XLApp.Workbooks.Open(AXLSFile); Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1]; Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; x := XLApp.ActiveCell.Row; y := XLApp.ActiveCell.Column; AGrid.RowCount := x; AGrid.ColCount := y; RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
k := 1; repeat for r := 1 to y do AGrid.Cells[r-1, k-1] := vartowidestr(RangeMatrix[K, R]); Inc(k, 1); AGrid.RowCount := k + 1; until k > x; RangeMatrix := Unassigned; finally if not VarIsEmpty(XLApp) then begin XLApp.Quit; XLAPP := Unassigned; Sheet := Unassigned; Result := True; end; end; end; |
Ich habe sie vorher mit Delphi erstellt. Aber, wie gesagt, ein Zellinhalt, der einen Umlaut enthält, wird nicht dargestellt - verschluckt (siehe oben).
Wer kann dieses Problem lösen?
Zum Ausprobieren dient die angehängte Exceltabelle.
Vielen Dank für eine Hilfe, bzw. Lösung!
Detlef A.
D. Annies - Di 06.05.08 10:13
Ein Nachtrag:
Wenn ich einen "verschluckten" Namen nachträglich ins Stringgrid eintrage, abspeichere und mir mit Excel ansehe, werden Zeichen von der Art Ä1/4 usw. angezeigt.
Welche Einstellung passt da nicht?
Gruß, Detlef
Narses - Di 06.05.08 10:34
Moin!
D. Annies hat folgendes geschrieben: |
| for r := 1 to y do AGrid.Cells[r-1, k-1] := vartowidestr(RangeMatrix[K, R]);Wer kann dieses Problem lösen? |
Hm, kann es sein, dass das ein MBCS-Problem ist? :? Schätze, das TStringGrid ist nicht der Lage, einen WideString korrekt dazustellen. :nixweiss:
cu
Narses
D. Annies - Di 06.05.08 13:28
Hi, Narses,
vielen Dank für deine Antwort (bist ja wohl der Einzige, der dazu überhaupt etwas sagen kann .. aber wie sagte schon Einstein: Ein einziger reicht!)
Nun, aufgrund deiner Aussage habe ich alles noch einmal überprüft: Stutzig wurde ich als Showmessage den Umlaute-Namen richtig ausgeben konnte - und dann habe ich den Fehler gesehen: Als Übergabeparameter war ein TStringgrid angegeben, aber es musste ein TTntStringgrid sein (wegen Unicode) und jetzt klappt alles bestens !!! :dance2: :dance: :dance2: :mrgreen:
Juhu, Detlef
D. Annies - Mi 07.05.08 09:19
Kleiner Nachtrag:
Ich habe den Code noch etwas vereinfacht (?)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
|
for k := 0 to x-1 do for r := 0 to y-1 do AGrid.cells[r,k] := XlApp.cells[k+1,r+1]; |
Vielleicht ist er so leichter lesbar statt mit RangeMatrix.
Detlef
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!