Как импортировать данные Excel (*.xlsx) на имеющийся лист Calc? [Решено]

Автор eeigor, 14 марта 2020, 18:09

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

eeigor

Помогите разобраться.
Каким методом импортировать данные Excel (*.xlsx) на имеющийся лист Calc?
StarDesktop.LoadComponentFromUrl(sUrl, ...)

Вроде, надо использовать какой-то фильтр (какой?).
Не могу найти пример.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

rami

Так вам нужно документ открыть (StarDesktop.LoadComponentFromUrl(sUrl, ...)) или данные загрузить (импортировать данные Excel (*.xlsx) на имеющийся лист Calc?) ???

eeigor

#2
Надо подгрузить данные из файла Excel (это штатная выгрузка данных из другой программы) на свой лист ODS и обработать их. Данные накапливаются. Как обработать, уже написано. Диалог тоже готов: файл выбран.

Осталось только автоматизировать загрузку данных из файла. Можно, конечно, открыть файл Excel "руками", скопировать данные в буфер, перейти в свой файл ODS и вставить данные из буфера строго в определенное место, нажать кнопку на этом листе, по которой будет сделано всё, что требуется.

Я знаю, как открыть любой файл в MS Office (CreateObject("Excel.Application"); CreateObject("Excel.Sheet")). Как здесь - не знаю.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

rami

Думаю, что угадал.

Только учтите, что этот макрос перезапишет содержимое первого листа текущего документа. Тренируйтесь на копии документа.
Sub Main 'импорт всего листа sSheet
Dim oDoc, sURL$, sSheet$, FilterName$, FilterOptions$, Mode%
sURL = "путь к файлу.xlsm"
sSheet = "Имя импортируемого листа из файла xlsm"
FilterName = "Calc MS Excel 2007 VBA XML"
FilterOptions = ""
Mode = com.sun.star.sheet.SheetLinkMode.NORMAL
oDoc = ThisComponent
oDoc.Sheets(0).link(sURL, sSheet, FilterName, FilterOptions, Mode)
oDoc.Sheets(0).setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)
End Sub

economist

или Лист - Вставить лист из Файла - [выбрать xls] - Связь - [выбрать лист]

или Лист - Связь с внешними данными - [выбрать именованный диапазон]

или Лист - Вставить лист... - [выбрать xls] - Связь - [выбрать лист]

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

eeigor

#5
rami, спасибо!!
Всё сработало. И имя фильтра "Calc MS Excel 2007 VBA XML" подошло как к файлам XLSM, так и XLSX. Откуда, вообще, все эти имена взять?
Но моя задача решена!!
Уточню только один момент:
если имя листа в источнике не задавать, то берётся первый лист независимо от его имени.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

rami

Выполните макрос:
Sub getFilterName
Dim oArgs, i%
oArgs = ThisComponent.Args
For i=0 To UBound(oArgs)
If oArgs(i).Name = "FilterName" Then Print oArgs(i).Value
Next
End Sub


Для XLSX фильтр будет "Calc MS Excel 2007 XML" (я искал у себя какой-нибудь файл типа "Документ Excel" и чуток промахнулся ;D )

eeigor

#7
rami, я выполнил предложенный макрос. Всего 9 свойств (0..8), из них одно связано с именем фильтра.
oArgs(1).Name == "FilterName"
oArgs(1).Value == "calc8"
А где же остальные фильтры?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#8
economist, тоже спасибо. Я не там искал (записал бы макрос, увидел бы ключевые слова и заглянул бы в API Doc).

Вот только ничего не записалось:

sub blabla
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:InsertSheetFromFile", "", 0, Array())


end sub
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

rami

ThisComponent всегда ссылается на текущий документ в котором запущен макрос. Судя по calc8 вы запускали из документа .ods.

Откройте любой документ нужного вам типа и выполните макрос. Этот макрос нужен один раз в сто лет, чтобы узнать имя фильтра. В книге Питоньяка от 2004г. есть списки фильтров для многих документов, но для .xlsx нет.

eeigor

Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

economist

eeigor - в #4 написан на тот случай, если штатная выгрузка данных из другой программы выдает все время один и тот же файл, по одному и тому же пути, например D:\Отчет.xls, и хочется при каждом открытии ODS просто сразу видеть содержимое XLS без лишних диалогов, макросов итп.   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

Все имена фильтров импорта можно посмотреть в диалоге экспертной конфигурации, раскрыв org.openoffice.TypeDetection.Filter/Filter
С уважением,
Михаил Каганский

eeigor

#13
Цитата: rami от 15 марта 2020, 08:35Откройте любой документ нужного вам типа и выполните макрос.
Спасибо ещё раз, всё увидел... но это было не очевидно.

Цитата: mikekaganski от 15 марта 2020, 11:10Все имена фильтров импорта можно посмотреть в диалоге экспертной конфигурации, раскрыв org.openoffice.TypeDetection.Filter/Filter
Мне не понятно, как это раскрыть, и где (что за диалог). Можно пояснить?
OS: Linux Ubuntu 18.04 LTS
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community