Нельзя ли примеры кода с использованием регулярных вы

Автор ForumOOo (бот), 5 июня 2014, 16:32

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

Hasim

Цитата: rami от 23 июня 2014, 12:40Тот же файл другим способом открывается правильно
Каким? Примерчик не выложите?

rami

Есть несколько возможностей, рассмотрим две наилучшие.
Первая самая простая. В меню "Вставка" выбираем "Лист из файла...", в окне выбираем файл, откроется окно "Импорт текста" устанавливаем параметры, в окне "Вставить лист" выбираем "Связь с файлом". Сохраняем. Обновление или по требованию, или макросом(одна строчка кода). Недостатки: в момент обновления всё, что есть на этом листе исчезает(форматы, формулы). Этот лист лучше скрыть, а данные после обработки перенести на "демонстрационный лист". Кстати если тоже самое сделать макросом получаются кракозябры, нужен фильтр,а я не знаю какой.
Вторая тоже просто. Рабочий документ должен быть открыт. Макрос открывает файл .csv и переносит данные куда нужно.
Sub Main  Dim oDoc1 As Object, oDoc2 As Object, sURL$, x%, y%
oDoc1=ThisComponent
sURL="file:///Адрес/вашего/файла.csv"
Dim Args(3) as new com.sun.star.beans.PropertyValue
Args(0).Name  = "Hidden"
Args(0).Value = True
Args(1).Name  = "ReadOnly"
Args(1).Value = True
Args(2).Name  = "FilterName"
Args(2).Value = "Text - txt - csv (StarCalc)"
Args(3).Name  = "FilterOptions"
Args(3).Value = "44,34,0,1"
oDoc2=StarDesktop.loadComponentFromURL(sURL,"_blank",0,Args())
Cursor =oDoc2.Sheets(0).createCursor()
Cursor.gotoEndOfUsedArea(TRUE)
x=Cursor.RangeAddress.EndColumn
y=Cursor.RangeAddress.EndRow
oDoc1.Sheets(0).getCellRangeByPosition(0,0,x,y).DataArray= _
oDoc2.Sheets(0).getCellRangeByPosition(0,0,x,y).DataArray
oDoc2.close(True)
End Sub

Имя и местонахождение очередного файла .csv всегда должно быть одно и тоже.

apt31

Второй вариант наиболее близок к искомому. Но есть недостатки. Во первых файлы Csv приходят под разными именами, точнее есть постоянная общая часть и плюс дата. Во вторых для удобства пользователя желательно открывать CSV  просто щелчком мыши прямо из почты а потом когда открыты оба файла Целевой и CSV копировать данные CSV заменяя старые на листе в целевом. В Excel это делалось перебором в макросе открытых книг. Как только обнаруживалось в имени файла признак .csv из него берутся данные и копируются в целевую книгу. Если такой вариант в Ооо не пройдет, тогда придется сохранять пришедший файл на диск, затем програмно предоставлять диалог открытия, брать из него URL, открывать файл и наконец копировать. Этот макрос тоже надо еще написать.  Просто это делать надо чуть ли не каждые два дня операторам с начальной квалификацией поэтому лишние движения накладны.

rami

Тогда не "всё пропало, шеф", это даже к лучшему, смотрите куда идет файл после щелчка, там и устроим засаду. Главное, чтобы Целевой файл имел статус ThisComponent, а файл CSV можно выловить с помощью рег. выражений. Думаю, что можно сделать так, что оператор щёлкнет мышкой и будет наблюдать как "завертелись шестерёнки"

apt31

Вот, вот как говорил Жванецкий. Это и нужно. Что такое "per"?

rami


apt31

Попробовал макрос Rami. При открытии файла CSV кракозябров действительно нет, но по столбцам разбиение неправильное. Видимо потому что, если открывать через интерфейс ООо,  то требуется точка с запятой а не запятая.( Не знаю как прикрепить свой файл CSV) Кроме того строка
y=Cursor.RangeAddress.EndRow
почему то вызывает ошибку переполнения. Все таки как открыть оба файла через интерфейс а потом програмно перенести данные?

rami

Нужно настроить фильтр импорта
Args(3).Name  = "FilterOptions"
Args(3).Value = "44,34,0,1"

Обычно разделитель "," он равен 44, а если разделитель ";" , то вместо 44 надо писать 59.
Могут быть и другие настройки у фильтра.

apt31

Ура. Кажется заработало. Пришлось правда скомпоновать два макроса. Открытие файла rami, а копирование Hasim.

rami

Цитата: apt31 от 26 июня 2014, 10:47Не знаю как прикрепить свой файл CSV
Вы наверно пользуетесь окном "Быстрый ответ". Нажмите на кнопку "Ответ" (это внизу поста) , в открывшимся окне есть значительно большие возможности редактирования, а также кнопка "Выбрать файл".
В макросе у Hasim диапазоны фиксированые , если в файле CSV данных будет больше, то они обрежутся, можно установить заведомо больший диапазон.

apt31


apt31

Попробовал програмно ставить защиту в листе Calc. Рекордер дает только 1 аргумент первый. Остальные попробовал сам. Не работает.

sub Zachita

' Date: Sun Jun 29 16:29:42 2014
   
   ' get access to the document
   oDocumentModel = ThisComponent
   oDocumentView = oDocumentModel.getCurrentController()
   oDocumentFrame = oDocumentView.Frame

   ' the dispatcher service is used to send commands from the
   ' document frame to the underlaying office application
   oDispatcher = CreateUnoService("com.sun.star.frame.DispatchHelper")
   


   Dim mArgs2(1) As New com.sun.star.beans.PropertyValue
   mArgs2(0).Name = "Protect"
   mArgs2(0).Value = True
   mArgs2(1).Name = "Password"
   mArgs2(1).Value = 1
   oDispatcher.executeDispatch(oDocumentFrame, ".uno:Protect" ,"" ,0 ,mArgs2())

end sub

rami

#27
Посмотрите здесь:http://forumooo.ru/index.php/topic,4134.msg25305.html#msg25305
Цитата: rami от 15 мая 2014, 00:38Защита листа.ods (16.38 Кб - загружено 7 раз.)
Sub Main
oSheet=ThisComponent.CurrentController.ActiveSheet
If oSheet.isProtected() Then  oSheet.unprotect(1) Else  oSheet.protect(1)
End Sub

apt31

Так просто. Вчера мучился где бы найти эти аргументы. Вообще я бы учредил медаль разработчикам OOо за самые непонятный ресурс (http://www.openoffice.org/api/basic/man/) по изучению  встроенного языка программирования.
Вот еще проблема. Создал кнопку на листе CALC. Как связать макрос с кнопкой . На панели управления все нормально работает а на листе - мертвая, хотя все вроде настроил.

apt31

Цитата из форума по Calc - (1 способ (простой):использовать файл xls с макросом Excel - в LibreOffice 3.4 и OpenOffice pro 3.3.2, если включена поддержка VBA, то всё работает хорошо.)
Действительно есть совместимость с поздними версиями или это шутка?