LibreOffice Base вместо русских букв квадратики

Автор eugenyp, 27 марта 2025, 23:04

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

eugenyp

Здравствуйте. Необходимо заполнить несколько документов примерно одинаковой информацией. Сначала заполняем поля на интернет страницы, затем с помощью Ctrl+A  выделяю всю страницу, и мышкой копирую в Буфер обмена, потом написал макрос, который,  из Буфера обмена записывает в файл txt  или odt. Когда смотрю, открываю файлы txt  или odt отдельно русский шрифт есть, но когда в макросе, BASE перебираю записи от первой строки и дальше (ищу нужную запись) русские слова высвечиваются как квадратики. Собственно, я хотел найти нужную строку, ее значение присвоить переменной, а потом записать в нужную ячейку Calc, а от туда уже во все другие документы. Получается при поиске программа не находит нужную строку (сравниваются квадратики с русским текстом). Как изменить кодировку в BASE, потому что в txt  или odt русский шрифт есть и именно в BASE появляются квадратики. Я не совсем профессиональный программист (радиоинженер, но сейчас это давно слилось в одно) Такую программу делал в OFFICE , но сейчас все это платное, мы перешли на LibreOffice, а здесь много отличий и "засад". Спасибо.

bigor

Здравствуйте. Я ничего не понял - из буфера обмена получаем odt файл, откуда взялись макросы Base? что они перебирают? Строки файла или БД? Если БД то значит как то перенесли данные из файла в нее? В какой кодировке txt? который из буфера записали?
Поддержать наш форум можно здесь

sokol92

Покажите текст своей программы и укажите, как мы можем воссоздать проблемную ситуацию.
Укажите также информацию Меню / Справка / О программе LibreOffice (кнопка "Сведения о версии").
Владимир.

eugenyp

#3
Спасибо что ответили, да еще и вчера, а я почему-то захожу, а ответов нет и только сегодня увидел их.
Version: 24.8.5.2 (X86_64) / LibreOffice Community
Build ID: fddf2685c70b461e7832239a0162a77216259f22
CPU threads: 4; OS: Windows 10 X86_64 (10.0 build 19045); UI render: Skia/Raster; VCL: win
Locale: ru-RU (ru_RU); UI: ru-RU
Calc: threaded

Макрос, вернее, та часть где я осуществляю поиск нужной строки
'===================================================
    n = FreeFile                   'Always find the next free file number
Open "C:\Дог.txt" For Input As #n  'Open the file for input
Do While NOT EOF(n)                'While NOT End Of File
  Input #n, s                      'Read some data!
                                    REM Process the input here!
  if s= "Категория" then
  end if
Loop   
'============================
в по шаговом режиме s цифры и английский шрифт показывает нормально, а посему и поиск, выход из поиска осуществляется, но когда попадаются русские буквы, тут s=квадратики, а посему и сравнение ложно.
теперь о самой программе. Есть несколько текстовых файлов (txt, doc, odt) и электронная страница куда надо занести примерно одинаковую информацию, фамилия, имя, отчество и т.д. Автоматом заполнить в электронную страницу не получается, там защита (непонятно зачем, заходим туда с электронным ключом), поэтому я заполняю все данные на странице, затем нажимаю, Ctrl+A выделяю все на странице, затем мышкой копирую в Буфер обмена, а потом из буфера обмена во вспомогательный текстовый файл C:\Дог.txt. Дальше в Calc написал макрос фрагмент показал выше, тут я пытаюсь найти нужные данные и присвоить их переменным, а затем передать в Calc. А уже затем из ячеек Calc с помощью предварительно созданных закладок в документах записываю все что нужно. По частям, в частности закладки отрепетировал, а вот на стадии заполнения ячеек Calc из буфера данных тормоз, макрос не понимает русских букв. Хотя просматриваю буфер обмена, txt файл куда сбрасываю из буфера все по русски, и только макрос не видит их. Дальше в документах куда вставляю русские буквы нормально. Надо чтобы моя переменная s в макросе бsла не квадратиками, а по русски. Как-то вот так. Спасибо

mikekaganski

Open + Input читают по байтам. А у Вас, похоже, кодировка UTF-8. Не пользуйтесь этими допотопными средствами. Вам нужен сервис SimpleFileAccess. Например, https://forumooo.ru/index.php?topic=7976.msg53489#msg53489
С уважением,
Михаил Каганский

eugenyp

#5
Посмотрел. Огромный по объему текс программы, как мне кажется не имеющий ничего общего с моим, тем более там еще и 1С замешана. Я понимаю, возможно там облегчен заполнения в Ворд, но у меня все это уже работает, надо просто осуществить поиск нужной строки, когда строка на русском. Я уже искал, как поменять кодировку прямо в Макросе при присвоении значения переменной s, не нашел. Собственно вся задача и состоит в этом. Потому что когда в строке цифры и английский шрифт все работает. Я уже делал такое в Микрософтовском Офисе там проблем с кодировкой не было.
А то что читает по байтам, то цифры и английскую кодировку так же читает и без квадратиков. Если по байтам, то получается целое слово, скажем из трех букв, надо читать три раза а потом складывать, в Микрософтовском такого нет, слово читается целиком.
Спасибо.

sokol92

1. Вложите в сообщение Ваш "загадочный" файл (C:\Дог.txt).

2. В LibreOffice Меню / Справка / О программе LibreOffice / Кнопка "Сведения о версии". Вставьте в сообщение содержимое буфера обмена (сведения о версии).
Владимир.

eugenyp

Версию уже давал, копирую опять

==============
Version: 24.8.5.2 (X86_64) / LibreOffice Community
Build ID: fddf2685c70b461e7832239a0162a77216259f22
CPU threads: 4; OS: Windows 10 X86_64 (10.0 build 19045); UI render: Skia/Raster; VCL: win
Locale: ru-RU (ru_RU); UI: ru-RU
Calc: threaded
==============
в файле конечно много убрал - чужая информация. Мне главное чтобы нормально определилось слово "категория" значит русские работают. Спасибо.

sokol92

Как и предполагал Михаил, кодировка файла - UTF-8.
Сохранил Ваш файл в C:\temp\Дог1.txt.
Вот как его можно прочитать и вывести на экран (макрос Test).

Option Explicit

Sub Test
  Dim s as String, arr, i as Long, n as Long
 
  s=FileToStr("C:\temp\Дог1.txt")  ' s - содержимое файла
  Msgbox s
 
  arr=Split(s, Chr(10))            ' arr - массив строк файла
  For i=0 To UBound(arr)
 
    ' Здесь построчная обработка файла
    If Instr(1, Lcase(arr(i)), "а")>0 Then  
      n=n+1                        ' считаем строки с русской буквой а (регистронезависимо)
    End If 
     
  Next i
 
  Msgbox "Число строк с буквой ""а"" " & n
 
End Sub 


' ------------------------------------------------------------------------------
' lang:ru
' Возвращает содержимое текстового файла кодировки UTF-8 как строку.
' При ошибке возвращается пустая строка.
Function FileToStr(Byval filePath As String) as String
  Dim oTextStream
  FileToStr=""
  On Error GoTo ErrLabel
  oTextStream = CreateUnoService("com.sun.star.io.TextInputStream")
  With oTextStream
    .setInputStream CreateUnoService("com.sun.star.ucb.SimpleFileAccess").openFileRead(ConvertToUrl(FilePath))
    FileToStr=.readString(Array(), false)
    .closeInput
  End With 
 
ErrLabel: 
End Function
Владимир.

mikekaganski

Цитата: eugenyp от 29 марта 2025, 12:40Я уже делал такое в Микрософтовском Офисе там проблем с кодировкой не было

Та же самая проблема в MS Excel с этим файлом и этим кодом.
С уважением,
Михаил Каганский

sokol92

В VBA нормальный путь работы с UTF-8 - ADO Stream.
Альтернатива - менять кодировку файла (тоже через ADO Stream) до/после обработки.
Владимир.

eugenyp

Цитата: sokol92 от 29 марта 2025, 16:22s=FileToStr("C:\temp\Дог1.txt")
у меня пишет ошибку  "Ошибка времени выполнения Basic. Подпрограмма или функция не определена." здесь вы в переменную сбрасываете весь файл  Дог1.txt а потом еще и в  Msgbox s, но ведь после этого все строки сольются, ведь у вас s не матрица (n, x). Мне не надо искать сколько строк содержат "а" мне надо найти строку с текстом "категория" а потом перейти на следующую строку и прочитать какая категория Это может быть N1, N2, M1, M2, O1 или O2 буквы латиница. Конечно можно было сразу определить категорию - N1, N2, M1, M2, O1 или O2, но возможно следующий параметр будет на русском, тогда все равно надо сравнивать с русским шрифтом. Мне не понятно, почему просматривая Файлы Дог.txt или odt я вижу русский шрифт, а именно в BASIC русские буквы квадратики!? Значит сам BASIC не понимает русский шрифт и менять надо в нем.

eugenyp

Цитата: sokol92 от 29 марта 2025, 17:01В VBA нормальный путь работы с UTF-8 - ADO Stream.
Я попытался разобраться с этим объектом ADO Stream - меня не хватило, я не понял, мне ближе работа в программе по строкам типа Бейсик или нужно найти хорошее описание с примерами применения, по принципу делай как я.

eugenyp

Цитата: mikekaganski от 29 марта 2025, 16:41
Цитата: eugenyp от 29 марта 2025, 12:40Я уже делал такое в Микрософтовском Офисе там проблем с кодировкой не было

Та же самая проблема в MS Excel с этим файлом и этим кодом.
А у меня раньше работало.

sokol92

Цитата: eugenyp от 29 марта 2025, 21:31у меня пишет ошибку  "Ошибка времени выполнения Basic. Подпрограмма или функция не определена."
Давайте вместе проверим.
1. Сохраните Ваш текстовый файл как "C:\Temp\Дог1.txt".
2. Откройте прилагаемый файл TestCalc.ods и запустите в нем макрос (Меню / Сервис / Макросы / Выполнить макрос) TestFile.
Владимир.