|
v7: сортировка в OO Calc | ☑ | ||
---|---|---|---|---|
0
xvoley
20.08.15
✎
11:33
|
Никак не могу произвести сортировку в Open Office Calc таким методом:
Sub SortColZero Dim oSheet Dim oRange Dim oSortFields(0) as new com.sun.star.util.SortField Dim oSortDesc(0) as new com.sun.star.beans.PropertyValue oSheet = ThisComponent.Sheets(3) REM Установим диапазон сортировки oRange = oSheet.getCellRangeByName("B28:D33") REM Сортировка по первому полю в диапазоне oSortFields(0).Field = 0 oSortFields(0).SortAscending = FALSE REM Установим поля сортировки для использования oSortDesc(0).Name = "SortFields" oSortDesc(0) .Value = oSortFields() REM Теперь выполним сортировку диапазона! oRange.Sort(oSortDesc()) End Sub Делаю так: oSortFields = scr.Eval("ServiceManager.Bridge_GetStruct('com.sun.star.util.SortField')"); oSortDesc = scr.Eval("ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); //oSortFields = СоздатьОбъект("com.sun.star.util.SortField"); //oSortDesc =СоздатьОбъект("com.sun.star.beans.PropertyValue"); //REM Установим диапазон сортировки oRange = Лист.getCellRangeByName("A1:M" + ВсегоСтрок); //REM Сортировка по первому полю в диапазоне oSortFields.Field = 0; oSortFields.SortAscending = 0; //REM Установим поля сортировки для использования oSortDesc.Name = "SortFields"; oSortDesc.Value = oSortFields; //REM Теперь выполним сортировку диапазона! oRange.Sort(oSortDesc); Ничего не выходит. |
|||
1
Dmitry1c
20.08.15
✎
11:36
|
Беда какая.
Может быть, купите MS Office? |
|||
2
xvoley
20.08.15
✎
11:42
|
(1) Куплен. Но на все 19 аптечных пунктов лицензий не накупили. У кого-то еще остался Open Office.
|
|||
3
aka AMIGO
20.08.15
✎
11:42
|
(0) LibreOffice не пробовали ставить? Чуть больше возможностей.. Да и макросы стОит поискать, вдруг можно трассировать :)
|
|||
4
xvoley
20.08.15
✎
11:45
|
(3) Да уже всю обработку документа на 22000 строк с изменением форматирования написал под OO Calc, осталось только сортировку допилить.
|
|||
5
Garikk
20.08.15
✎
11:45
|
...а какже крики о том что OO ваще аналог MSO и в стопицот раз лучше?
|
|||
6
xvoley
20.08.15
✎
11:50
|
(5) Весь форум перерыл вместе с инфостартом. Видимо, никто не озадачивался сортировкой.
|
|||
7
Апош
20.08.15
✎
11:53
|
сортировать до вывода в файл предлагать?
|
|||
8
xvoley
20.08.15
✎
12:06
|
(7) Нет. Сортировка будет вызываться потом несколько раз для бинарного поиска по двум разным колонкам.
|
|||
9
xvoley
20.08.15
✎
16:33
|
Такую ошибку пишет: oRange.Sort(oSortDesc); [automation bridge] : [automation bridge] UnoConversionUtilities<T>::dispatchExObject2Sequence
Conversion of dispatch object to Sequence failed! |
|||
10
romix
20.08.15
✎
16:39
|
Может оно слово oRange с апельсином путает... Константа Orange может быть пересекается.
|
|||
11
romix
20.08.15
✎
16:41
|
В примере oSortDesc(0).Name, в коде
oSortDesc.Name |
|||
12
xvoley
20.08.15
✎
17:22
|
(10) Тогда ругался бы тут: oRange = Лист.getCellRangeByName("A1:M" + ВсегоСтрок);
(11) 1С не дает использовать oSortDesc(0).Name, думает, что это функция или процедура. Через квадратные скобочки тоже. |
|||
13
xvoley
21.08.15
✎
09:22
|
Вверх.
|
|||
14
Todorov
21.08.15
✎
11:45
|
||||
15
aka AMIGO
21.08.15
✎
12:39
|
(0) так и не запускал запись/чтение макросов?
а зря, давно-бы узнал команду для сортировки |
|||
16
xvoley
21.08.15
✎
12:51
|
(15) Запускал. Команда та же. Параметров больше.
|
|||
17
xvoley
21.08.15
✎
12:51
|
(14) Полезно, но там для питона. 1С в этом плане покапризнее.
|
|||
18
xvoley
21.08.15
✎
12:55
|
//rem get access to the document
//document = ThisComponent.CurrentController.Frame dispatcher = scr.Eval("ServiceManager.Bridge_GetStruct('com.sun.star.frame.DispatchHelper')"); //rem ---------------------------------------------------------------------- //args1 = scr.Eval("ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); //args1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); args1[1].Name = "ToPoint"; args1[1].Value = "$A$3:$M$20"; dispatcher.executeDispatch(Document, ".uno:GoToCell", "", 0, args1[1]); //rem ---------------------------------------------------------------------- //args2 = scr.Eval("ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); //args2 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); args2[1].Name = "ByRows"; args2[1].Value = 1; args2[2].Name = "HasHeader"; args2[2].Value = 1; args2[3].Name = "CaseSensitive"; args2[3].Value = 1; args2[4].Name = "NaturalSort"; args2[4].Value = 0; args2[5].Name = "IncludeAttribs"; args2[5].Value = 1; args2[6].Name = "UserDefIndex"; args2[6].Value = 0; args2[7].Name = "Col1"; args2[7].Value = 2; args2[8].Name = "Ascending1"; args2[8].Value = 1; dispatcher.executeDispatch(Document, ".uno:DataSort", "", 0, args2[8]); //////////////////////////////////////////////////////////////////Тест (15) |
|||
19
xvoley
21.08.15
✎
12:56
|
(18) (15) Не дает создать dispatcher.
|
|||
20
xvoley
21.08.15
✎
12:58
|
(18) (15) Да и не даст потом присвоить третьим параметром массив целиком - args2. Пишет, что требуется скалярное значение. Поэтому в коде для теста используется args2[8].
|
|||
21
xvoley
21.08.15
✎
13:30
|
Сортировка на питоне (14) (очень похоже на мой код):
importClass(Packages.com.sun.star.uno.UnoRuntime); importClass(Packages.com.sun.star.sheet.XSpreadsheetDocument); importClass(Packages.com.sun.star.sheet.XSpreadsheets); importClass(Packages.com.sun.star.sheet.XCellRangeData); importClass(Packages.com.sun.star.chart.XChartDataArray); importClass(Packages.com.sun.star.sheet.XCalculatable); importClass(Packages.com.sun.star.table.XCellRange); importClass(Packages.com.sun.star.container.XIndexAccess); importClass(Packages.com.sun.star.beans.PropertyValue); importClass(Packages.com.sun.star.table.TableSortField); importClass(Packages.com.sun.star.table.TableSortFieldType); importClass(Packages.com.sun.star.util.XSortable); // get document XModel and get specific sheet oDoc = XSCRIPTCONTEXT.getDocument(); xSpreadsheetDocument = UnoRuntime.queryInterface(XSpreadsheetDocument, oDoc); oCalculate = UnoRuntime.queryInterface(XCalculatable, oDoc); xSpreadsheets = xSpreadsheetDocument.getSheets(); xIndexAccess = UnoRuntime.queryInterface(XIndexAccess, xSpreadsheets); oSheet = xIndexAccess.getByIndex(0); oCalculate.calculateAll(); xCellRange = UnoRuntime.queryInterface(XCellRange, oSheet); inRange = xCellRange.getCellRangeByName("D1:E101"); inRangeData = UnoRuntime.queryInterface(XCellRangeData, inRange); OrderRange = xCellRange.getCellRangeByName("H2:H3"); OrderRangeData = UnoRuntime.queryInterface(XChartDataArray, OrderRange); xSortRange = xCellRange.getCellRangeByName("A1:B101"); xSortRangeData = UnoRuntime.queryInterface(XCellRangeData, xSortRange); xSortRangeData.setDataArray(inRangeData.getDataArray()); SortRange(xSortRange,OrderRangeData.getData()) function SortRange(oRange,cols) { oSortRange = UnoRuntime.queryInterface(XSortable, oRange); oSortField = java.lang.reflect.Array.newInstance(TableSortField, 2); for(i = 0;i < oSortField.length;i++) { oSortField[i] = new TableSortField(); } oSortField[0].Field = cols[0][0]; oSortField[0].IsAscending = true; oSortField[0].FieldType = com.sun.star.table.TableSortFieldType.AUTOMATIC; oSortField[0].IsCaseSensitive = false; oSortField[1].Field = cols[1][0]; oSortField[1].IsAscending = true; oSortField[1].FieldType = com.sun.star.table.TableSortFieldType.AUTOMATIC; oSortField[1].IsCaseSensitive = false; oSortDesc = new Array(4); for(i = 0;i < oSortDesc.length;i++) { oSortDesc[i] = new PropertyValue(); } oSortDesc[0].Name = "SortFields"; oSortDesc[0].Value = oSortField; oSortDesc[1].Name = "ContainsHeader"; oSortDesc[1].Value = true; oSortDesc[2].Name = "IsSortColumns"; oSortDesc[2].Value = false; oSortDesc[3].Name = "BindFormatsToContent"; oSortDesc[3].Value = false; oSortRange.sort(oSortDesc); } |
|||
22
Todorov
21.08.15
✎
14:16
|
oSortFields.Field = 0;
похоже, это ошибка. А если так oSortFields[0].Field = [0]; oSortFields[0].SortAscending = FALSE |
|||
23
Todorov
21.08.15
✎
14:20
|
Пардон, (12) не увидел.
|
|||
24
xvoley
21.08.15
✎
15:11
|
(23) Спасибо, что попытался вникнуть в суть проблемы.
|
|||
25
xvoley
24.08.15
✎
09:18
|
Вверх.
|
|||
26
xvoley
25.08.15
✎
09:19
|
Вверх.
|
|||
27
xvoley
25.08.15
✎
10:53
|
dispatcher = ServiceManager.createInstance("com.sun.star.frame.DispatchHelper");
args1 = scr.eval("new Array()"); ParamValue = scr.Eval("ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); ParamValue.Name ="ToPoint"; ParamValue.Value = "$A$3:$M$20"; args1.push(ParamValue); dispatcher.executeDispatch(Document.CurrentController.Frame, ".uno:GoToCell", "", 0, args1); args2 = scr.eval("new Array()"); ParamValue = scr.Eval("ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); ParamValue.Name = "ByRows"; ParamValue.Value = 1; args2.push(ParamValue); ParamValue.Name = "HasHeader"; ParamValue.Value = 1; args2.push(ParamValue); ParamValue.Name = "CaseSensitive"; ParamValue.Value = 1; args2.push(ParamValue); ParamValue.Name = "NaturalSort"; ParamValue.Value = 0; args2.push(ParamValue); ParamValue.Name = "IncludeAttribs"; ParamValue.Value = 1; args2.push(ParamValue); ParamValue.Name = "UserDefIndex"; ParamValue.Value = 0; args2.push(ParamValue); ParamValue.Name = "Col1"; ParamValue.Value = 2; args2.push(ParamValue); ParamValue.Name = "Ascending1"; ParamValue.Value = 1; args2.push(ParamValue); dispatcher.executeDispatch(Document.CurrentController.Frame, ".uno:DataSort", "", 0, args2); |
|||
28
xvoley
25.08.15
✎
10:54
|
Как-то так. Только вот методы
|
|||
29
xvoley
25.08.15
✎
10:54
|
(28) Document.lockControllers();
Document.addActionLock(); Не работают. |
|||
30
aka AMIGO
25.08.15
✎
10:54
|
(27) это рабочий вариант?
|
|||
31
xvoley
25.08.15
✎
10:55
|
(30) Да. Только приходится пользователю нажимать кнопку Ok, чтобы сортировка произошла.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |