Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

1 Декабрь 2020, 07:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Добрый день! Проблема в том, что При экспорте из Calk на в?...  (Прочитано 933 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ForumOOo (бот)

Offline Offline

Сообщений: 747


« Стартовое сообщение: 7 Октябрь 2020, 15:22 »

Компонент: Calc
Версия продукта: 5.x
Сборка: LibreOffice 7
ОС: Win7

Добрый день! Проблема в том, что При экспорте из Calk на выходе нужна таблица с форматированием, без формул и макросов.
Макрос экспортирует из Calk диапазон ячеек (таблицу) в новый файл ODT. Присваивает имя нового файла исходя из данных ячейки.

Sub CellRange_ODT

dim Arg(0) as new com.sun.star.beans.PropertyValue
dim args2(1) as new com.sun.star.beans.PropertyValue

 cPath = "file:///c:/"
 cFlNm=".odt"

 Doc = ThisComponent
 Sheet = Doc.Sheets.getByName("Nak")
 CellRange = Sheet.getCellRangeByName("$A2:$H$21")

 cName=Sheet.getCellByPosition(4,5).getString '$E$6. 'имя файла из ячейки
 
cFullName = cPath + cName + cFlNm ' Полное имя файла для сохранения
URL1 = ConvertToUrl(cFullName)' Преобразуем строку в URL для использования в команде сохранения
ThisComponent.storeToURL(URL1, args2()) ' Сохраняем.

End Sub

--
Подпись: DimS
Записан
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 229


WWW
« Ответ #1: 8 Октябрь 2020, 12:29 »

Для сoхранения выделенного диапазона ячееек в формате ODT можно использовать следующий макрос (не изменяет буфер обмена):

Код:
Sub SelectionToODT(fileName)
  Dim v, oDoc
  v=ThisComponent.CurrentController.getTransferable()
  oDoc = StarDesktop.loadComponentFromURL( "private:factory/swriter", "_blank", 0, Array() )
  With oDoc
    .CurrentController.insertTransferable(v)
    .storeToUrl(ConvertToUrl(FileName), Array())
    .close(True)
  End With 
End Sub

Пример использования:

Код:
' Копирует диапазон A1:C3 активного листа в файл "C:\temp\test.odt"
Sub TestSelectionToODT()
  With ThisComponent.CurrentController
     .Select(.ActiveSheet.getCellRangeByName("A1:C3"))
  End With  
  SelectionToODT("C:\temp\test.odt")
End Sub
« Последнее редактирование: 8 Октябрь 2020, 12:32 от sokol92 » Записан

Владимир.
DimS
Участник
**
Offline Offline

Сообщений: 10


« Ответ #2: 8 Октябрь 2020, 14:24 »

Простой и работающий код. Но, к сожалению, не переносит формат оригинала...
Записан
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 229


WWW
« Ответ #3: 8 Октябрь 2020, 14:47 »

Должен переносить и формат. Приведите, пожалуйста, пример файла Calc.
Записан

Владимир.
DimS
Участник
**
Offline Offline

Сообщений: 10


« Ответ #4: 8 Октябрь 2020, 15:05 »

Вот оригинал

* оригинал.ods (11.95 Кб - загружено 8 раз.)
Записан
DimS
Участник
**
Offline Offline

Сообщений: 10


« Ответ #5: 8 Октябрь 2020, 15:05 »

вот результат

* test.odt (10.3 Кб - загружено 5 раз.)
Записан
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 229


WWW
« Ответ #6: 8 Октябрь 2020, 15:17 »

Результат такой же, как и при переносе через буфер обмена.
Записан

Владимир.
economist
Форумчанин
***
Offline Offline

Сообщений: 1 314


« Ответ #7: 8 Октябрь 2020, 15:19 »

Если вам нужно "отражение 1:1" ODS в ODT - поможет в ODT Вставка - Объект  OLE - из Файла - Связать (если нужно чтобы обновлялось автоматом).

Если нужны обновления без окна запроса - нужно добавить путь в Доверенные источники.  
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
DimS
Участник
**
Offline Offline

Сообщений: 10


« Ответ #8: 8 Октябрь 2020, 15:39 »

На выходе должен быть файл Odt или Ods (не принципиально), с форматированием как у источника, но без формул и макросов. Файлы готовятся для дальнейшей рассылки.
« Последнее редактирование: 8 Октябрь 2020, 15:58 от DimS » Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 019


« Ответ #9: 8 Октябрь 2020, 16:25 »

А pdf подойдет?
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
DimS
Участник
**
Offline Offline

Сообщений: 10


« Ответ #10: 8 Октябрь 2020, 16:47 »

макрос экспорта в PDF прост, работает сказочно, но не подходит
Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 019


« Ответ #11: 8 Октябрь 2020, 17:02 »

Кстати макрос sokol92 если переносить не в odt, а в ods документ переносит почти все, кроме ширины ячеек. Это уже можно кодом затем подправить.
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 229


WWW
« Ответ #12: 8 Октябрь 2020, 18:03 »

То, что можно сохранять в формате ODS - новация для этой темы. Тогда попробуем через буфер обмена (можно указывать различные опции для копирования).

Код:
' Сохраняет диапазон oRange документа oDoc как файл filename формата Calc
' flags - опции копирования: S тексты; V числа; D даты и время; F формулы; N комментарии; T форматы
'         по умолчанию: SVDT
Sub RangeToODS(Byval oDoc, Byval oRange, ByVal filename, Optional ByVal flags)
  Dim dispatcher, document, oDoc2
  If IsMissing(flags) Then
    flags="SVDT"
  End If 
 
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
 
  With oDoc.CurrentController
    .setActiveSheet(oRange.SpreadSheet)
    .select(oRange)
    dispatcher.executeDispatch(.frame, ".uno:Copy", "", 0, Array()) ' копируем выделенный диапазон в буфер обмена
  End With
 
  oDoc2 = StarDesktop.loadComponentFromURL( "private:factory/scalc", "_blank", 0, Array() ) 
  With oDoc2 
    .LockControllers
    dim args(5) as new com.sun.star.beans.PropertyValue
    args(0).Name = "Flags"          : args(0).Value = flags
    args(1).Name = "FormulaCommand" : args(1).Value = 0
    args(2).Name = "SkipEmptyCells" : args(2).Value = false
    args(3).Name = "Transpose"      : args(3).Value = false
    args(4).Name = "AsLink"         : args(4).Value = false
    args(5).Name = "MoveMode"       : args(5).Value = 4
    dispatcher.executeDispatch(.CurrentController.frame, ".uno:InsertContents", "", 0, args)
 
    CopyColumnWidth(oRange, .sheets(0).getCellRangeByName("A1"))
    .UnLockControllers   
   
    If filename<>"" Then
      .storeToUrl(ConvertToUrl(FileName), Array())
      .close(True)
    End If 
  End With   
End Sub

' Копирует ширины столбцов из диапазона oRange1 в oRange2
Sub CopyColumnWidth(oRange1, oRange2)
  Dim c1, n1 As Long, sheet2, columns2, j2 as Long
 
  columns2=oRange2.Spreadsheet.getColumns()
  j2=oRange2.getRangeAddress().StartColumn
   
  For Each c1 In oRange1.getColumns()
    n1=c1.Width
    If columns2(j2).width<>n1 Then
      columns2(j2).width=n1
    End If 
    j2=j2+1 
  Next c1
End Sub

' Копирует диапазон A1:F8 первого листа в файл "C:\temp\test.ods"
Sub TestRangeToODS
  RangeToODS(ThisComponent, ThisComponent.Sheets(0).getCellRangeByName("A1:F8"), "C:\temp\test.ods")
End Sub

Записан

Владимир.
DimS
Участник
**
Offline Offline

Сообщений: 10


« Ответ #13: 9 Октябрь 2020, 07:35 »

sokol92. Владимир, Очень интересно. Работает как надо, спасибо! Теперь попробую всунуть его в свою кашу ... Смеющийся 
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!