Code:

procedure SGridToHtml(SG: TStringgrid; Dest: TMemo; BorderSize: Integer);

var

i, p: integer;

SStyle1, SStyle2, Text: string;

begin

Dest.Clear;

Dest.Lines.Add('<html>');

Dest.Lines.Add('<body>');

Dest.Lines.Add('  <table border="' + IntToStr(BorderSize) + '" width="' +

   IntToStr(SG.Width) + '" height="' + IntToStr(SG.Width) + '">');

 

for i := 0 to SG.RowCount - 1 do

begin

   Dest.Lines.Add('  <tr>');

   for p := 0 to SG.ColCount - 1 do

   begin

     SStyle1 := '';

     SStyle2 := '';

     if fsbold in SG.Font.Style then

     begin

       SStyle1 := SStyle1 + '<b>';

       SStyle2 := SStyle2 + '</b>';

     end;

     if fsitalic in SG.Font.Style then

     begin

       SStyle1 := SStyle1 + '<i>';

       SStyle2 := SStyle2 + '</i>';

     end;

     if fsunderline in SG.Font.Style then

     begin

       SStyle1 := SStyle1 + '<u>';

       SStyle2 := SStyle2 + '</u>';

     end;

     Text := sg.Cells[p, i];

     if Text = '' then Text := ' ';

     Dest.Lines.Add('    <td width="' + IntToStr(sg.ColWidths[p]) +

       '" height="' + IntToStr(sg.RowHeights[p]) +

       '"><font color="#' + IntToHex(sg.Font.Color, 6) +

       '" face="' + SG.Font.Name + '">' + SStyle1 +

       Text + SStyle2 + '</font></td>');

   end;

   Dest.Lines.Add('  </tr>');

end;

Dest.Lines.Add('  </table>');

Dest.Lines.Add('</body>');;

Dest.Lines.Add('</html>');

end;

 

// Example, Beispiel

procedure TFormCSVInport.Button6Click(Sender: TObject);

begin

SGridToHtml(StringGrid1, Memo1, 1);

Memo1.Lines.SaveToFile('c:\test.html');

end;

 

Какое наилучшее решение для сохранения экземпляра TStringGrid (150x10)?

 

Если вы хотите сохранить это на диске:

 

Code:

procedure SaveGrid;

var

f: textfile;

x, y: integer;

begin

assignfile(f, 'Filename');

rewrite(f);

writeln(f, stringgrid.colcount);

writeln(f, stringgrid.rowcount);

for X := 0 to stringgrid.colcount - 1 do

   for y := 0 to stringgrid.rowcount - 1 do

     writeln(F, stringgrid.cells[x, y]);

closefile(f);

end;

 

 

Code:

function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;

const

xlCellTypeLastCell = $0000000B;

var

XLApp, Sheet: OLEVariant;

RangeMatrix: Variant;

x, y, k, r: Integer;

begin

Screen.Cursor:=crAppStart;

Result := False;

XLApp := CreateOleObject('Excel.Application');

try

   XLApp.Visible := False;

   XLApp.Workbooks.Open(AXLSFile);

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

   Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

   x := XLApp.ActiveCell.Row;

   y := XLApp.ActiveCell.Column;

   AGrid.RowCount := x;

   AGrid.ColCount := y; 

   RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;

   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; 

   RangeMatrix := Unassigned;

finally

   if not VarIsEmpty(XLApp) then

   begin

     XLApp.Quit; 

     XLAPP := Unassigned; 

     Sheet := Unassigned; 

     Result := True; 

   end

end;

Screen.Cursor:=crDefault;

end;

Экспорт StringGrid в исполняемый файл *.EXE
 
Как-то раз мне понадобилось из моей программы извлекать все содержимое StringGrid'a в exe-файл. В данном случае можно конечно писать свой собственный компилятор, но, согласитесь, это лишнее. Гораздо проще заранее написать exe-файл и поместить его в ресурсы нашей программы. А потом извлекать его оттуда, и записывать в его ресурсы содержимое StringGrid'a. Заманчиво звучит, правда? Тогда перейдем к реализации.
 
1. Создание exe-файла, в который поместим в конце содержимое StringGrid'a.
 
Так как данная статья посвящена языку Делфи, то и писать этот exe-файл я рекомендую на Делфи. Запускаем Делфи, создаем новый проект, и на форму кидаем StringGrid. Это обязательный набор, но вы можете добавить все что угодно, все, что вы хотели бы видеть, после того как сделаете экспорт из StringGrid'a в исполняемый файл.
Ниже представлен код процедуры загрузки содержимого из ресурсов в StringGrid:

Code:

{

This copies the contents of a TstringGrid/TDrawGrid (only Text!!) into a string.

Tabs are inserted between the columns, CR+LF between rows.

}

 

use

  Grids;

 

{...}

 

{ we need this Cracker Class because the Col/RowCount property

is not public in TCustomGrid }

type

  TGridHack = class(TCustomGrid);

 

function GetstringGridText(_Grid: TCustomGrid): string;

var

  Grid: TGridHack;

  Row, Col: Integer;

  s: string;

begin

  // Cast the paramter to a TGridHack, so we can access protected properties

Grid   := TGridHack(_Grid);

  Result := '';

  // for all rows, then for all columns

for Row := 0 to Grid.RowCount - 1 do

  begin

    for Col := 0 to Grid.ColCount - 1 do

    begin

      // the first column does not need the tab

     if Col > 0 then

        Result := Result + #9;

      Result := Result + Grid.GetEditText(Col, Row);

    end;

    Result := Result + #13#10;

end;

end;

Code:

{ With OLE Automation }

 

uses

  ComObj;

 

function RefToCell(ARow, ACol: Integer): string;

begin

  Result := Chr(Ord('A') + ACol - 1) + IntToStr(ARow);

end;

 

function SaveAsExcelFile(AGrid: TStringGrid; ASheetName, AFileName: string): Boolean;

const

  xlWBATWorksheet = -4167;

var

  Row, Col: Integer;

  GridPrevFile: string;

  XLApp, Sheet, Data: OLEVariant;

  i, j: Integer;

begin

  // Prepare Data

Data := VarArrayCreate([1, AGrid.RowCount, 1, AGrid.ColCount], varVariant);

  for i := 0 to AGrid.ColCount - 1 do

    for j := 0 to AGrid.RowCount - 1 do

      Data[j + 1, i + 1] := AGrid.Cells[i, j];

  // Create Excel-OLE Object

Result := False;

  XLApp := CreateOleObject('Excel.Application');

  try

    // Hide Excel

   XLApp.Visible := False;

    // Add new Workbook

   XLApp.Workbooks.Add(xlWBatWorkSheet);

    Sheet := XLApp.Workbooks[1].WorkSheets[1];

    Sheet.Name := ASheetName;

    // Fill up the sheet

   Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount,

      AGrid.ColCount)].Value := Data;

    // Save Excel Worksheet

   try

      XLApp.Workbooks[1].SaveAs(AFileName);

      Result := True;

    except

      // Error ?

   end;

  finally

    // Quit Excel

   if not VarIsEmpty(XLApp) then

    begin

      XLApp.DisplayAlerts := False;

      XLApp.Quit;

      XLAPP := Unassigned;

      Sheet := Unassigned;

    end;

  end;

end;

 

// Example:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  if SaveAsExcelFile(stringGrid1, 'My Stringgrid Data', 'c:\MyExcelFile.xls') then

    ShowMessage('StringGrid saved!');

end;