Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > *.xls -> StringGrid


Автор: mvdr 5.1.2006, 06:34
Что называется - туплю.
Подскажите, люди добрые (и злые), как Excel'евский файл открыть в StringGrid'e?

Автор: Guedda 5.1.2006, 09:51
Вот:
Код

uses
  ComObj;
...

function ExcelTableToStringGrid(_Grid : TStringGrid; ExcelFile : string) : boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  XLApp := CreateOleObject('Excel.Application');
  try
    XLApp.Visible := False;
    XLApp.Workbooks.Open(ExcelFile);
    Sheet := XLApp.Workbooks[ExtractFileName(ExcelFile)].WorkSheets[1];
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    x := XLApp.ActiveCell.Row;
    y := XLApp.ActiveCell.Column;
    _Grid.RowCount := x;
    _Grid.ColCount := y;
    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
    k := 1;
    repeat
      for r := 1 to y do
        _Grid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      _Grid.RowCount := k + 1;
    until k > x;
    RangeMatrix := Unassigned;
  finally
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
    end;
  end;
end;

У меня все работает.

Автор: mvdr 6.1.2006, 10:40
хорошо, завтра с работы проверю, Только не понял, откуда сам excel файл берется? Как его загрузить сдиска?

Автор: Albinos_x 6.1.2006, 11:15
Цитата(mvdr @ 6.1.2006, 10:40 Найти цитируемый пост)

хорошо, завтра с работы проверю, Только не понял, откуда сам excel файл берется? Как его загрузить сдиска?

Код
...
{_Grid - таблица типа TStringGrid в которую переносим даные
ExcelFile - путь имя к Excel файлу}
function ExcelTableToStringGrid(_Grid : TStringGrid; ExcelFile : string) : boolean;    
const    
  xlCellTypeLastCell = $0000000B;    
var    
  XLApp, Sheet: OLEVariant;    
  RangeMatrix: Variant;    
  x, y, k, r: Integer;    
begin    
  Result := False;    
  // создаём/открываем Excel
  XLApp := CreateOleObject('Excel.Application');    
  try    
    // делаем невидимым
    XLApp.Visible := False;    
    // открываем файл
    XLApp.Workbooks.Open(ExcelFile);    
...



почитай вот http://www.zoforum.zeroes-and-ones.com.ru/index.php?showtopic=355 я писал, может ещё чего интересного найдёшь

Автор: mvdr 7.1.2006, 19:04
"Метод Activate из класса Range завершен не корректно"
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, Buttons, ExtCtrls, ShellAPI, ComObj, Grids,
  OleCtnrs, ActnMan, ActnColorMaps;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    XPColorMap1: TXPColorMap;
    OleContainer1: TOleContainer;
    procedure BitBtn1Click(Sender: TObject);

 
   private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
  
function ExcelTableToStringGrid(_Grid : TStringGrid; ExcelFile : string) : boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  XLApp := CreateOleObject('Excel.Application');
  try
    XLApp.Visible := False;
    XLApp.Workbooks.Open(ExcelFile);
    Sheet := XLApp.Workbooks[ExtractFileName(ExcelFile)].WorkSheets[1];
    [color=red]Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;[/color]
    x := XLApp.ActiveCell.Row;
    y := XLApp.ActiveCell.Column;
    _Grid.RowCount := x;
    _Grid.ColCount := y;
    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
    k := 1;
    repeat
      for r := 1 to y do
        _Grid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      _Grid.RowCount := k + 1;
    until k > x;
    RangeMatrix := Unassigned;
  finally
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
    end;
  end;
end;

Добавлено @ 19:04
Код

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 ExcelTableToStringGrid(StringGrid1,'C:\documents and Settings\vova\Desktop\proba.xls');
end;

Автор: Albinos_x 7.1.2006, 21:07
попробуй этот код:
Код

procedure TForm1.Button1Click(Sender: TObject); 
var V:OleVariant; 
     x, y, k, r: Integer;
begin 
if OpenDialog1.Execute then 
  begin 
  // запускаем Excel 
  ExcelApplication1.AutoConnect:=true; 
  // открываем книгу 
  ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.OpenXML(OpenDialog1.FileName,EmptyParam)); 
  // соединяемся с книгой 
  ExcelApplication1.ConnectTo(ExcelWorkbook1.Application); 
  ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as ExcelWorksheet); 
  // делаем невидимым Excel 
  ExcelApplication1.Visible[0]:=false; 
  // узнаём количество строк:
  ExcelWorksheet1.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; 
  r:=ExcelApplication1.ActiveCell.Row;
  // считываем ячейки 
  for k:=1 to r do
     begin
     v:=ExcelWorksheet1.Range['A'+inttostr(k),EmptyParam]; 
    // записываем в таблицу  
    Table.Cells[1,k]:=V;   
    end;
  // выходим из Excel 
  ExcelApplication1.Quit; 
  end; 
end; 
...


кинь на форму соответствующие компаненты, Table - это StringGrid
код должен прочитать столбез А из екселя и занести его в таблицу StringGrid
PS: Код не проверял, могут быть ошибки

Автор: mr_tg 3.5.2013, 13:41
Искал  Excel'евский файл открыть в StringGrid'e
нашол  вашу тему, 
подгонял код Albinos_x под свой,
Код

 ExcelWorksheet1.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; 
  r:=ExcelApplication1.ActiveCell.Row;
  // считываем ячейки
 StringGrid1.RowCount:=r;
  StringGrid1.ColCount:=25;
  for k:=4 to StringGrid1.RowCount do
     begin
      Ch := 'A';
      for i:=0 to StringGrid1.ColCount do
        begin
         v:=ExcelWorksheet1.Range[Ch+inttostr(k),EmptyParam];
         Inc(Ch);
         // записываем в таблицу
         StringGrid1.Cells[i,k-4]:=V;
        end;

работает

но вопрос а что если столбцов много в Excel неподскажете?  число столбчов болше >100  (столбцы 'AB' 'AD' 'BD'....)

Albinos_x работа  "Работа с MS Excel и Word"  мне очен нравита помагает каждый раз.

Автор: Albinos_x 23.7.2013, 18:22
mr_tg, 
Доброе время суток.

Извините что долго не отвечал, только сейчас заметил, что вы мне письмо написали.

в топике, про который вы написали я давал код функции, которая по номеру определяет порядок сочетания букв
непосредственная ссылка на пост:
http://forum.vingrad.ru/index.php?showtopic=84634&view=findpost&p=651663

код самой функции:
Код

...
// организую адресацию по столбцам в Excel
function AddresColExcel(const Num:word):string;
var len, N:word;
ch:string;
begin
N:=Num;
ch:=char(ord('A')+(Num mod 26));
N:=N div 26;
while N<>0 do
begin
len:=Length(ch)+1;
SetLength(ch,Len);
ch[len]:=char(ord('A')+(N mod 26)-1);
N:=N div 26;
end;
len:=Length(ch);
SetLength(Result,len);
for n:=1 to len do
Result[n]:=ch[len+1-n];
end;
...


не забывайте что в office XP, 2003, 2000 только 255 столбцов

также если обращаться к ячейке через метод cells то можно указывать напрямую цифрами...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)