Имя: Пароль:
1C
1C 7.7
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, чтобы сортировка произошла.