Формат конца строки для WINDOWS систем CRLF

Автор S_Kh, 19 июля 2024, 09:02

0 Пользователи и 1 гость просматривают эту тему.

S_Kh

Добрый день.
Написал макрос в libreoffice calc на Linux Mint, с сохранением в файл формата csv.
Сохраняет файл с форматом конца строки LF (unix).
Можно ли в что в макрос добавить, чтобы сохранялся файл с форматом конца строки CRLF (windows)?
Также подскажите, пожалуйста, что указать для сохранения файла в определённой кодировке?

Ниже концовка кода макроса, касательно сохранения файла.

Sub Букинг()
...
...
        Dim Path As String
        Dim filename As String
                Path = Sheets("Лист1").Range("S2")
                filename = Sheets("Лист1").Range("C2")

                ActiveWorkbook.SaveAs filename:=Path & filename & ".csv", FileFormat:=xlCSV
               
                ActiveWindow.SelectedSheets.Delete

Sheets("Лист1").Select
           

End Sub


gabix

#1
Ну как-то так:

Sub ExportToGlossary

    Dim oDoc as Object
    Dim glossaryFileProperties(3) as new com.sun.star.beans.PropertyValue
    Dim sURL as String
    Dim iLen as Integer

    oDoc = ThisComponent

    If oDoc.getLocation() = "" Then Exit Sub
    If NOT oDoc.supportsService("com.sun.star.text.TextDocument") Then Exit Sub
    sURL = oDoc.getLocation()
    iLen = len(sURL)

    If lcase(right(sURL,4))=".ods" Then
        sURL = left(sURL, iLen - 4)
    Else
       If lcase(right(sURL,4))=".xls" Then
           sURL = left(sURL, iLen - 4)
       Else
           If lcase(right(sURL,5))=".xlsx" Then
               sURL = left(sURL, iLen - 5)
           End If
       End If   
    End If
   
    sURL = sURL + ".txt"

    glossaryFileProperties(0).Name = "FilterName"  ' setting properties of exported file such as tab as field delimiter, nothing as text delimiter, UTF-8 as encoding
    glossaryFileProperties(0).Value = "Text - txt - csv (StarCalc)"
    glossaryFileProperties(1).Name = "FilterOptions"
    glossaryFileProperties(1).Value = "9,0,76,1,,0,false,true,false"
    glossaryFileProperties(2).Name = "Overwrite"
    glossaryFileProperties(2).Value = True

    oDoc.storeToURL(sURL, glossaryFileProperties())
End Sub

В помощь:
https://help.libreoffice.org/latest/ro/text/shared/guide/csv_params.html

S_Kh

#2
gabix, спасибо.
Но, ничего не получилось. Это мой первый опыт))

Вставил Ваш код ниже. Сохраняет также с форматом конца строки LF.

Прикрепляю свой файл. Подскажите, пожалуйста, что не так делаю?  ??? 

gabix

Надо экспериментировать с параметрами, я, честно говоря, не так уж хорошо в этом разбираюсь. Просто потыкавшись (и немного почитав справку) подобрал, что мне нужно. Другой вопрос: а насколько важно задавать определённый конец строки?

S_Kh

Цитата: gabix от 19 июля 2024, 10:08а насколько важно задавать определённый конец строки?

Создал такой файл с макросом на ms office (xlsm) на windows. Работает без проблем.
Сохраняет файлы в нужной кодировке, формате конца строки. Такие файлы считываются без проблем конечным ПО (на windows). Но MS Excell у меня только на рабочем компе ))
Хотел бы из дома тоже мочь и уметь. У меня linux Mint. И файлы, созданные этим скриптом, не поддерживаются конечным ПО (на windows), проблемы при считывании.
Да и полезно на фоне "санкций" иметь возможность в любой момент уйти от "вражеских" мелкомягких.

bigor

Цитата: S_Kh от 19 июля 2024, 10:20И файлы, созданные этим скриптом
приложите файлы созданные в минт и виндовс, посмотреть разницу
Поддержать наш форум можно здесь

mikekaganski

Справка по опциям фильтра CSV описывает параметры, и среди них нет формата конца строки. В общем-то так же как и при использовании диалога в UI. Нет этой фозможности.
С уважением,
Михаил Каганский

S_Kh

#7
В виндовс я сохраняю в формате edi. Мне этот формат даже удобней. В минт при сохранении в edi выходит чёрти что.
И в виндовс я дополнительно использую в макросе функцию "ChangeTextCharset" для смены кодировки текстовых строк на windows-1251. В минт эта функция у меня не срабатывает.
В приложении файл, созданный на виндовс, но открывавшийся затем в минт. Не факт, что ещё рабочий и макрос не слетел. Рабочие файлы на рабочем компе. Зато есть код макроса из него.



S_Kh

#8
В итоге у меня на минт получаются такие файлы:
А необходимы такие:
На домашнем компе нет созданных рабочих версий файлов. Приложил похожие, необходимые для работы. 

bigor

Из ваших файлов видно, что на винде кодировка в макросе задается iso-8859-5 хотя в файле вижу iso-8859-15, но из-за отсутствия кириллицы будем считать что это одно и тоже:) а линуксовая машина пишет в стандатном utf исправить это можно задав параметры, нужные значения выбирайте по ссылке от mikekaganski или gabix
Поддержать наш форум можно здесь

S_Kh

Цитата: bigor от 19 июля 2024, 16:24исправить это можно задав параметры, нужные значения
Спасибо.
А покажите пример вставки в код этих параметров. В какое место?
Со значениями параметров я поиграюсь.

sokol92

Давайте по порядку.
Правильно ли я понимаю:
В макросе из #8 формируется лист "Лист2", который затем выводится в нужной кодировке в csv-формате.
Выложите, пожалуйста, сформированный Лист2 (или укажите, где он уже выложен), а мы подумаем, каким образом данные этого листа экспортировать в csv-формат.
Владимир.

sokol92

Воссоздал Ваш Лист2.
Сохраните прилагаемый файл и запустите макрос ToCsv. В той же папке должен появиться "правильный" файл с добавлением расширения .csv к исходному файлу.

Sub ToCsv()
 Dim dataArray, str As String, i As Long, arr
 
 dataArray=Sheet_UsedRange(ThisComponent.Sheets.getByName("Лист2")).dataArray
 ' Превращаем в одномерный массив
 ReDim arr(Ubound(dataArray, 1))
 For i=0 To Ubound(dataArray, 1)
   arr(i)=dataArray(i)(0)
 Next i
 
 StrToFile Join(arr, Chr(13) & Chr(10)), ThisComponent.Url & ".csv", "ISO_8859-5:1988"

End Sub

' lang:ru
' Возвращает диапазон использованных ячеек для листа oSheet.
Function Sheet_UsedRange(ByVal oSheet)
    Dim oCursor
    oCursor = oSheet.createCursor
    oCursor.gotoEndOfUsedArea True
    Sheet_UsedRange = oCursor
End Function 

' lang:ru
' Выводит текст в файл с нужной кодировкой.
Sub StrToFile(Byval str As String, Byval filePath As String, ByVal encoding As String)
  Dim oTextStream, oSFA
  filePath=ConvertToUrl(FilePath)
  oSFA=CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
  If oSFA.exists(filePath) Then oSFA.kill filePath
  oTextStream = CreateUnoService("com.sun.star.io.TextOutputStream")
  With oTextStream
    .setEncoding encoding
    .setOutputStream oSFA.openFileWrite(filePath)
    .writeString str
    .closeOutput
  End With 
End Sub
Владимир.

S_Kh

Спасибо всем большое за помощь.
Потестировал вариант от sokol92. Работает, устраивает.