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

Как импортировать данные из Excel в StringGrid

Delphi , Технологии , OLE Automation MSOffice



Автор: http://www.swissdelphicenter.ch

uses
  ComObj;

function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  // Create Excel-OLE Object
  XLApp := CreateOleObject('Excel.Application');
  try
    // Hide Excel
    XLApp.Visible := False;

    // Open the Workbook
    XLApp.Workbooks.Open(AXLSFile);

    // Sheet := XLApp.Workbooks[1].WorkSheets[1];
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];

    // In order to know the dimension of the WorkSheet, i.e the number of rows
    // and the number of columns, we activate the last non-empty cell of it

    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    // Get the value of the last row
    x := XLApp.ActiveCell.Row;
    // Get the value of the last column
    y := XLApp.ActiveCell.Column;

    // Set Stringgrid's row &col dimensions.

    AGrid.RowCount := x;
    AGrid.ColCount := y;

    // Assign the Variant associated with the WorkSheet to the Delphi Variant

    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
    //  Define the loop for filling in the TStringGrid
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      AGrid.RowCount := k + 1;
    until k > x;
    // Unassign the Delphi Variant Matrix
    RangeMatrix := Unassigned;

  finally
    // Quit Excel
    if not VarIsEmpty(XLApp) then
    begin
      // XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Xls_To_StringGrid(StringGrid1, 'C:\Table1.xls') then
    ShowMessage('Table has been exported!');
end;

Here's the translation of the content into Russian:

Код, предоставленный ниже, это функция Delphi, которая импортирует данные из файла Excel (.xls) в контрольную строку (StringGrid). Функция принимает два параметра: AGrid (объект TStringGrid) и AXLSFile (путь к файлу Excel).

Вот, что код делает:

  1. Создается экземпляр приложения Excel с помощью COM.
  2. Открывается указанный файл Excel и активируется первая страница.
  3. Определяется количество строк и столбцов в таблице Excel, найдя последнюю не пустую ячейку, и затем устанавливается количество строк и столбцов для StringGrid.
  4. Присваивается значение диапазона ячеек от A1 до последней ячейки (определенной ранее) переменной Variant, называемой RangeMatrix.
  5. Проводится цикл по каждой ячейке в диапазоне и присваивается ее значение соответствующей ячейке в StringGrid.
  6. Наконец, закрывается Excel и отменяется любые COM-объекты, которые были использованы.

Процедура ButtonClick - это обработчик события клика кнопки. Когда кнопка кликается, она вызывает функцию Xls_To_StringGrid с указанным путем файла Excel и контролем StringGrid как параметрами. Если импортирование успешно, отображается сообщение об ошибке, говорящее "Таблица была экспортирована!".

Вот, как можно улучшить этот код:

  1. Обработка ошибок: Текущий код не обрабатывает никаких потенциальных ошибок, которые могут возникнуть при выполнении функции. Вы можете добавить блоки try-except для ловли и обработки конкретных исключений.
  2. Управление памятью: Код присваивает много COM-объектов, которые не отменяются правильно в случае исключения. Это может привести к утечкам памяти. Вам нужно всегда отменять COM-объекты, когда вы закончили с ними, используя метод Release или ключевое слово Unassigned.
  3. Организация кода: Код довольно длинный и выполняет несколько задач. Вы можете рассмотреть разбиение его на более маленькие процедуры или функции, каждая из которых обрабатывает конкретную задачу. Это сделает код проще для чтения и поддержки.

Вот альтернативное решение с использованием компонента AdoQuery:

procedure TForm1.Button1Click(Sender: TObject);
var
  AdoConnection: TADOConnection;
  AdoQuery: TADOQuery;
begin
  AdoConnection := TADOConnection.Create(nil);
  AdoConnection.ConnectionString := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Table1.xlsx';
  AdoConnection.Open;

  AdoQuery := TADOQuery.Create(nil);
  AdoQuery.Connection := AdoConnection;
  AdoQuery.SQL.Add('SELECT * FROM [Sheet1$]');
  AdoQuery.Open;

  StringGrid1.RowCount := AdoQuery.RecordCount + 1;
  StringGrid1.ColCount := AdoQuery.FieldCount;
  StringGrid1.FixedCols := 0;
  StringGrid1.Options.drawnormalgridlines := true;
  StringGrid1.Clear;
  while not AdoQuery.Eof do
  begin
    for i := 0 to AdoQuery.FieldCount - 1 do
      StringGrid1.Cells[i, 0] := AdoQuery.Fields[i].Value;
    AdoQuery.Next;
  end;

  AdoQuery.Close;
  AdoQuery.Destroy;
  AdoConnection.Close;
  AdoConnection.Destroy;
end;

В этом альтернативном решении мы используем AdoQuery для подключения к файлу Excel и выполнения запроса, который возвращает все данные из страницы. Затем мы проходим по записям и присваиваем каждому полю значение соответствующей ячейке в StringGrid. Это более эффективное и легкое для поддержки решение, чем оригинальный код.

Руководство по импортированию данных из файла Excel в StringGrid с помощью создания OLE-объекта Excel и программирования в Delphi.


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

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




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


:: Главная :: OLE Automation MSOffice ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-19 01:39:20/0.0036799907684326/0