Datei als UTF-8 mit BOM wegschreiben
Verfasst: Mi, 11.04.2012 14:40
Ich möchte eine Calc Tabelle mit einem Basic Makro auslesen und in eine Textdatei schreiben. Diese muß in UTF-8 mit BOM formatiert sein.
Daswegschreiben als UTF-8 ist ja kein größeres Problem.
Die BOM überfordert mich aber etwas. Wie kriege ich die an den Anfang der Datei?
Hier mein Makro:
Sub CSV_U_save_Unicode()
GlobalScope.BasicLibraries.LoadLibrary("Tools")
' ----------------------------------------------------------------------
'define variables
dim FileName as string
dim FilePath as string
dim FileTemp as string
dim FileSave as string
dim SavePath as string
dim dummy()
' ----------------------------------------------------------------------
'Pfad auslesen und in Variablen schreiben
FileTemp = thisComponent.geturl()
'Speicherpfad in Dateinamen umwandeln
FileTemp = ConvertFromUrl(FileTemp)
FileName = FileNameoutofPath(FileTemp)
FilePath = DirectoryNameoutofPath(FileTemp,"\")
'der Sicherungspfad wird gleich dem Ursprungpfad gesetzt
FileSave = FileTemp
'Eingabemaske zum manuellen Abändern der Pfadangabe
FileSave = InputBox("Pfad und Dateiname", "ODS + CSV_U - sichern Klaes Version 7.x", FileTemp)
'wenn die vorhande Pfadangabe nicht korrekt ist erfolgt ein Abbruch
If FileSave = "" Then
End
End Sub
'Speicherpfad erzeugen und als ods speichern
SavePath = ConvertToUrl(FileSave)
thisComponent.storeAsUrl(SavePath,dummy())
'CVS_U speichern
' ----------------------------------------------------------------------
'die Letzte verwendete Zeile und Spalte ermitteln
dim LetzteSpalte as integer
dim LetzteZeile as integer
dim sTabelle as object
dim oCursor as object
sTabelle = thisComponent.sheets(0)
oCursor = sTabelle.createCursor
oCursor.GotoEndOfUsedArea(False)
LetzteSpalte = oCursor.getRangeAddress().endColumn
LetzteZeile = oCursor.getRangeAddress().endRow
'Speicherpfad erzeugen und als csv_u speichern
Dim temp as String
temp = GetFileNameWithoutExtension(FileName)
FileSave = FilePath & "\" & temp & ".csv_U"
'Zeilenweise auslesen und in eine Datei speichern
dim i as integer
dim ic as integer
dim Trennzeichen as string
dim Zeile as string
dim Zelle as string
dim oFileWrite as object
dim oOutputStream as object
dim oStream as object
oFileWrite = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
oOutputStream = createUnoService("com.sun.star.io.TextOutputStream")
oOutputStream.Encoding = "UTF-8"
If oFileWrite.exists(FileSave) Then
oFileWrite.kill(FileSave)
End If
'Datei öffnen zum schreiben des Strings
oStream = oFileWrite.openFileWrite(FileSave)
oOutputStream.setOutputStream(oStream)
'Zähler für Zeile + Spalte auf 0 setzen Trennzeichen zwischen den Zellen definieren
i=0
ic=0
Trennzeichen = ";"
Do until i - 1 = LetzteZeile
Do until ic - 1 = LetzteSpalte
Zelle = sTabelle.getCellByPosition(ic,i).string
ic = ic + 1
Zeile = Zeile & Zelle & Trennzeichen
Loop
oOutputStream.writeString(Zeile & CHR$(10))
Zeile = ""
i = i + 1
ic = 0
Loop
'Datei schließen
oOutputStream.closeOutput()
'Dokument schließen
'thisComponent.close(true)
end sub
Kann mir jemand helfen?
Daswegschreiben als UTF-8 ist ja kein größeres Problem.
Die BOM überfordert mich aber etwas. Wie kriege ich die an den Anfang der Datei?
Hier mein Makro:
Sub CSV_U_save_Unicode()
GlobalScope.BasicLibraries.LoadLibrary("Tools")
' ----------------------------------------------------------------------
'define variables
dim FileName as string
dim FilePath as string
dim FileTemp as string
dim FileSave as string
dim SavePath as string
dim dummy()
' ----------------------------------------------------------------------
'Pfad auslesen und in Variablen schreiben
FileTemp = thisComponent.geturl()
'Speicherpfad in Dateinamen umwandeln
FileTemp = ConvertFromUrl(FileTemp)
FileName = FileNameoutofPath(FileTemp)
FilePath = DirectoryNameoutofPath(FileTemp,"\")
'der Sicherungspfad wird gleich dem Ursprungpfad gesetzt
FileSave = FileTemp
'Eingabemaske zum manuellen Abändern der Pfadangabe
FileSave = InputBox("Pfad und Dateiname", "ODS + CSV_U - sichern Klaes Version 7.x", FileTemp)
'wenn die vorhande Pfadangabe nicht korrekt ist erfolgt ein Abbruch
If FileSave = "" Then
End
End Sub
'Speicherpfad erzeugen und als ods speichern
SavePath = ConvertToUrl(FileSave)
thisComponent.storeAsUrl(SavePath,dummy())
'CVS_U speichern
' ----------------------------------------------------------------------
'die Letzte verwendete Zeile und Spalte ermitteln
dim LetzteSpalte as integer
dim LetzteZeile as integer
dim sTabelle as object
dim oCursor as object
sTabelle = thisComponent.sheets(0)
oCursor = sTabelle.createCursor
oCursor.GotoEndOfUsedArea(False)
LetzteSpalte = oCursor.getRangeAddress().endColumn
LetzteZeile = oCursor.getRangeAddress().endRow
'Speicherpfad erzeugen und als csv_u speichern
Dim temp as String
temp = GetFileNameWithoutExtension(FileName)
FileSave = FilePath & "\" & temp & ".csv_U"
'Zeilenweise auslesen und in eine Datei speichern
dim i as integer
dim ic as integer
dim Trennzeichen as string
dim Zeile as string
dim Zelle as string
dim oFileWrite as object
dim oOutputStream as object
dim oStream as object
oFileWrite = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
oOutputStream = createUnoService("com.sun.star.io.TextOutputStream")
oOutputStream.Encoding = "UTF-8"
If oFileWrite.exists(FileSave) Then
oFileWrite.kill(FileSave)
End If
'Datei öffnen zum schreiben des Strings
oStream = oFileWrite.openFileWrite(FileSave)
oOutputStream.setOutputStream(oStream)
'Zähler für Zeile + Spalte auf 0 setzen Trennzeichen zwischen den Zellen definieren
i=0
ic=0
Trennzeichen = ";"
Do until i - 1 = LetzteZeile
Do until ic - 1 = LetzteSpalte
Zelle = sTabelle.getCellByPosition(ic,i).string
ic = ic + 1
Zeile = Zeile & Zelle & Trennzeichen
Loop
oOutputStream.writeString(Zeile & CHR$(10))
Zeile = ""
i = i + 1
ic = 0
Loop
'Datei schließen
oOutputStream.closeOutput()
'Dokument schließen
'thisComponent.close(true)
end sub
Kann mir jemand helfen?