Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > загрузка csv в StringGrid


Автор: Driv3r 5.11.2005, 17:27
Попорбовал сделать так:
Код

procedure TForm2.BitBtn11Click(Sender: TObject);
var
f: TextFile;
St,q: String;
u,row:integer;

begin
if OpenDialog1.Execute then
begin
begin
AssignFile(f, OpenDialog1.FileName);
Reset(f);
try
row:=0;
While not Eof(f) Do
Begin
row:=row+1;
for u:=0 to 10 do begin // в гриде 11 столбцов
while St<>';' do begin 
ReadLn(f, St);
q:=q+St;
end;
With StringGrid1 Do begin
Cells[u,row];
Cells[u,row]:=q;
end;
end;

End;
finally
CloseFile(f);
end;
end;
end;
end;



Прога при этом виснет.Пробовал по разному но всё равно не грузит в StringGrid . Может чего посоветуете?

Автор: Albinos_x 5.11.2005, 17:55
ясен фиг:

Цитата(Driv3r @ 5.11.2005, 17:27)
while St<>';' do begin
ReadLn(f, St);
q:=q+St;

что этим пытаешся сделать?

Автор: Driv3r 5.11.2005, 19:14
Пытаюсь считать данные до разделителя ;

Автор: Poseidon 5.11.2005, 19:32
Цитата(Driv3r @ 5.11.2005, 19:14)
Пытаюсь считать данные до разделителя ;
А он есть?

PS. Простите меня глупого, но что такое "csv"?

Автор: Driv3r 5.11.2005, 20:00
Это формат файлов которые открываются Экселем.Имеют вид типа
Цитата

Данные;1;2;3;4;5;6;7;0;0;
Данные2;1;2;3;4;5;6;7;0;0;
Итого;2;1;3;4;5;6;7;0;0;

; разделяет столбцы.

Автор: Albinos_x 5.11.2005, 21:00
Цитата
ReadLn(f, St);

но ты же читаешь по-строчно, строка не равна символу ';', поэтому у тебя и уходит в бесконечный цыкл
тебе нужно сначало считывать строку и её уже перебирать от начала и до конца... или считывать по-символьно...

Цитата
for u:=0 to 10 do begin // в гриде 11 столбцов
while St<>';' do begin

и вообще я не могу найти инициализацию переменной St, в неё следует сначала считать, а потом уже проверять... тогда бы стоило использовать цикл с постусловием...
Добавлено @ 21:09
Цитата
Cells[u,row];

эта (24-ая) строка мне вообще не понятна...???

Автор: Wild User 5.11.2005, 21:54
Когда мне приспичило, я нашёл в и-нет такой код
И грузи CSV и XLS-файлы

Код

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;


Автор: Albinos_x 5.11.2005, 22:20
Wild User
этот код будет долго работать....

Автор: allx 6.11.2005, 11:32
А если вот так:

Код

....
while not Eof(f) do begin
  ReadLn(f, St);
  st:=StringReplace(st,';',#13#10,[rfReplaceAll]);
  StringGrid1.Rows[i].SetText(pchar(st));
  inc(i);
end;


Будьте проще, люди к вам потянутся smile)

Автор: Albinos_x 6.11.2005, 13:54
allx
ты свой вариан проверял?


я бы вот так сделал бы:
Код

procedure TForm1.BitBtn1Click(Sender: TObject);
var
   f: TextFile;
   St: String;
   List:TStringlist;
   row,i:integer;
begin
list:=TStringList.Create;
list.Clear;
if not OpenDialog1.Execute then
     begin
     MessageDlg('Файл не открыт.',mtError,[mbOk],0);
     Exit;
     end;
AssignFile(f, OpenDialog1.FileName);
Reset(f);
List.Delimiter:=';';
row:=1;
while not Eof(f) do
  begin
  ReadLn(f, St);
  List.DelimitedText:=st;
  for i:=0 to (List.Count-1) do
      StringGrid1.Cells[i+1,row]:=list.Strings[i];
  inc(row);
  end;
CloseFile(f);
end;


работает... проверял...

Автор: allx 6.11.2005, 16:44
Albinos_x
А че ему собсно не работать-то smile)

вот, неполенился, проверил: готовый текст

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  st: string;
  f: TextFile;
  i: integer;
  od1: TOpenDialog;
begin
  od1:=TOpenDialog.Create(self);
  if od1.Execute then begin
       i:=0;
       AssignFile(f, od1.FileName);
       Reset(f);
       while not Eof(f) do begin
         ReadLn(f, St);
         st:=StringReplace(st,';',#13#10,[rfReplaceAll]);
         StringGrid1.Rows[i].SetText(pchar(st));
         inc(i);
       end; 
  end;
  od1.free;
end;

Автор: Albinos_x 6.11.2005, 16:56
Цитата(allx @ 6.11.2005, 16:44)
А че ему собсно не работать-то

прошу прощения... эт у меня ошибка была... когда твой вариант проверял.... smile
Добавлено @ 16:59
вот ещё думаю в твой вариант надо добавить:
Код
...
         inc(i);    
       end;
  end;
  od1.Free;  // освободить память
end;
...

Автор: allx 6.11.2005, 18:17
Albinos_x
Цитата
вот ещё думаю в твой вариант надо добавить:

Точно. Пост поправил.

Автор: ~FoX~ 7.11.2005, 09:18
А я это через ADO реализовывал...
Код

procedure TSCRemont.Button6Click(Sender: TObject);
var
  s: String;
begin
  OpenDialog1.Execute;
  s:= OpenDialog1.FileName;
  with ADOQuery4 do begin
    ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + s + ';Extended Properties=Excel 8.0;Persist Security Info=False';
    Active := false;
    SQL.Clear;
    SQL.Add('Select * From [Лист1$]');
    Active := True;
  end;
  FullGridFromXLS; // ======Заполняем грид из Екселя
  ADOQuery4.Active := False;
end;

procedure FullGridFromXLS();// ======Заполняем грид из Екселя
var
  i: integer;
begin
  i:=0;
  with SCRemont do begin
    StringGrid1.RowCount := ADOQuery4.RecordCount;
    with ADOQuery4 do begin
      first;
      while not EOF do begin
        i:=i+1;
        StringGrid1.Cells[1, i] := ADOQuery4.FieldByName('Сервисный центр').AsString;
        StringGrid1.Cells[2, i] := ADOQuery4.FieldByName('Отчет №').AsString;
        StringGrid1.Cells[3, i] := ADOQuery4.FieldByName('Дата отчета').AsString;
        StringGrid1.Cells[4, i] := ADOQuery4.FieldByName('С/номер').AsString;
        StringGrid1.Cells[5, i] := ADOQuery4.FieldByName('Модель').AsString;
        StringGrid1.Cells[6, i] := ADOQuery4.FieldByName('Установленный дефект').AsString;
        StringGrid1.Cells[7, i] := ADOQuery4.FieldByName('Замена детали').AsString;
        StringGrid1.Cells[8, i] := ADOQuery4.FieldByName('Примечание').AsString;
        StringGrid1.Cells[9, i] := ADOQuery4.FieldByName('Дата').AsString;
        StringGrid1.Cells[10, i] := ADOQuery4.FieldByName('Время').AsString;
        StringGrid1.Cells[11, i] := ADOQuery4.FieldByName('Цена детали').AsString;
        StringGrid1.Cells[12, i] := ADOQuery4.FieldByName('Сумма ремонта').AsString;
        next;
      end;//while
    end; //with ADO
  end;  // with Form
end;

Может пригадиться кому smile

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