конвертация файлов с LIbre в xls EXCEL из папки

Автор Miroslavovna, 6 марта 2025, 08:32

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

Miroslavovna

Добрый день!  Можете помочь? В папке имеются файлы с расширением .xls с Libreoffice, необходимо их конвертировать в xls EXCEL, желательно в эту же папку без изменения имени файла. Не могу состыковать методы выбора, открытия и конвертирования.

bigor

Miroslavovna, здавствуйте, а чем xls Libreoffice, отличается от xls MSO?
Поддержать наш форум можно здесь

sokol92

Прилагаемые в стартовом сообщении файлы как-то "криво" сохранены: в LibreOffice открываются, в Excel - нет.
Это можно попробовать исправить с помощью следующего макроса:

Option Explicit

' Открывает все файлы с расширением .xls в каталоге folder1 и сохраняет с тем же расширением в каталоге folder2
Sub CopyXlsFiles(folder1, folder2)
   Dim oSFA As Object, aFiles, file As String, i As Long, arr, sep As String, n As Long
   oSFA=createUnoService("com.sun.star.ucb.SimpleFileAccess")
   aFiles=oSFA.getFolderContents(ConvertToUrl(folder1), false)    ' список файлов
   sep=GetPathSeparator()
   
   For i=0 To Ubound(aFiles)
     file=ConvertFromUrl(aFiles(i))
     If Right(LCase(file), 4)=".xls" Then
       sep=GetPathSeparator()
       arr=Split(file, sep)
       CopyFile file, "MS Excel 97", ConvertToUrl(folder2 & sep & arr(Ubound(arr))), "MS Excel 97"
       n=n+1
     End If
   Next i 

   Msgbox "Обработано файлов: " & n
End Sub

' Открывает файл  file1 с помощью фильтра filter1 и сохраняет как file2 c помощью фильтра filter2
Function CopyFile(file1, filter1, file2, filter2) As Boolean
  Dim props1(1) As New com.sun.star.beans.PropertyValue
  Dim props2(2) As New com.sun.star.beans.PropertyValue
  Dim oDoc As Object
 
  props1(0).Name="FilterName" : props1(0).Value=filter1
  props1(1).Name="ReadOnly"   : props1(1).Value=True
  On Error GoTo ErrOpen
  oDoc=StarDesktop.LoadComponentFromUrl(ConvertToUrl(file1), "_default", 0, props1)
 
  On Error GoTo ErrSave
  props2(0).Name="FilterName" : props2(0).Value=filter2
  oDoc.storeToUrl  ConvertToUrl(file2), props2

  CopyFile=True
  oDoc.Close True
  Exit Function
 
ErrOpen:
  Msgbox "Ошибка при открытии файла " & file1
  Exit Function
ErrSave: 
  Msgbox "Ошибка при сохранении файла " & file2
  Exit Function
End Function

' Пример вызова
Sub Test
  CopyXlsFiles "C:\temp", "C:\temp\New"
End Sub
Владимир.

kompilainenn

Цитата: sokol92 от  6 марта 2025, 19:59Прилагаемые в стартовом сообщении файлы как-то "криво" сохранены: в LibreOffice открываются, в Excel - нет
есть подозрение, что их пробовали "конвертировать" путем изменения расширения ODS на XLS ручками.
При этом LibreOffice умеет прекрасно сохранять файлы сразу в нормальный (хоть и древний и с ограничениями) формат XLS
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

gabix

Нет, это совсем не ODS. По структуре выглядит как вполне себе XLS, но с какими-то проблемами (Excel ругается, Calc относится спокойно).

sokol92

У меня есть подозрение, что проблема с исходными файлами в Excel вызвана из-за пустой папки _VBA_PROJECT_CUR в структуре файла, но разбор формата .xls - дело неблагодарное.  :)
Владимир.

Miroslavovna

#6
Извините за долгий ответ. Не у всех стоит MO, где-то Astra. Поэтому кто-то заполняет в AStra работают через Libre, кто-то в MO - EXCEL. Общий файл сбор данных формируется в EXCEL. В Libre файл сохраняем через расширение xls, но в MO не открывается. Поэтому в LIBRE на базе MO необходимо файлы конвертировать в xls  EXCEL.

Miroslavovna

Немножко изменила. Добавила выбор из папки. Спасибо.

Sub Test1
  Dim file_dialog as Object
   Dim status as Integer
   Dim init_path as String
   Dim ucb as object
   Dim filterNames(3) as String
   filterNames(0) = "*.*"
   GlobalScope.BasicLibraries.LoadLibrary("Tools")
   file_dialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
   ucb = createUnoService("com.sun.star.ucb.SimpleFileAccess")
   AddFiltersToDialog(FilterNames(), file_dialog)
   'Set your initial path here!
   init_path = ConvertToUrl("/usr")   
   file_dialog.setMultiSelectionMode(True)
   If ucb.Exists(init_path) Then
      file_dialog.SetDisplayDirectory(init_path)
   End If
   status = file_dialog.Execute()
   If status = 1 Then
      file_path = file_dialog.getSelectedFiles()
      open_files = file_path     
   Dim oSFA As Object, aFiles, file, afile As String, i As Long, arr, sep As String, n As Long
   oSFA=createUnoService("com.sun.star.ucb.SimpleFileAccess")
   sep=GetPathSeparator()
   afile  = "C:\Temp\New"
   For i=0 To Ubound(open_files)
     file=ConvertFromUrl(open_files(i))
     If Right(LCase(file), 4)=".xls" Then
       sep=GetPathSeparator()
       arr=Split(file, sep)
       CopyFile file, "MS Excel 97", ConvertToUrl(afile & sep & arr(Ubound(arr))),  "MS Excel 97"
       n=n+1
     End If
   Next i
   Msgbox "Обработано файлов: " & n & "    Скопированы в папку C:\Temp\New"   
   End If 
   file_dialog.Dispose()   
End Sub

bigor

Цитата: Miroslavovna от  9 марта 2025, 18:53Поэтому кто-то заполняет в AStra работают через Libre
странно, я работаю в libre и под AstraLinux и под Виндовc, но файлы сохраненные в одной системе, как xls/xlsx открываются в другой нормально.
Поддержать наш форум можно здесь

gabix

1. А нафига XLS (совместимость с которым давно где-то в самом низу перечня приоритетов разработчиков LO)? Почему не XLSX?

2. А вообще что мешает всех пользователей перевести на работу в LibreOffice Calc и не возиться с костылями и не танцевать с бубнами? Как показывает лично моя практика, переход с Excel на Calc (тем, понятно, кто умеет работать) даётся легче перехода с Word на Writer. Попробуйте.

bigor

Цитата: gabix от 10 марта 2025, 09:42перевести на работу в LibreOffice Calc и не возиться с костылями
Н укак вариант вышестоящее начальство не хочет расставться с MSO и отчеты хочет видеть в нем
Поддержать наш форум можно здесь

gabix

Если начальству тихо и незаметно заменить MSO на LO, не обращая на это внимание, оно вообще хрен чего осознает. Хотя, конечно, начальства могут быть разные.

mikekaganski

Цитата: Miroslavovna от  9 марта 2025, 18:53В Libre файл сохраняем через расширение xls
Как уже выше заметили - почему XLS? Что мешает выгружать в XLSX? Неужели версии MSO настолько старые (старше двадцати лет)?

Цитата: Miroslavovna от  9 марта 2025, 18:53но в MO не открывается
Это явно баг. Вы не указали точную версию LibreOffice. Возможно, проблема решена в более новой версии; возможно, это проблема конкретной сборки репозитория Астры под конкретную версию ОС (поскольку у bigor всё работает).
С уважением,
Михаил Каганский

bigor

#13
ЦитироватьВы не указали точную версию LibreOffice.
Astra Smolensk 1.6 бюллетень 15, стоит LO 6.4.7.2 тестовый файл приложил, MSO 2010 открывает его без ошибок
Поддержать наш форум можно здесь

sokol92

Я проверял свой скрипт в версиях 24.8.5 Win 10

и

Version: 24.2.3.2 (X86_64) / LibreOffice Community
Build ID: 420(Build:2)
CPU threads: 4; OS: Linux 6.1; UI render: default; VCL: kf5 (cairo+xcb)
Locale: ru-RU (ru_RU.UTF-8); UI: ru-RU
Debian package version: 4:24.2.3~rc2-0ubuntu0.24.04.1~lo1+ci202405280902+astra4+b1
Calc: threaded

Astra Linux Special Edition, обновление: 1.8.1.12.
Владимир.