Fritzbox Telefonbuch - XML-Importdatei aus Excel erstellen
PeterleB (Level 2) - Jetzt verbinden
06.10.2019, aktualisiert 24.10.2019, 9653 Aufrufe, 30 Kommentare
Das Thema geistert schon seit Jahren durch verschiedene Foren.
Habe mich jetzt mal damit etwas intensiver befasst und hoffe, niemanden damit zu langweilen.
Also: Eine Excel-Datei mit 5 Spalten erstellen.
Z. Bsp
Name (realName) Telefon privat (home) Telefon geschäftlich (work) Telefon mobil (mobile) Fax (fax_work)
Die Spalten sollten als Text formatiert sein, dann lassen sich die die Telefonnummern besser eingeben (führende Null oder Pluszeichen).
Eine Formatierung bzw. Validierung der Nummern soll auch noch eingebaut werden.
Über Entwicklertools ein neues Makro anlegen und folgenden Code einfügen:
Wenn man die erstellte XML-Datei in der Fritzbox zur Wiederherstellung des Telefonbuches benutzt, ergänzt die FB-Software selbst fehlende Bezeichner und Tags.
Achtung! Das vorhandene Telefonbuch wird immer überschrieben.
Nächster Schritt im Code wird das Ausfiltern leerer Zellen und Überlegungen zu weiteren sinnvollen Tags.
Und auch ein Import einer FB-Sicherungsdatei des Telefonbuches ist mittelfristig geplant.
Viel Vergnügen beim Anwenden und Experimentieren.
Für Hinweise bin ich sehr dankbar.
Viele Grüße
Peter
Habe mich jetzt mal damit etwas intensiver befasst und hoffe, niemanden damit zu langweilen.
Also: Eine Excel-Datei mit 5 Spalten erstellen.
Z. Bsp
Name (realName) Telefon privat (home) Telefon geschäftlich (work) Telefon mobil (mobile) Fax (fax_work)
Die Spalten sollten als Text formatiert sein, dann lassen sich die die Telefonnummern besser eingeben (führende Null oder Pluszeichen).
Eine Formatierung bzw. Validierung der Nummern soll auch noch eingebaut werden.
Über Entwicklertools ein neues Makro anlegen und folgenden Code einfügen:
Sub XML_Export()
Dim strDateiname As String
Dim strDateinameZusatz As String
Dim strMappenpfad As String
Dim intCutExt
'Datename ohne Ext. (nach Punkt suchen):
intCutExt = Len(ActiveWorkbook.Name) - InStrRev(ActiveWorkbook.Name, ".") + 1
strMappenpfad = Left(ActiveWorkbook.FullName, Len(ActiveWorkbook.FullName) - intCutExt)
'strDateinameZusatz = "-" & Year(ActiveSheet.Cells(3, 1).Value) & "-" & Month(ActiveSheet.Cells(3, 1).Value) & ".xml"
strDateinameZusatz = "-" & Format(Now, "YYYY-MM-DD-HH-MM-SS") & ".xml"
strDateiname = InputBox("Bitte den Namen der XML-Datei angeben.", "XML-Export", strMappenpfad & strDateinameZusatz)
If strDateiname = "" Then Exit Sub
Range("A2").Select
'Erstellt die Telefonbuchdatei (hier: xxx.xml)
'Dateiname kann frei gewählt werden
'Der entsprechende Ordner MUSS vorhanden sein, da sonst ein Fehler auftritt
Set fs = CreateObject("scripting.filesystemobject")
Set a = fs.createtextfile(strDateiname, True)
'Schreibt den allgemeinen Teil der Telefonbuchdatei
a.writeline ("<?xml version=" & """1.0""" & " encoding=" & """utf-8""" & "?>")
a.writeline ("<phonebooks>")
a.writeline ("<phonebook>")
'a.writeline ("<phonebook name=" & """Telefonbuch 1""" & " owner=" & """1""" & ">")
'Schleife zur Ermittlung aller Einträge
'Benutzt alle Datensätze, die einen Namen enthalten
i = 0
While ActiveCell.Offset(i, 0) <> ""
Dim realName As String
realName = ActiveCell.Offset(i, 0)
Dim home As String
home = ActiveCell.Offset(i, 1)
Dim work As String
work = ActiveCell.Offset(i, 2)
Dim mobile As String
mobile = ActiveCell.Offset(i, 3)
Dim fax_work As String
fax_work = ActiveCell.Offset(i, 4)
'Schreibt den Telefonbucheintrag
a.writeline ("<contact><category>0</category>")
a.writeline ("<person><realName>" + realName + "</realName></person><telephony>")
a.writeline ("<number type=" & """home""" & " prio=" & """1""" & " id=" & """0""" & ">" + home + "</number>")
a.writeline ("<number type=" & """work""" & " prio=" & """1""" & " id=" & """1""" & ">" + work + "</number>")
a.writeline ("<number type=" & """mobile""" & " prio=" & """1""" & " id=" & """2""" & ">" + mobile + "</number>")
a.writeline ("<number type=" & """fax_work""" & " prio=" & """1""" & " id=" & """3""" & ">" + fax_work + "</number>")
a.writeline ("</telephony></contact>")
i = i + 1
Wend
'Ende der Schleife
'Ende der Telefonbuchdatei
a.writeline ("</phonebook>")
a.writeline ("</phonebooks>")
MsgBox "Export erfolgreich. Datei wurde exportiert nach" & vbCrLf & strDateiname
End Sub
Achtung! Das vorhandene Telefonbuch wird immer überschrieben.
Nächster Schritt im Code wird das Ausfiltern leerer Zellen und Überlegungen zu weiteren sinnvollen Tags.
Und auch ein Import einer FB-Sicherungsdatei des Telefonbuches ist mittelfristig geplant.
Viel Vergnügen beim Anwenden und Experimentieren.
Für Hinweise bin ich sehr dankbar.
Viele Grüße
Peter
30 Kommentare
- LÖSUNG PeterleB schreibt am 08.10.2019 um 11:23:51 Uhr
- LÖSUNG silvereye schreibt am 21.10.2019 um 22:12:21 Uhr
- LÖSUNG PeterleB schreibt am 22.10.2019 um 07:31:38 Uhr
- LÖSUNG silvereye schreibt am 22.10.2019 um 22:03:28 Uhr
- LÖSUNG PeterleB schreibt am 24.10.2019 um 19:51:40 Uhr
- LÖSUNG silvereye schreibt am 22.10.2019 um 22:03:28 Uhr
- LÖSUNG PeterleB schreibt am 22.10.2019 um 07:31:38 Uhr
- LÖSUNG PeterleB schreibt am 24.10.2019 um 19:56:21 Uhr
- LÖSUNG PeterleB schreibt am 24.10.2019 um 21:44:37 Uhr
- LÖSUNG silvereye schreibt am 27.10.2019 um 16:28:14 Uhr
- LÖSUNG PeterleB schreibt am 27.10.2019 um 22:55:54 Uhr
- LÖSUNG silvereye schreibt am 28.10.2019 um 21:30:42 Uhr
- LÖSUNG PeterleB schreibt am 29.10.2019 um 17:59:56 Uhr
- LÖSUNG silvereye schreibt am 31.10.2019 um 21:52:04 Uhr
- LÖSUNG PeterleB schreibt am 01.11.2019 um 07:41:26 Uhr
- LÖSUNG 141575 schreibt am 01.11.2019 um 07:59:52 Uhr
- LÖSUNG PeterleB schreibt am 01.11.2019 um 14:49:20 Uhr
- LÖSUNG PeterleB schreibt am 02.11.2019 um 16:11:23 Uhr
- LÖSUNG 141575 schreibt am 02.11.2019 um 16:13:09 Uhr
- LÖSUNG PeterleB schreibt am 02.11.2019 um 16:58:49 Uhr
- LÖSUNG 141575 schreibt am 02.11.2019 um 17:04:53 Uhr
- LÖSUNG PeterleB schreibt am 02.11.2019 um 17:13:11 Uhr
- LÖSUNG 141575 schreibt am 02.11.2019 um 17:17:06 Uhr
- LÖSUNG 141575 schreibt am 02.11.2019 um 17:24:00 Uhr
- LÖSUNG PeterleB schreibt am 02.11.2019 um 17:42:16 Uhr
- LÖSUNG Silbercode schreibt am 24.06.2020 um 15:05:16 Uhr
- LÖSUNG Hemingway schreibt am 07.09.2020 um 15:27:22 Uhr
- LÖSUNG PeterleB schreibt am 07.09.2020 um 16:41:49 Uhr
- LÖSUNG PeterleB schreibt am 07.09.2020 um 19:08:20 Uhr
- LÖSUNG silvereye schreibt am 07.09.2020 um 19:27:41 Uhr
- LÖSUNG PeterleB schreibt am 07.09.2020 um 19:49:08 Uhr
- LÖSUNG Hemingway schreibt am 09.09.2020 um 23:08:53 Uhr
- LÖSUNG PeterleB schreibt am 07.09.2020 um 19:49:08 Uhr
- LÖSUNG silvereye schreibt am 07.09.2020 um 19:27:41 Uhr
- LÖSUNG PeterleB schreibt am 07.09.2020 um 19:08:20 Uhr
- LÖSUNG PeterleB schreibt am 07.09.2020 um 16:41:49 Uhr
- LÖSUNG Hemingway schreibt am 07.09.2020 um 15:27:22 Uhr
- LÖSUNG PeterleB schreibt am 02.11.2019 um 17:13:11 Uhr
- LÖSUNG 141575 schreibt am 02.11.2019 um 17:04:53 Uhr
- LÖSUNG PeterleB schreibt am 02.11.2019 um 16:58:49 Uhr
- LÖSUNG 141575 schreibt am 02.11.2019 um 16:13:09 Uhr
- LÖSUNG PeterleB schreibt am 02.11.2019 um 16:11:23 Uhr
- LÖSUNG PeterleB schreibt am 01.11.2019 um 14:49:20 Uhr
- LÖSUNG silvereye schreibt am 31.10.2019 um 21:52:04 Uhr
- LÖSUNG PeterleB schreibt am 29.10.2019 um 17:59:56 Uhr
- LÖSUNG silvereye schreibt am 28.10.2019 um 21:30:42 Uhr
- LÖSUNG PeterleB schreibt am 27.10.2019 um 22:55:54 Uhr
- LÖSUNG silvereye schreibt am 27.10.2019 um 16:28:14 Uhr
- LÖSUNG PeterleB schreibt am 24.10.2019 um 21:44:37 Uhr
LÖSUNG 08.10.2019 um 11:23 Uhr
Übrigens habe ich den Tipp auch im ip-phone-forum gepostet (Ich hoffe, das ist erlaubt)
Dort gab es noch Hinweise auf ein gleichnamiges Thema und einen gut beschriebenen Export/Import für XML bei Excel.
[ https://www.ip-phone-forum.de/threads/fritzbox-telefonbuch-xml-importdat ...]
Gruß Peter
Dort gab es noch Hinweise auf ein gleichnamiges Thema und einen gut beschriebenen Export/Import für XML bei Excel.
[ https://www.ip-phone-forum.de/threads/fritzbox-telefonbuch-xml-importdat ...]
Gruß Peter
LÖSUNG 21.10.2019 um 22:12 Uhr
Hallo Peter,
vorab danke für Deinen geposteten Code.
Ich habe soeben Deinen VBA code ausprobiert. Exceltabelle mit 5 Spalten, Überschriften Zeile 1, A-E wie Du es beschrieben hast definiert.
Code laufen lassen mit Ergebnis xml-Datei erzeugt.
Die erstellte xml-Datei habe ich versucht in meiner Fitzbox (7490, FRITZ!OS: 07.12) -> Telefonbuch -> Wiederherstellen -> hoch zu laden. Es erfolgt die Fehlermeldung: "Beim Wiederherstellen des Telefonbuchs ist ein Fehler aufgetreten."
Das Telefonbuch wurde nicht implementiert.
Hast Du vielleicht eine Ahnung warum nicht?
Viele Grüße
vorab danke für Deinen geposteten Code.
Ich habe soeben Deinen VBA code ausprobiert. Exceltabelle mit 5 Spalten, Überschriften Zeile 1, A-E wie Du es beschrieben hast definiert.
Code laufen lassen mit Ergebnis xml-Datei erzeugt.
Die erstellte xml-Datei habe ich versucht in meiner Fitzbox (7490, FRITZ!OS: 07.12) -> Telefonbuch -> Wiederherstellen -> hoch zu laden. Es erfolgt die Fehlermeldung: "Beim Wiederherstellen des Telefonbuchs ist ein Fehler aufgetreten."
Das Telefonbuch wurde nicht implementiert.
Hast Du vielleicht eine Ahnung warum nicht?
Viele Grüße
LÖSUNG 22.10.2019 um 07:31 Uhr
LÖSUNG 24.10.2019 um 19:51 Uhr
Ich habe nochmal recherchiert.
Der VBA-Code enthält 2 kleine Fehler.
Zeile 29 a.writeline ("<phonebook") -> a.writeline ("<phonebook>")
Zeile 64 a.writeline ("</phonebooks") -> a.writeline ("</phonebooks>")
Es fehlten jeweils die Tag-Klammern ">".
Probiere es bitte nach Korrektur nochmal.
Gruß Peter
Der VBA-Code enthält 2 kleine Fehler.
Zeile 29 a.writeline ("<phonebook") -> a.writeline ("<phonebook>")
Zeile 64 a.writeline ("</phonebooks") -> a.writeline ("</phonebooks>")
Es fehlten jeweils die Tag-Klammern ">".
Probiere es bitte nach Korrektur nochmal.
Gruß Peter
LÖSUNG 24.10.2019, aktualisiert um 21:47 Uhr
Das Ausfiltern leerer Zellen sieht im Code ab Zeile 49 dann so aus:
Die Number ID (0 - 3) korrigiert die Fritz!Box beim Import selbst.
'Schreibt den Telefonbucheintrag
a.writeline ("<contact><category>0</category>")
a.writeline ("<person><realName>" + realName + "</realName></person><telephony>")
If home <> "" Then
a.writeline ("<number type=" & """home""" & " prio=" & """1""" & " id=" & """0""" & ">" + home + "</number>")
End If
If work <> "" Then
a.writeline ("<number type=" & """work""" & " prio=" & """1""" & " id=" & """1""" & ">" + work + "</number>")
End If
If mobile <> "" Then
a.writeline ("<number type=" & """mobile""" & " prio=" & """1""" & " id=" & """2""" & ">" + mobile + "</number>")
End If
If fax_work <> "" Then
a.writeline ("<number type=" & """fax_work""" & " prio=" & """1""" & " id=" & """3""" & ">" + fax_work + "</number>")
End If
a.writeline ("</telephony></contact>")
i = i + 1
Wend
'Ende der Schleife
LÖSUNG 27.10.2019 um 16:28 Uhr
LÖSUNG 27.10.2019 um 22:55 Uhr
LÖSUNG 28.10.2019 um 21:30 Uhr
Hallo Peter,
Deine beiden beschriebenen Änderungen hatte ich leider vergessen.
Ich habe nun auch die Zeilen 29 + 64 geändert. Zuerst hat es nicht funktioniert.
Nach langen herumprobieren mit:
- Leerzeichen in der Nummer
- Anzahl der Nummern pro Zeile
- Länderkennung (z.B. +49)
- Namen: Nachname, Vorname oder nur ein Name
- Viele Einträge oder wenige bis nur einen Eintrag
konnte ich den Fehler finden.
Wenn man Umlaute bei den Namen verwendet, funktioniert es nicht.
Wenn man das über einem Browser direkt manuell eingibt funktioniert es aber.
Genau so an meinem Handaparat. Nur nicht über die Eingabe in der Tabelle mit anschließendem Lauf des Makros.
Beim Namen "Rüdiger" steht in der xml-Datei dann:
Ich habe deshalb hierzu dann das Attribut in der Zeile 27 von:
27 :a.writeline ("<?xml version=" & """1.0""" & " encoding=" & """utf-8""" & "?>")
in
27: a.writeline ("<?xml version=" & """1.0""" & " encoding=" & """ISO-8859-1""" & "?>")
geändert. Das Makro mit anschließender Wiederherstellung in der FitzBox Oberfläche funktioniert dann auch mit Umlauten.
Spricht aus Deiner Sicht hier etwas gegen diese Änderung bzw. kann das noch zu anderen Fehlern führen?
Viele Grüße
Deine beiden beschriebenen Änderungen hatte ich leider vergessen.
Ich habe nun auch die Zeilen 29 + 64 geändert. Zuerst hat es nicht funktioniert.
Nach langen herumprobieren mit:
- Leerzeichen in der Nummer
- Anzahl der Nummern pro Zeile
- Länderkennung (z.B. +49)
- Namen: Nachname, Vorname oder nur ein Name
- Viele Einträge oder wenige bis nur einen Eintrag
konnte ich den Fehler finden.
Wenn man Umlaute bei den Namen verwendet, funktioniert es nicht.
Wenn man das über einem Browser direkt manuell eingibt funktioniert es aber.
Genau so an meinem Handaparat. Nur nicht über die Eingabe in der Tabelle mit anschließendem Lauf des Makros.
Beim Namen "Rüdiger" steht in der xml-Datei dann:
Ich habe deshalb hierzu dann das Attribut in der Zeile 27 von:
27 :a.writeline ("<?xml version=" & """1.0""" & " encoding=" & """utf-8""" & "?>")
in
27: a.writeline ("<?xml version=" & """1.0""" & " encoding=" & """ISO-8859-1""" & "?>")
geändert. Das Makro mit anschließender Wiederherstellung in der FitzBox Oberfläche funktioniert dann auch mit Umlauten.
Spricht aus Deiner Sicht hier etwas gegen diese Änderung bzw. kann das noch zu anderen Fehlern führen?
Viele Grüße
LÖSUNG 29.10.2019 um 17:59 Uhr
Du bist ja ein Fuchs!
Schön, dass Du das Problem gefunden hast.
Den Code selbst habe ich ja auch teilweise übernommen, insbesondere die Zeile mit der xml-Version.
Die Fritz!Box selbst schreibt in den Export "UTF-8".
Ich weiss leider nicht, ob die Änderung zu Problemen führen kann.
Für UTF-8 müßten wir halt den Zelleninhalt auf Umlaute und Sonderzeichen prüfen und statt "ü" dann "ü" schreiben.
Überraschenderweise enthält aber die exportierte Sicherung der Fritz!Box die Umlaute in Klartext-Umlauten.
Habe im Augenblick keinen richtigen Plan.
Gruß Peter
Schön, dass Du das Problem gefunden hast.
Den Code selbst habe ich ja auch teilweise übernommen, insbesondere die Zeile mit der xml-Version.
Die Fritz!Box selbst schreibt in den Export "UTF-8".
Ich weiss leider nicht, ob die Änderung zu Problemen führen kann.
Für UTF-8 müßten wir halt den Zelleninhalt auf Umlaute und Sonderzeichen prüfen und statt "ü" dann "ü" schreiben.
Überraschenderweise enthält aber die exportierte Sicherung der Fritz!Box die Umlaute in Klartext-Umlauten.
Habe im Augenblick keinen richtigen Plan.
Gruß Peter
LÖSUNG 31.10.2019 um 21:52 Uhr
Hallo Peter,
da die Fritzbox die ISO-8859-1 konvertierte xml-Datei lesen kann sehe ich jetzt erst mal keinen weiteren Handlungsbedarf.
Ich habe aber Deinen Code für die UTF-8 ein bisschen für die Umlaute angepasst.
Aus Zeile 39:
habe ich eine Funktion von der Seite dbwiki.net/wiki/VBA_Tipp:_Umlaute_ersetzen ein bisschen angepasst und eingefügt zu:
Umlaut verweist auf die hinzugefügte Funktion am Ende:
In Summe sieht das dann so aus:
da die Fritzbox die ISO-8859-1 konvertierte xml-Datei lesen kann sehe ich jetzt erst mal keinen weiteren Handlungsbedarf.
Ich habe aber Deinen Code für die UTF-8 ein bisschen für die Umlaute angepasst.
Aus Zeile 39:
realName = ActiveCell.Offset(i, 0)
realName = Umlaut(ActiveCell.Offset(i, 0))
In Summe sieht das dann so aus:
Sub XML_Export()
Dim strDateiname As String
Dim strDateinameZusatz As String
Dim strMappenpfad As String
Dim intCutExt
'Datename ohne Ext. (nach Punkt suchen):
intCutExt = Len(ActiveWorkbook.Name) - InStrRev(ActiveWorkbook.Name, ".") + 1
strMappenpfad = Left(ActiveWorkbook.FullName, Len(ActiveWorkbook.FullName) - intCutExt)
'strDateinameZusatz = "-" & Year(ActiveSheet.Cells(3, 1).Value) & "-" & Month(ActiveSheet.Cells(3, 1).Value) & ".xml"
strDateinameZusatz = "-" & Format(Now, "YYYY-MM-DD-HH-MM-SS") & ".xml"
strDateiname = InputBox("Bitte den Namen der XML-Datei angeben.", "XML-Export", strMappenpfad & strDateinameZusatz)
If strDateiname = "" Then Exit Sub
Range("A2").Select
'Erstellt die Telefonbuchdatei (hier: xxx.xml)
'Dateiname kann frei gewählt werden
'Der entsprechende Ordner MUSS vorhanden sein, da sonst ein Fehler auftritt
Set fs = CreateObject("scripting.filesystemobject")
Set a = fs.createtextfile(strDateiname, True)
'Schreibt den allgemeinen Teil der Telefonbuchdatei
a.writeline ("<?xml version=" & """1.0""" & " encoding=" & """UTF-8""" & "?>")
' a.writeline ("<?xml version=" & """1.0""" & " encoding=" & """UTF-16""" & "?>")
' a.writeline ("<?xml version=" & """1.0""" & " encoding=" & """ISO-8859-1""" & "?>")
a.writeline ("<phonebooks>")
a.writeline ("<phonebook>")
'a.writeline ("<phonebook name=" & """Telefonbuch 1""" & " owner=" & """1""" & ">")
'Schleife zur Ermittlung aller Einträge
'Benutzt alle Datensätze, die einen Namen enthalten
i = 0
While ActiveCell.Offset(i, 0) <> ""
Dim realName As String
realName = Umlaut(ActiveCell.Offset(i, 0))
Dim home As String
home = ActiveCell.Offset(i, 1)
Dim work As String
work = ActiveCell.Offset(i, 2)
Dim mobile As String
mobile = ActiveCell.Offset(i, 3)
Dim fax_work As String
fax_work = ActiveCell.Offset(i, 4)
'Schreibt den Telefonbucheintrag
a.writeline ("<contact><category>0</category>")
a.writeline ("<person><realName>" + realName + "</realName></person><telephony>")
If home <> "" Then
a.writeline ("<number type=" & """home""" & " prio=" & """1""" & " id=" & """0""" & ">" + home + "</number>")
End If
If work <> "" Then
a.writeline ("<number type=" & """work""" & " prio=" & """1""" & " id=" & """1""" & ">" + work + "</number>")
End If
If mobile <> "" Then
a.writeline ("<number type=" & """mobile""" & " prio=" & """1""" & " id=" & """2""" & ">" + mobile + "</number>")
End If
If fax_work <> "" Then
a.writeline ("<number type=" & """fax_work""" & " prio=" & """1""" & " id=" & """3""" & ">" + fax_work + "</number>")
End If
a.writeline ("</telephony></contact>")
i = i + 1
Wend
'Ende der Schleife
'Ende der Telefonbuchdatei
a.writeline ("</phonebook>")
a.writeline ("</phonebooks>")
MsgBox "Export erfolgreich. Datei wurde exportiert nach" & vbCrLf & strDateiname
End Sub
Public Function Umlaut(Anything As Variant) As Variant
' https://dbwiki.net/wiki/VBA_Tipp:_Umlaute_ersetzen
Dim i As Long
Dim Ch As String * 1
Dim Ch1 As String * 1
Dim Res As String
Dim IsUpCase As Boolean
If IsNull(Anything) Then Umlaut = Null: Exit Function
For i = 1 To Len(Anything)
Ch = Mid$(Anything, i, 1)
Ch1 = IIf(i < Len(Anything), Mid$(Anything, i + 1, 1), " ")
' Nächstes Zeichen ist kein Kleinbuchstabe:
IsUpCase = CBool((Asc(Ch1) = Asc(UCase(Ch1))))
Select Case Asc(Ch)
Case Asc("Ä"): Res = Res & "Ä"
Case Asc("Ü"): Res = Res & "Ü"
Case Asc("Ö"): Res = Res & "Ö"
Case Asc("ü"): Res = Res & "ü"
Case Asc("ö"): Res = Res & "ö"
Case Asc("ä"): Res = Res & "ä"
Case Asc("ß"): Res = Res & "ß"
Case Else: Res = Res & Ch
End Select
Next
Umlaut = Res
End Function
LÖSUNG 01.11.2019, aktualisiert um 08:02 Uhr
Wenn ihr UTF-8 in den Header der XML Datei schreibt dann sollte diese auch UTF-8 kodiert weggeschrieben werden ! Das FSO Textobject kann das nicht, es kann außer ASCII und Ansi nur Unicode, aber mit Adodb.Stream ist UTF-8 kein Problem:
https://developer.rhino3d.com/guides/rhinoscript/read-write-utf8/
https://developer.rhino3d.com/guides/rhinoscript/read-write-utf8/
LÖSUNG 02.11.2019 um 16:11 Uhr
objStream.WriteText schreibt jedoch nicht zeilenweise, sondern immer einen "Datenblock".
Über eine Hilfsvariable müßten also erst die Zeileninhalte gesammelt, mit Zeilenendezeichen versehen und dann in einem Rutsch in den Stream geschrieben werden.
Ist sicher machbar, aber braucht etwas Arbeit.
Gruß Peter
Über eine Hilfsvariable müßten also erst die Zeileninhalte gesammelt, mit Zeilenendezeichen versehen und dann in einem Rutsch in den Stream geschrieben werden.
Ist sicher machbar, aber braucht etwas Arbeit.
Gruß Peter
LÖSUNG 02.11.2019, aktualisiert um 16:15 Uhr
Zitat von PeterleB:
objStream.WriteText schreibt jedoch nicht zeilenweise, sondern immer einen "Datenblock".
RichtigobjStream.WriteText schreibt jedoch nicht zeilenweise, sondern immer einen "Datenblock".
Über eine Hilfsvariable müßten also erst die Zeileninhalte gesammelt, mit Zeilenendezeichen versehen und dann in einem Rutsch in den Stream geschrieben werden.
Exakt, ist ja kein Thema ...strText = strText & "BlaBlub" & vbNewline
strText = strText & "BlaBlub2" & vbNewline
' usw.
Ist sicher machbar, aber braucht etwas Arbeit.
That's Life LÖSUNG 02.11.2019, aktualisiert um 17:09 Uhr
LÖSUNG 02.11.2019, aktualisiert um 17:11 Uhr
So viel du RAM hast
und überhaupt kein Problem. Performance- und Speichertechnisch wäre natürlich ein "StringBuilder" effektiver aber das gibt's in VBS nicht nur in .NET.
Aber ich würde an deiner Stelle das XML direkt mit einem XML-Object erstellen
Und das macht dann auch gleich die Kodierung richtig!
und ein Streamobjekt werden?
Das Streamobject ist nicht groß, das schreibt die Dinge direkt so weg in die Datei wie sie ankommen.Stell Dir mal ein Fritz-Telefonbuch mit 500 Einträgen vor.
Das ist ehrlich gesagt "mini" Aber ich würde an deiner Stelle das XML direkt mit einem XML-Object erstellen
set xmldoc = CreateObject("MSXML2.DomDocument")
LÖSUNG 02.11.2019, aktualisiert um 17:16 Uhr
LÖSUNG 02.11.2019, aktualisiert um 17:30 Uhr
Hier mal ein einfaches Beispiel:
Ergibt als Beispiel
Vollkommen objektorientiert ohne das String-Gematsche und vor allem das wichtigste: Du erhältst zuverlässig gültigen XML Code ohne eventuelle Flüchtigkeitsfehler(Groß-Kleinschreibung etc.) weil es ein echter XML Parser erstellt
.
' XML Document Object erstellen
Set xmldoc = CreateObject("msxml2.domdocument.6.0")
' Processing Instruction erstellen
xmldoc.appendChild xmldoc.createProcessingInstruction("xml","version=""1.0"" encoding=""utf-8""")
' Root-Knoten erstellen
Set root = xmldoc.createElement("root")
' Childknoten erstellen
Set child = xmldoc.createElement("child")
' Childknoten mit einem Attribut versehen
child.setAttribute "name","Test"
' Child Textknoten mit Inhalt füllen
child.text = "BlaBLub"
' Child-Knoten in den Root-Knoten einhängen
root.appendChild child
' Root-Knoten in XML Document einhängen
xmldoc.appendChild root
' Das ganze als XML wegspeichern
xmldoc.save "D:\test.xml"
<?xml version="1.0" encoding="utf-8"?>
<root>
<child name="Test">BlaBLub</child>
</root>
LÖSUNG 02.11.2019 um 17:42 Uhr
LÖSUNG 24.06.2020, aktualisiert um 15:06 Uhr
LÖSUNG 07.09.2020 um 15:27 Uhr
Hallo Experten,
auch ich möchte gern meine Telefonkontakte in Gestalt einer Excel-Tabelle so umwandeln, dass ich sie in meine FB 7590 importieren kann. Zu diesem Zweck hab ich mein Bestes getan, Eure Erörterungen nachzuvollziehen.
Dann habe ich den Code ganz oben im 1. Beitrag (67 Zeilen), dann den erweiterten von silvereye vom 31.10.2019 um 21:52 Uhr (105 Zeilen) als Excel-Macros laufen lassen. Leider führten beide beim FritzBox-Import zu der bekannten Fehlermeldung.
Nun bin ich als Laie aufgeschmissen, denn ich frage mich:
• Gibt es denn inzwischen einen "fertigen" Macro-Code, in dem alle Vorschläge, Anregungen etc. umgesetzt sind und der eine XML produziert, die die FB klaglos akzeptiert?
• Wenn nein, was muss ich tun?
Danke für jeden Hinweis!
Gruß Alex
auch ich möchte gern meine Telefonkontakte in Gestalt einer Excel-Tabelle so umwandeln, dass ich sie in meine FB 7590 importieren kann. Zu diesem Zweck hab ich mein Bestes getan, Eure Erörterungen nachzuvollziehen.
Dann habe ich den Code ganz oben im 1. Beitrag (67 Zeilen), dann den erweiterten von silvereye vom 31.10.2019 um 21:52 Uhr (105 Zeilen) als Excel-Macros laufen lassen. Leider führten beide beim FritzBox-Import zu der bekannten Fehlermeldung.
Nun bin ich als Laie aufgeschmissen, denn ich frage mich:
• Gibt es denn inzwischen einen "fertigen" Macro-Code, in dem alle Vorschläge, Anregungen etc. umgesetzt sind und der eine XML produziert, die die FB klaglos akzeptiert?
• Wenn nein, was muss ich tun?
Danke für jeden Hinweis!
Gruß Alex
LÖSUNG 07.09.2020 um 16:41 Uhr
LÖSUNG 07.09.2020 um 19:08 Uhr
Habe doch mal angefangen, mir ein paar Gedanken zu machen.
Erstmal zum Vergleich eine reelle Telefonbuchdatei:
Nach dem Beispiel von "141575" müsste es sich - erstmal als Gedankengerüst - so entwickeln:
Leider komme ich hier nicht weiter. Habe auch nur bei .NET ausführlichere Erklärungen zu msxml2.domdocument.6.0 gefunden, die sich aber nicht 1:1 für VBA umsetzen lassen.
Vielleicht gibt es noch einen Code-Tüftler, der hier helfen kann.
Gruß Peter
Erstmal zum Vergleich eine reelle Telefonbuchdatei:
<?xml version="1.0" encoding="utf-8"?>
<phonebooks>
<phonebook name="Kombi">
<contact>
<category>0</category>
<person>
<realName>Lutzmann, Utz
</realName>
<imageURL>file:///var/InternerSpeicher/FRITZ/fonpix/1564409969-0.jpg
</imageURL>
</person>
<telephonynid="2">
<number type="mobile" prio="1" id="0">+491721111111
</number>
<numbertype="home" prio="0" id="1">+4933332222222
</number>
</telephony>
<servicesnid="1">
<email classifier="private" id="0">lutzmann.utz@web.de
</email>
</services>
<uniqueid>1112
</uniqueid>
<mod_time>1564409969
</mod_time>
</contact>
</phonebook>
</phonebooks>
' XML Document Object erstellen
Set xmldoc = CreateObject("msxml2.domdocument.6.0")
' Processing Instruction erstellen
<?xml version="1.0" encoding="utf-8"?> xmldoc.appendChild xmldoc.createProcessingInstruction("xml","version=""1.0"" encoding=""utf-8""")
<phonebooks> ' Root-Knoten erstellen: Set root = xmldoc.createElement("phonebooks")
<phonebook> ' Childknoten erstellen: Set child = xmldoc.createElement("phonebook")
' Childknoten mit einem Attribut versehen: child.setAttribute "name","Telefonbuch 1"
' Childknoten mit einem 2. Attribut versehen: child.setAttribute "owner","1"
' Mit dieser Anweisung bin ich mir gar nicht so sicher!
<phonebook name=" & """Telefonbuch 1""" & " owner=" & """1""" & ">")
'Jetzt als Schleife:
'Ermittlung aller Einträge
'Zeile 36 - 48
<contact> 'Child unter Child! Da hört's bei mir schon auf. Set child01 = xmldoc.createElement("contact") ???
<category>0
</category>
<person>
<realName>" + realName + "
</realName>
</person>
<telephony>
Wenn die Tags <> ""
<number type=" & """home""" & " prio=" & """1""" & " id=" & """0""" & ">" + home + "
</number>
<number type=" & """work""" & " prio=" & """1""" & " id=" & """1""" & ">" + work + "
</number>
<number type=" & """mobile""" & " prio=" & """1""" & " id=" & """2""" & ">" + mobile + "
</number>
<number type=" & """fax_work""" & " prio=" & """1""" & " id=" & """3""" & ">" + fax_work + "
</number>
</telephony>
</contact> ' Child-Knoten in den Child-Knoten einhängen: child.appendChild contact ????
Ende der Schleife
</phonebook> ' Child-Knoten in den Root-Knoten einhängen: root.appendChild phonebook
</phonebooks> ' Root-Knoten in XML Document einhängen: xmldoc.appendChild phonebooks
Vielleicht gibt es noch einen Code-Tüftler, der hier helfen kann.
Gruß Peter
LÖSUNG 07.09.2020 um 19:27 Uhr
Hallo Hemmingway und PeterleB,
habt Ihr mal folgendes versucht:
1. Eigenes Telefonbuch der FritzBox sichern
2. Tabelle (xlsm) erstellen mit den Überschriften (A1 bis E1):
A1: Name (realName)
B1: Telefon privat (home)
C1: Telefon geschäftlich (work)
D1: Telefon mobil (mobile)
E1: Fax (fax_work)
3. Dann bitte mal ein paar Beispielkontakte in die Tabelle schreiben
4. Ein Modul mit dem Code (siehe oben vom 31.10.2019 um 21:52 Uhr, den Block mit den Zeilen 1-67) einfügen und speichern
5. Makro "Sub XML_Export" ausführen
6. Die erstellte Datei auf die FritzBox hochladen und überprüfen ob alles übertragen worden ist.
Gruß silvereye
habt Ihr mal folgendes versucht:
1. Eigenes Telefonbuch der FritzBox sichern
2. Tabelle (xlsm) erstellen mit den Überschriften (A1 bis E1):
A1: Name (realName)
B1: Telefon privat (home)
C1: Telefon geschäftlich (work)
D1: Telefon mobil (mobile)
E1: Fax (fax_work)
3. Dann bitte mal ein paar Beispielkontakte in die Tabelle schreiben
4. Ein Modul mit dem Code (siehe oben vom 31.10.2019 um 21:52 Uhr, den Block mit den Zeilen 1-67) einfügen und speichern
5. Makro "Sub XML_Export" ausführen
6. Die erstellte Datei auf die FritzBox hochladen und überprüfen ob alles übertragen worden ist.
Gruß silvereye
LÖSUNG 07.09.2020 um 19:49 Uhr
LÖSUNG 09.09.2020 um 23:08 Uhr