Добрый день! Можете помочь? В папке имеются файлы с расширением .xls с Libreoffice, необходимо их конвертировать в xls EXCEL, желательно в эту же папку без изменения имени файла. Не могу состыковать методы выбора, открытия и конвертирования.
Miroslavovna, здавствуйте, а чем xls Libreoffice, отличается от xls MSO?
Прилагаемые в стартовом сообщении файлы как-то "криво" сохранены: в 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
Цитата: sokol92 от 6 марта 2025, 19:59Прилагаемые в стартовом сообщении файлы как-то "криво" сохранены: в LibreOffice открываются, в Excel - нет
есть подозрение, что их пробовали "конвертировать" путем изменения расширения ODS на XLS ручками.
При этом LibreOffice умеет прекрасно сохранять файлы сразу в нормальный (хоть и древний и с ограничениями) формат XLS
Нет, это совсем не ODS. По структуре выглядит как вполне себе XLS, но с какими-то проблемами (Excel ругается, Calc относится спокойно).
У меня есть подозрение, что проблема с исходными файлами в Excel вызвана из-за пустой папки _VBA_PROJECT_CUR в структуре файла, но разбор формата .xls (https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-xls/cd03cb5f-ca02-4934-a391-bb674cb8aa06) - дело неблагодарное. :)
Извините за долгий ответ. Не у всех стоит MO, где-то Astra. Поэтому кто-то заполняет в AStra работают через Libre, кто-то в MO - EXCEL. Общий файл сбор данных формируется в EXCEL. В Libre файл сохраняем через расширение xls, но в MO не открывается. Поэтому в LIBRE на базе MO необходимо файлы конвертировать в xls EXCEL.
Немножко изменила. Добавила выбор из папки. Спасибо.
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
Цитата: Miroslavovna от 9 марта 2025, 18:53Поэтому кто-то заполняет в AStra работают через Libre
странно, я работаю в libre и под AstraLinux и под Виндовc, но файлы сохраненные в одной системе, как xls/xlsx открываются в другой нормально.
1. А нафига XLS (совместимость с которым давно где-то в самом низу перечня приоритетов разработчиков LO)? Почему не XLSX?
2. А вообще что мешает всех пользователей перевести на работу в LibreOffice Calc и не возиться с костылями и не танцевать с бубнами? Как показывает лично моя практика, переход с Excel на Calc (тем, понятно, кто умеет работать) даётся легче перехода с Word на Writer. Попробуйте.
Цитата: gabix от 10 марта 2025, 09:42перевести на работу в LibreOffice Calc и не возиться с костылями
Н укак вариант вышестоящее начальство не хочет расставться с MSO и отчеты хочет видеть в нем
Если начальству тихо и незаметно заменить MSO на LO, не обращая на это внимание, оно вообще хрен чего осознает. Хотя, конечно, начальства могут быть разные.
Цитата: Miroslavovna от 9 марта 2025, 18:53В Libre файл сохраняем через расширение xls
Как уже выше заметили - почему XLS? Что мешает выгружать в XLSX? Неужели версии MSO настолько старые (старше двадцати лет)?
Цитата: Miroslavovna от 9 марта 2025, 18:53но в MO не открывается
Это явно баг. Вы не указали точную версию LibreOffice. Возможно, проблема решена в более новой версии; возможно, это проблема конкретной сборки репозитория Астры под конкретную версию ОС (поскольку у
bigor всё работает).
ЦитироватьВы не указали точную версию LibreOffice.
Astra Smolensk 1.6 бюллетень 15, стоит LO 6.4.7.2 тестовый файл приложил, MSO 2010 открывает его без ошибок
Я проверял свой скрипт в версиях 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.