Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы сортировки данных в OpenOffice Calc через Delphi

Delphi , Базы данных , Сортировка и Фильтр

При работе с OpenOffice Calc через Delphi может возникнуть проблема, когда данные не сортируются должным образом, несмотря на правильное использование примеров кода на Basic или C#. В этой статье мы рассмотрим причину этой проблемы и предложим решение.

Описание проблемы

Пользователь столкнулся с трудностями при попытке отсортировать данные в OpenOffice Calc через Delphi. Он пытался следовать примерам кода на Basic или C#, но безуспешно. Данные не менялись, и пользователь подозревал, что проблема может быть связана с типами данных.

Минимальный воспроизводимый пример

Вот пример кода, который воспроизводит проблему:

program OpenOfficeCalcSortingIssue;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, Variants, ComObj, ActiveX;

var
  StarOffice:     OleVariant;
  SODesktop:      OleVariant;
  SOCalc:         OleVariant;
  CalcSheets:     OleVariant;
  CalcSheet:      OleVariant;
  SortFields:     OleVariant;
  SortDescriptor: OleVariant;

begin
  CoInitialize(nil);
  try
    try
      StarOffice:=CreateOleObject('com.sun.star.ServiceManager');
      SODesktop:=StarOffice.CreateInstance('com.sun.star.frame.Desktop');
      SOCalc:=SODesktop.LoadComponentFromURL('private:factory/scalc', '_blank', 0, VarArrayCreate([0, -1], varVariant));
      CalcSheets:=SOCalc.GetSheets;
      CalcSheet:=CalcSheets.GetByIndex(0);

      CalcSheet.GetCellByPosition(0, 0).SetValue(2);
      CalcSheet.GetCellByPosition(0, 1).SetValue(1);
      CalcSheet.GetCellByPosition(0, 2).SetValue(4);
      CalcSheet.GetCellByPosition(0, 3).SetValue(3);

      SortFields:=VarArrayCreate([0, 0], varVariant);
      SortFields[0]:=StarOffice.Bridge_GetStruct('com.sun.star.util.SortField');
      SortFields[0].Field:=0;
      SortFields[0].SortAscending:=True;

      SortDescriptor:=VarArrayCreate([0, 0], varVariant);
      SortDescriptor[0]:=StarOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
      SortDescriptor[0].Name:='SortFields';
      SortDescriptor[0].Value:=SortFields;

      CalcSheet.GetCellRangeByName('A1:A4').Sort(SortDescriptor);
    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    CoUninitialize;
  end;
end.

Альтернативный ответ

Пользователь столкнулся с той же проблемой, но не нашел решения, следуя примерам кода на Basic или C#.

Подтвержденный ответ

Решением проблемы является правильное использование объекта ValueObject для настройки свойства SortFields. Вот исправленный код:

program OpenOfficeCalcSortingIssue;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, Variants, ComObj, ActiveX;

var
  StarOffice:     OleVariant;
  SODesktop:      OleVariant;
  SOCalc:         OleVariant;
  CalcSheets:     OleVariant;
  CalcSheet:      OleVariant;
  SortFields:     OleVariant;
  SortDescriptor: OleVariant;
  ValueObject:    OleVariant;

begin
  CoInitialize(nil);
  try
    try
      StarOffice:=CreateOleObject('com.sun.star.ServiceManager');
      SODesktop:=StarOffice.CreateInstance('com.sun.star.frame.Desktop');
      SOCalc:=SODesktop.LoadComponentFromURL('private:factory/scalc', '_blank', 0, VarArrayCreate([0, -1], varVariant));
      CalcSheets:=SOCalc.GetSheets;
      CalcSheet:=CalcSheets.GetByIndex(0);

      CalcSheet.GetCellByPosition(0, 0).SetValue(2);
      CalcSheet.GetCellByPosition(0, 1).SetValue(1);
      CalcSheet.GetCellByPosition(0, 2).SetValue(4);
      CalcSheet.GetCellByPosition(0, 3).SetValue(3);

      SortFields:=VarArrayCreate([0, 0], varVariant);
      SortFields[0]:=StarOffice.Bridge_GetStruct('com.sun.star.table.TableSortField');
      SortFields[0].Field:=0;
      SortFields[0].IsAscending:=True;

      ValueObject:=StarOffice.Bridge_GetValueObject;
      ValueObject.Set('[]com.sun.star.table.TableSortField', SortFields);

      SortDescriptor:=VarArrayCreate([0, 0], varVariant);
      SortDescriptor[0]:=StarOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
      SortDescriptor[0].Name:='SortFields';
      SortDescriptor[0].Value:=ValueObject;

      CalcSheet.GetCellRangeByName('A1:A4').Sort(SortDescriptor);
    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    CoUninitialize;
  end;
end.

В этом исправленном коде мы создаем объект ValueObject и используем его для настройки свойства SortFields. Это решение основано на примере, найденном пользователем в Интернете, и, как оказалось, является ключом к правильной сортировке данных в OpenOffice Calc через Delphi.

Комментарии

В комментариях пользователи рекомендуют ссылаться на конкретные источники информации, а не просто на "глубины Интернета". В данном случае пользователь нашел решение в примере, загруженном с сайта SourceForge (https://sourceforge.net/projects/ooomacros/files/Delphi%20OOo/Version%201.2/Delphi_OOo_v12en.zip), и упомянул другой вопрос на StackOverflow (https://stackoverflow.com/questions/9274300/openoffice-calc-with-delphi-again), где, возможно, нашел эту ссылку.

Создано по материалам из источника по ссылке.

Статья о решении проблемы сортировки данных в OpenOffice Calc через Delphi, где пользователь столкнулся с трудностями при использовании примеров кода на Basic или C#, и предлагается решение с использованием объекта ValueObject для настройки свой


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сортировка и Фильтр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 12:31:59/0.004817008972168/1