<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Комментарии: Работа с Excel в Delphi. Основы основ.</title>
	<atom:link href="http://www.webdelphi.ru/2009/08/rabota-s-excel-v-delphi-osnovy-osnov/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.webdelphi.ru/2009/08/rabota-s-excel-v-delphi-osnovy-osnov/</link>
	<description>программируем в Delphi</description>
	<lastBuildDate>Mon, 06 Feb 2012 23:51:09 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>Автор: GS</title>
		<link>http://www.webdelphi.ru/2009/08/rabota-s-excel-v-delphi-osnovy-osnov/comment-page-1/#comment-8862</link>
		<dc:creator>GS</dc:creator>
		<pubDate>Fri, 23 Dec 2011 11:47:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.webdelphi.ru/?p=263#comment-8862</guid>
		<description>Буду только рад :)</description>
		<content:encoded><![CDATA[<p>Буду только рад :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Vlad</title>
		<link>http://www.webdelphi.ru/2009/08/rabota-s-excel-v-delphi-osnovy-osnov/comment-page-1/#comment-8859</link>
		<dc:creator>Vlad</dc:creator>
		<pubDate>Fri, 23 Dec 2011 10:14:24 +0000</pubDate>
		<guid isPermaLink="false">http://www.webdelphi.ru/?p=263#comment-8859</guid>
		<description>&lt;strong&gt;GS&lt;/strong&gt;, спасибо большое. Не возражаете, если я, по мере наличия свободного времени, опубликую в блоге отдельным постом эти примеры (Естественно с указанием настоящего автора примеров). Думаю, что такой пост может пригодиться многим.</description>
		<content:encoded><![CDATA[<p><strong>GS</strong>, спасибо большое. Не возражаете, если я, по мере наличия свободного времени, опубликую в блоге отдельным постом эти примеры (Естественно с указанием настоящего автора примеров). Думаю, что такой пост может пригодиться многим.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: GS</title>
		<link>http://www.webdelphi.ru/2009/08/rabota-s-excel-v-delphi-osnovy-osnov/comment-page-1/#comment-8852</link>
		<dc:creator>GS</dc:creator>
		<pubDate>Fri, 23 Dec 2011 06:17:21 +0000</pubDate>
		<guid isPermaLink="false">http://www.webdelphi.ru/?p=263#comment-8852</guid>
		<description>&lt;strong&gt;Упрощенный пример&lt;/strong&gt; для Delphi 7 с использованием библиотеки XLSReadWrite:

&lt;em&gt;var&lt;/em&gt;
&lt;em&gt;  IntlXls:  TXLSReadWriteII2;&lt;/em&gt;
&lt;em&gt;  I, J: Integer;&lt;/em&gt;

&lt;em&gt;begin&lt;/em&gt;
&lt;em&gt;    // создаем объект&lt;/em&gt;
&lt;em&gt;    IntlXls := TXLSReadWriteII2.Create(nil);&lt;/em&gt;

&lt;em&gt;      // название книги&lt;/em&gt;
&lt;em&gt;      IntlXls.Sheets[0].Name := &#039;Название моего отчета&#039;;&lt;/em&gt;
&lt;em&gt;      // добавляем необходимое количество строк и колонок &lt;/em&gt;
&lt;em&gt;      IntlXls.Sheets[0].Rows.AddIfNone(0, 10000);&lt;/em&gt;
&lt;em&gt;      IntlXls.Sheets[0].Columns.AddIfNone(0, 100);&lt;/em&gt;

&lt;em&gt;      // добавляем и заносим ширины ячеек (значение в пикселях)&lt;/em&gt;
&lt;em&gt;      for I := 0 to 99 do&lt;/em&gt;
&lt;em&gt;        IntlXls.Sheets[0].Columns[I].PixelWidth := 150;&lt;/em&gt;
&lt;em&gt;      // заносим высоты строк (значение здесь не в пикселях, поэтому нужно корректировать)&lt;/em&gt;
&lt;em&gt;      for I := 0 to 9999 do&lt;/em&gt;
&lt;em&gt;        IntlXls.Sheets[0].Rows[I].Height := 20 * 14;&lt;/em&gt;

&lt;em&gt;      // настраиваем &lt;/em&gt;
&lt;em&gt;      for J := 0 to 9999 do&lt;/em&gt;
&lt;em&gt;        for I := 0 to 99 do&lt;/em&gt;
&lt;em&gt;          begin&lt;/em&gt;
&lt;em&gt;             // заносим числовое значение &lt;/em&gt;
&lt;em&gt;             // если нужно например занести строку, то использовать AsString&lt;/em&gt;
&lt;em&gt;             IntlXls.Sheets [0]. AsFloat [I, J] := J + I / 100;&lt;/em&gt;

&lt;em&gt;              // выравнивание по горизонтали (доступно chaLeft, chaCenter, chaRight)&lt;/em&gt;
&lt;em&gt;             IntlXls.Sheets[0].Cell[I, J].HorizAlignment := chaLeft;&lt;/em&gt;

&lt;em&gt;             // выравнивание по вертикали (доступно cvaTop, cvaCenter, cvaBottom)&lt;/em&gt;
&lt;em&gt;             IntlXls.Sheets[0].Cell[I, J].VertAlignment := cvaTop;&lt;/em&gt;

&lt;em&gt;            // шрифт&lt;/em&gt;
&lt;em&gt;            IntlXls.Sheets[0].Cell[I, J].FontName    := &#039;Arial&#039;;&lt;/em&gt;
&lt;em&gt;            IntlXls.Sheets[0].Cell[I, J].FontSize    := 12;&lt;/em&gt;
&lt;em&gt;            IntlXls.Sheets[0].Cell[I, J].FontStyle   := [];&lt;/em&gt;
&lt;em&gt;            IntlXls.Sheets[0].Cell[I, J].FontColor   := TColorToClosestXColor(clBlue);&lt;/em&gt;
&lt;em&gt;            IntlXls.Sheets[0].Cell[I, J].Rotation    := 0;&lt;/em&gt;
&lt;em&gt;             // жирное начертание&lt;/em&gt;
&lt;em&gt;             with IntlXls.Sheets[0].Cell[I, J] do&lt;/em&gt;
&lt;em&gt;               FontStyle := FontStyle + [xfsBold];&lt;/em&gt;
&lt;em&gt;               // наклонное начертание&lt;/em&gt;
&lt;em&gt;               with IntlXls.Sheets[0].Cell[I, J] do&lt;/em&gt;
&lt;em&gt;                 FontStyle := FontStyle + [xfsItalic];&lt;/em&gt;
&lt;em&gt;                      // цвет фона&lt;/em&gt;
&lt;em&gt;                      IntlXls.Sheets[0].Cell[I, J].FillPatternForeColor :=&lt;/em&gt;
&lt;em&gt;                          TColorToClosestXColor(clYellow);&lt;/em&gt;

&lt;em&gt;                      // бордюр слева (аналогично и остальные бордюры)&lt;/em&gt;
&lt;em&gt;                      IntlXls.Sheets[0].Cell[I, J].BorderLeftColor := TColorToClosestXColor(clBlack);&lt;/em&gt;
&lt;em&gt;                      IntlXls.Sheets[0].Cell[I, J].BorderLeftStyle := cbsThin;&lt;/em&gt;

&lt;em&gt;                      // объединение ячеек (здесь объединяются две ячейки по горизонтали)&lt;/em&gt;
&lt;em&gt;                      if I = 49 then&lt;/em&gt;
&lt;em&gt;                        IntlXls.Sheets[0].MergedCells.Add(&lt;/em&gt;
&lt;em&gt;                          I,&lt;/em&gt;
&lt;em&gt;                          J,&lt;/em&gt;
&lt;em&gt;                          I + 1,&lt;/em&gt;
&lt;em&gt;                          J&lt;/em&gt;
&lt;em&gt;                      );&lt;/em&gt;
&lt;em&gt;           end;&lt;/em&gt;

        &lt;em&gt;IntlXls.SaveToFile(&#039;c:\demo.xls&#039;);
&lt;/em&gt;        &lt;em&gt;IntlXls.Free;&lt;/em&gt;

&lt;em&gt;  end;

&lt;/em&gt;&lt;strong&gt;Полный пример для Delphi 7:&lt;/strong&gt;

  function ExportToExcelXls(
    var AFileName: string
    ): Integer;
  var
    IntlXls:     TXLSReadWriteII2;
    IntlCol:     Integer;
    IntlRow:     Integer;
    IntlMainCol: Integer;
    IntlMainRow: Integer;
  begin
    // инициализируем статус
    prgrbrStatus.Max      := FLinkReport.RowCount;
    prgrbrStatus.Position := 0;
    pnlStatus.Visible     := TRUE;
    pnlStatus.Refresh;
    // добавлено в конце имени файла расширение &#039;.XLS&#039;?
    if Length(AFileName) &lt; 5 then
      // добавляем
      AFileName := AFileName + &#039;.xls&#039;
    else if AnsiCompareText(Copy(AFileName, Length(AFileName) - 3, 4), &#039;.xls&#039;) &lt;&gt; 0 then
      // добавляем
      AFileName := AFileName + &#039;.xls&#039;;
    // файл уже существует?
    if FileExists(AFileName) then
      // спросим
      if Application.MessageBox(
           PChar(&#039;Файл &quot;&#039; + AFileName + &#039;&quot; уже существует. Перезаписать?&#039;),
           &#039;Внимание&#039;,
           MB_TASKMODAL + MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON2
           ) &lt;&gt; IDYES then
        // выходим
        begin
          // код ошибки
          Result := UNIRPT_GENERATE_ABORT;
          
          // выходим
          Exit;
        end;  // if
    // создаем объект
    IntlXls := TXLSReadWriteII2.Create(nil);
    // все делаем защищаясь
    try
      // название книги
      IntlXls.Sheets[0].Name :=FLinkReport.Caption;
      // добавляем необходимое количество строк и колонок
      IntlXls.Sheets[0].Rows.AddIfNone(0, FLinkReport.Cells.RowCount + 1);
      IntlXls.Sheets[0].Columns.AddIfNone(0, FLinkReport.Cells.ColCount + 1);
      // добавляем и заносим ширины ячеек
      for IntlCol := 0 to FLinkReport.Cells.ColCount - 1 do
        IntlXls.Sheets[0].Columns[IntlCol].PixelWidth := FLinkReport.ColWidths[IntlCol];
      // заносим высоты строк  
      for IntlRow := 0 to FLinkReport.Cells.RowCount - 1 do
        IntlXls.Sheets[0].Rows[IntlRow].Height := FLinkReport.RowHeights[IntlRow] * 14;
      // проходим по всем строкам
      for IntlRow := 0 to FLinkReport.Cells.RowCount - 1 do 
        begin
          // проходим по всем колонкам
          for IntlCol := 0 to FLinkReport.Cells.ColCount - 1 do
            begin
              // определяем главную ячейку
              IntlMainCol := IntlCol + FLinkReport.Cells[IntlCol, IntlRow].Range.Left;
              IntlMainRow := IntlRow + FLinkReport.Cells[IntlCol, IntlRow].Range.Top;
              // заносим оформление
              with FLinkReport.Cells[IntlMainCol, IntlMainRow] do
                begin
                  // главная ячейка?
                  if (IntlMainCol = IntlCol) and (IntlMainRow = IntlRow) then
                    // да, заносим текст и его оформление
                    begin
                      // значение
                      try
                        // если значение - число то заносим его как число
                        IntlXls.Sheets [0]. AsFloat [IntlCol, IntlRow] := StrToFloat (Value);
                      except
                        // иначе заносим его как строку
                        IntlXls.Sheets [0]. AsString [IntlCol, IntlRow] := Value;
                      end;

                      // выравнивание по горизонтали
                      case HorizAlign of
                        haLeft:
                          // выравнивание слева
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].HorizAlignment := chaLeft;
                        haCenter:
                          // выравнивание по центру
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].HorizAlignment := chaCenter;
                        haRight:
                          // выравнивание справа
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].HorizAlignment := chaRight;
                      end;  // case
                      // выравнивание по вертикали
                      case VertAlign of
                        vaTop:
                          // выравнивание сверху
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].VertAlignment := cvaTop;
                        vaCenter:
                          // выравнивание в центре
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].VertAlignment := cvaCenter;
                        vaBottom:
                          // выравнивание снизу
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].VertAlignment := cvaBottom;
                      end;  // case
                      // шрифт
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FontName    := Font.Name;
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FontSize    := Font.Size;
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FontCharset := Font.Charset;
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FontStyle   := [];
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FontColor   := TColorToClosestXColor(Font.Color);
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].Rotation    := Font. Angle;
                      // есть жирное начертание?
                      if Font.IsBold then
                        // есть
                        with IntlXls.Sheets[0].Cell[IntlCol, IntlRow] do
                          FontStyle := FontStyle + [xfsBold];
                      // есть наклонное начертание?
                      if Font.IsItalic then
                        // есть
                        with IntlXls.Sheets[0].Cell[IntlCol, IntlRow] do
                          FontStyle := FontStyle + [xfsItalic];
                      // цвет фона
                      if Color &lt;&gt; clWindow then
                        // цвет задан
                        IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FillPatternForeColor :=
                          TColorToClosestXColor(Color);
                    end  // if
                  else
                    // просто активизируем ячейку (иначе ниже невозможно добавить бордюры)
                    IntlXls.Sheets[0].AsString[IntlCol, IntlRow] := &#039;&#039;;
                    
                  // бордюр слева есть?
                  with Borders.Left do
                    if LineHeight &gt; 0 then
                      // настраиваем
                      begin
                        // цвет
                        IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderLeftColor :=
                          TColorToClosestXColor(Color);
                        // толщина
                        if LineHeight = 1 then
                          // тонка
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderLeftStyle := cbsThin
                        else if LineHeight in [1, 2] then
                          // средняя толщина
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderLeftStyle := cbsMedium
                        else
                          // толстая
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderLeftStyle := cbsHair;
                      end;  // if, with
                  // бордюр сверху есть?
                  with Borders.Top do
                    if LineHeight &gt; 0 then
                      // настраиваем
                      begin
                        // цвет
                        IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderTopColor :=
                          TColorToClosestXColor(Color);
                        // толщина
                        if LineHeight = 1 then
                          // тонка
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderTopStyle := cbsThin
                        else if LineHeight in [1, 2] then
                          // средняя толщина
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderTopStyle := cbsMedium
                        else
                          // толстая
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderTopStyle := cbsHair;
                      end;  // if, with
                  // бордюр справа есть?
                  with Borders.Right do
                    if LineHeight &gt; 0 then
                      // настраиваем
                      begin
                        // цвет
                        IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderRightColor :=
                          TColorToClosestXColor(Color);
                        // толщина
                        if LineHeight = 1 then
                          // тонка
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderRightStyle := cbsThin
                        else if LineHeight in [1, 2] then
                          // средняя толщина
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderRightStyle := cbsMedium
                        else
                          // толстая
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderRightStyle := cbsHair;
                      end;  // if, with
                  // бордюр снизу есть?
                  with Borders.Bottom do
                    if LineHeight &gt; 0 then
                      // настраиваем
                      begin
                        // цвет
                        IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderBottomColor :=
                          TColorToClosestXColor(Color);
                        // толщина
                        if LineHeight = 1 then
                          // тонка
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderBottomStyle := cbsThin
                        else if LineHeight in [1, 2] then
                          // средняя толщина
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderBottomStyle := cbsMedium
                        else
                          // толстая
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderBottomStyle := cbsHair;
                      end;  // if, with
                  // объединение нужно?
                  if ((Range.Width &gt; 1) or (Range.Height &gt; 1)) and
                     ((IntlMainCol = IntlCol) and (IntlMainRow = IntlRow)) then
                    // объединяем
                    IntlXls.Sheets[0].MergedCells.Add(
                      IntlCol,
                      IntlRow,
                      IntlCol + Range.Width - 1,
                      IntlRow + Range.Height - 1
                      );
                  // пользователь нажал кнопку прерывания экспорта?
                  if btnCancel.Tag = 2 then
                    // да, выходим
                    Break;
                end;  // with
            end;  // for
          // обновляем статус
          prgrbrStatus.Position := prgrbrStatus.Position + 1;
          Application.ProcessMessages;
          // пользователь нажал кнопку прерывания экспорта?
          if btnCancel.Tag = 2 then
            // да, выходим
            Break;
        end;  // for
      // пользователь нажал кнопку прерывания экспорта?
      if btnCancel.Tag &lt;&gt; 2 then
        // нет
        begin
          // на левый верхний угол
          IntlXls.Sheet[0].TopRow              := 0;
          IntlXls.Sheet[0].LeftCol             := 0;
          IntlXls.Sheet[0].Selection.ActiveRow := 0;
          IntlXls.Sheet[0].Selection.ActiveCol := 0;
          
          // статус
          prgrbrStatus.Position := prgrbrStatus.Max;
          Application.ProcessMessages;
          // записываем в файл
          IntlXls.FileName := AFileName;
          IntlXls.Write;
          // все успешно
          Result := UNIRPT_OK;
          
        end  // if
      else
        // да
        Result := UNIRPT_GENERATE_ABORT;  
        
    finally
      // освобождаем память
      IntlXls.Free;
      
    end;  // try..finally
  end;  // function ExportToExcelXls</description>
		<content:encoded><![CDATA[<p><strong>Упрощенный пример</strong> для Delphi 7 с использованием библиотеки XLSReadWrite:</p>
<p><em>var</em><br />
<em>  IntlXls:  TXLSReadWriteII2;</em><br />
<em>  I, J: Integer;</em></p>
<p><em>begin</em><br />
<em>    // создаем объект</em><br />
<em>    IntlXls := TXLSReadWriteII2.Create(nil);</em></p>
<p><em>      // название книги</em><br />
<em>      IntlXls.Sheets[0].Name := &#8216;Название моего отчета&#8217;;</em><br />
<em>      // добавляем необходимое количество строк и колонок </em><br />
<em>      IntlXls.Sheets[0].Rows.AddIfNone(0, 10000);</em><br />
<em>      IntlXls.Sheets[0].Columns.AddIfNone(0, 100);</em></p>
<p><em>      // добавляем и заносим ширины ячеек (значение в пикселях)</em><br />
<em>      for I := 0 to 99 do</em><br />
<em>        IntlXls.Sheets[0].Columns[I].PixelWidth := 150;</em><br />
<em>      // заносим высоты строк (значение здесь не в пикселях, поэтому нужно корректировать)</em><br />
<em>      for I := 0 to 9999 do</em><br />
<em>        IntlXls.Sheets[0].Rows[I].Height := 20 * 14;</em></p>
<p><em>      // настраиваем </em><br />
<em>      for J := 0 to 9999 do</em><br />
<em>        for I := 0 to 99 do</em><br />
<em>          begin</em><br />
<em>             // заносим числовое значение </em><br />
<em>             // если нужно например занести строку, то использовать AsString</em><br />
<em>             IntlXls.Sheets [0]. AsFloat [I, J] := J + I / 100;</em></p>
<p><em>              // выравнивание по горизонтали (доступно chaLeft, chaCenter, chaRight)</em><br />
<em>             IntlXls.Sheets[0].Cell[I, J].HorizAlignment := chaLeft;</em></p>
<p><em>             // выравнивание по вертикали (доступно cvaTop, cvaCenter, cvaBottom)</em><br />
<em>             IntlXls.Sheets[0].Cell[I, J].VertAlignment := cvaTop;</em></p>
<p><em>            // шрифт</em><br />
<em>            IntlXls.Sheets[0].Cell[I, J].FontName    := &#8216;Arial&#8217;;</em><br />
<em>            IntlXls.Sheets[0].Cell[I, J].FontSize    := 12;</em><br />
<em>            IntlXls.Sheets[0].Cell[I, J].FontStyle   := [];</em><br />
<em>            IntlXls.Sheets[0].Cell[I, J].FontColor   := TColorToClosestXColor(clBlue);</em><br />
<em>            IntlXls.Sheets[0].Cell[I, J].Rotation    := 0;</em><br />
<em>             // жирное начертание</em><br />
<em>             with IntlXls.Sheets[0].Cell[I, J] do</em><br />
<em>               FontStyle := FontStyle + [xfsBold];</em><br />
<em>               // наклонное начертание</em><br />
<em>               with IntlXls.Sheets[0].Cell[I, J] do</em><br />
<em>                 FontStyle := FontStyle + [xfsItalic];</em><br />
<em>                      // цвет фона</em><br />
<em>                      IntlXls.Sheets[0].Cell[I, J].FillPatternForeColor :=</em><br />
<em>                          TColorToClosestXColor(clYellow);</em></p>
<p><em>                      // бордюр слева (аналогично и остальные бордюры)</em><br />
<em>                      IntlXls.Sheets[0].Cell[I, J].BorderLeftColor := TColorToClosestXColor(clBlack);</em><br />
<em>                      IntlXls.Sheets[0].Cell[I, J].BorderLeftStyle := cbsThin;</em></p>
<p><em>                      // объединение ячеек (здесь объединяются две ячейки по горизонтали)</em><br />
<em>                      if I = 49 then</em><br />
<em>                        IntlXls.Sheets[0].MergedCells.Add(</em><br />
<em>                          I,</em><br />
<em>                          J,</em><br />
<em>                          I + 1,</em><br />
<em>                          J</em><br />
<em>                      );</em><br />
<em>           end;</em></p>
<p>        <em>IntlXls.SaveToFile(&#8216;c:\demo.xls&#8217;);<br />
</em>        <em>IntlXls.Free;</em></p>
<p><em>  end;</p>
<p></em><strong>Полный пример для Delphi 7:</strong></p>
<p>  function ExportToExcelXls(<br />
    var AFileName: string<br />
    ): Integer;<br />
  var<br />
    IntlXls:     TXLSReadWriteII2;<br />
    IntlCol:     Integer;<br />
    IntlRow:     Integer;<br />
    IntlMainCol: Integer;<br />
    IntlMainRow: Integer;<br />
  begin<br />
    // инициализируем статус<br />
    prgrbrStatus.Max      := FLinkReport.RowCount;<br />
    prgrbrStatus.Position := 0;<br />
    pnlStatus.Visible     := TRUE;<br />
    pnlStatus.Refresh;<br />
    // добавлено в конце имени файла расширение &#8216;.XLS&#8217;?<br />
    if Length(AFileName) &lt; 5 then<br />
      // добавляем<br />
      AFileName := AFileName + &#8216;.xls&#8217;<br />
    else if AnsiCompareText(Copy(AFileName, Length(AFileName) &#8212; 3, 4), &#8216;.xls&#8217;) &lt;&gt; 0 then<br />
      // добавляем<br />
      AFileName := AFileName + &#8216;.xls&#8217;;<br />
    // файл уже существует?<br />
    if FileExists(AFileName) then<br />
      // спросим<br />
      if Application.MessageBox(<br />
           PChar(&#8216;Файл &#171;&#8216; + AFileName + &#8216;&#187; уже существует. Перезаписать?&#8217;),<br />
           &#8216;Внимание&#8217;,<br />
           MB_TASKMODAL + MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON2<br />
           ) &lt;&gt; IDYES then<br />
        // выходим<br />
        begin<br />
          // код ошибки<br />
          Result := UNIRPT_GENERATE_ABORT;<br />
         <br />
          // выходим<br />
          Exit;<br />
        end;  // if<br />
    // создаем объект<br />
    IntlXls := TXLSReadWriteII2.Create(nil);<br />
    // все делаем защищаясь<br />
    try<br />
      // название книги<br />
      IntlXls.Sheets[0].Name :=FLinkReport.Caption;<br />
      // добавляем необходимое количество строк и колонок<br />
      IntlXls.Sheets[0].Rows.AddIfNone(0, FLinkReport.Cells.RowCount + 1);<br />
      IntlXls.Sheets[0].Columns.AddIfNone(0, FLinkReport.Cells.ColCount + 1);<br />
      // добавляем и заносим ширины ячеек<br />
      for IntlCol := 0 to FLinkReport.Cells.ColCount &#8212; 1 do<br />
        IntlXls.Sheets[0].Columns[IntlCol].PixelWidth := FLinkReport.ColWidths[IntlCol];<br />
      // заносим высоты строк <br />
      for IntlRow := 0 to FLinkReport.Cells.RowCount &#8212; 1 do<br />
        IntlXls.Sheets[0].Rows[IntlRow].Height := FLinkReport.RowHeights[IntlRow] * 14;<br />
      // проходим по всем строкам<br />
      for IntlRow := 0 to FLinkReport.Cells.RowCount &#8212; 1 do<br />
        begin<br />
          // проходим по всем колонкам<br />
          for IntlCol := 0 to FLinkReport.Cells.ColCount &#8212; 1 do<br />
            begin<br />
              // определяем главную ячейку<br />
              IntlMainCol := IntlCol + FLinkReport.Cells[IntlCol, IntlRow].Range.Left;<br />
              IntlMainRow := IntlRow + FLinkReport.Cells[IntlCol, IntlRow].Range.Top;<br />
              // заносим оформление<br />
              with FLinkReport.Cells[IntlMainCol, IntlMainRow] do<br />
                begin<br />
                  // главная ячейка?<br />
                  if (IntlMainCol = IntlCol) and (IntlMainRow = IntlRow) then<br />
                    // да, заносим текст и его оформление<br />
                    begin<br />
                      // значение<br />
                      try<br />
                        // если значение &#8212; число то заносим его как число<br />
                        IntlXls.Sheets [0]. AsFloat [IntlCol, IntlRow] := StrToFloat (Value);<br />
                      except<br />
                        // иначе заносим его как строку<br />
                        IntlXls.Sheets [0]. AsString [IntlCol, IntlRow] := Value;<br />
                      end;</p>
<p>                      // выравнивание по горизонтали<br />
                      case HorizAlign of<br />
                        haLeft:<br />
                          // выравнивание слева<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].HorizAlignment := chaLeft;<br />
                        haCenter:<br />
                          // выравнивание по центру<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].HorizAlignment := chaCenter;<br />
                        haRight:<br />
                          // выравнивание справа<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].HorizAlignment := chaRight;<br />
                      end;  // case<br />
                      // выравнивание по вертикали<br />
                      case VertAlign of<br />
                        vaTop:<br />
                          // выравнивание сверху<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].VertAlignment := cvaTop;<br />
                        vaCenter:<br />
                          // выравнивание в центре<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].VertAlignment := cvaCenter;<br />
                        vaBottom:<br />
                          // выравнивание снизу<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].VertAlignment := cvaBottom;<br />
                      end;  // case<br />
                      // шрифт<br />
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FontName    := Font.Name;<br />
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FontSize    := Font.Size;<br />
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FontCharset := Font.Charset;<br />
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FontStyle   := [];<br />
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FontColor   := TColorToClosestXColor(Font.Color);<br />
                      IntlXls.Sheets[0].Cell[IntlCol, IntlRow].Rotation    := Font. Angle;<br />
                      // есть жирное начертание?<br />
                      if Font.IsBold then<br />
                        // есть<br />
                        with IntlXls.Sheets[0].Cell[IntlCol, IntlRow] do<br />
                          FontStyle := FontStyle + [xfsBold];<br />
                      // есть наклонное начертание?<br />
                      if Font.IsItalic then<br />
                        // есть<br />
                        with IntlXls.Sheets[0].Cell[IntlCol, IntlRow] do<br />
                          FontStyle := FontStyle + [xfsItalic];<br />
                      // цвет фона<br />
                      if Color &lt;&gt; clWindow then<br />
                        // цвет задан<br />
                        IntlXls.Sheets[0].Cell[IntlCol, IntlRow].FillPatternForeColor :=<br />
                          TColorToClosestXColor(Color);<br />
                    end  // if<br />
                  else<br />
                    // просто активизируем ячейку (иначе ниже невозможно добавить бордюры)<br />
                    IntlXls.Sheets[0].AsString[IntlCol, IntlRow] := &#187;;<br />
                   <br />
                  // бордюр слева есть?<br />
                  with Borders.Left do<br />
                    if LineHeight &gt; 0 then<br />
                      // настраиваем<br />
                      begin<br />
                        // цвет<br />
                        IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderLeftColor :=<br />
                          TColorToClosestXColor(Color);<br />
                        // толщина<br />
                        if LineHeight = 1 then<br />
                          // тонка<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderLeftStyle := cbsThin<br />
                        else if LineHeight in [1, 2] then<br />
                          // средняя толщина<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderLeftStyle := cbsMedium<br />
                        else<br />
                          // толстая<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderLeftStyle := cbsHair;<br />
                      end;  // if, with<br />
                  // бордюр сверху есть?<br />
                  with Borders.Top do<br />
                    if LineHeight &gt; 0 then<br />
                      // настраиваем<br />
                      begin<br />
                        // цвет<br />
                        IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderTopColor :=<br />
                          TColorToClosestXColor(Color);<br />
                        // толщина<br />
                        if LineHeight = 1 then<br />
                          // тонка<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderTopStyle := cbsThin<br />
                        else if LineHeight in [1, 2] then<br />
                          // средняя толщина<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderTopStyle := cbsMedium<br />
                        else<br />
                          // толстая<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderTopStyle := cbsHair;<br />
                      end;  // if, with<br />
                  // бордюр справа есть?<br />
                  with Borders.Right do<br />
                    if LineHeight &gt; 0 then<br />
                      // настраиваем<br />
                      begin<br />
                        // цвет<br />
                        IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderRightColor :=<br />
                          TColorToClosestXColor(Color);<br />
                        // толщина<br />
                        if LineHeight = 1 then<br />
                          // тонка<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderRightStyle := cbsThin<br />
                        else if LineHeight in [1, 2] then<br />
                          // средняя толщина<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderRightStyle := cbsMedium<br />
                        else<br />
                          // толстая<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderRightStyle := cbsHair;<br />
                      end;  // if, with<br />
                  // бордюр снизу есть?<br />
                  with Borders.Bottom do<br />
                    if LineHeight &gt; 0 then<br />
                      // настраиваем<br />
                      begin<br />
                        // цвет<br />
                        IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderBottomColor :=<br />
                          TColorToClosestXColor(Color);<br />
                        // толщина<br />
                        if LineHeight = 1 then<br />
                          // тонка<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderBottomStyle := cbsThin<br />
                        else if LineHeight in [1, 2] then<br />
                          // средняя толщина<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderBottomStyle := cbsMedium<br />
                        else<br />
                          // толстая<br />
                          IntlXls.Sheets[0].Cell[IntlCol, IntlRow].BorderBottomStyle := cbsHair;<br />
                      end;  // if, with<br />
                  // объединение нужно?<br />
                  if ((Range.Width &gt; 1) or (Range.Height &gt; 1)) and<br />
                     ((IntlMainCol = IntlCol) and (IntlMainRow = IntlRow)) then<br />
                    // объединяем<br />
                    IntlXls.Sheets[0].MergedCells.Add(<br />
                      IntlCol,<br />
                      IntlRow,<br />
                      IntlCol + Range.Width &#8212; 1,<br />
                      IntlRow + Range.Height &#8212; 1<br />
                      );<br />
                  // пользователь нажал кнопку прерывания экспорта?<br />
                  if btnCancel.Tag = 2 then<br />
                    // да, выходим<br />
                    Break;<br />
                end;  // with<br />
            end;  // for<br />
          // обновляем статус<br />
          prgrbrStatus.Position := prgrbrStatus.Position + 1;<br />
          Application.ProcessMessages;<br />
          // пользователь нажал кнопку прерывания экспорта?<br />
          if btnCancel.Tag = 2 then<br />
            // да, выходим<br />
            Break;<br />
        end;  // for<br />
      // пользователь нажал кнопку прерывания экспорта?<br />
      if btnCancel.Tag &lt;&gt; 2 then<br />
        // нет<br />
        begin<br />
          // на левый верхний угол<br />
          IntlXls.Sheet[0].TopRow              := 0;<br />
          IntlXls.Sheet[0].LeftCol             := 0;<br />
          IntlXls.Sheet[0].Selection.ActiveRow := 0;<br />
          IntlXls.Sheet[0].Selection.ActiveCol := 0;<br />
         <br />
          // статус<br />
          prgrbrStatus.Position := prgrbrStatus.Max;<br />
          Application.ProcessMessages;<br />
          // записываем в файл<br />
          IntlXls.FileName := AFileName;<br />
          IntlXls.Write;<br />
          // все успешно<br />
          Result := UNIRPT_OK;<br />
         <br />
        end  // if<br />
      else<br />
        // да<br />
        Result := UNIRPT_GENERATE_ABORT; <br />
       <br />
    finally<br />
      // освобождаем память<br />
      IntlXls.Free;<br />
     <br />
    end;  // try..finally<br />
  end;  // function ExportToExcelXls</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Vlad</title>
		<link>http://www.webdelphi.ru/2009/08/rabota-s-excel-v-delphi-osnovy-osnov/comment-page-1/#comment-8832</link>
		<dc:creator>Vlad</dc:creator>
		<pubDate>Wed, 21 Dec 2011 15:29:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.webdelphi.ru/?p=263#comment-8832</guid>
		<description>GS, было б неплохо взглянуть на такой пример. Кстати, для ускорения производительности я использую вариантный массив. Считываем за 1 раз весь лист в массив и уже потом в памяти вытаскиваем необходимые данные. Скорость возрастает в разы, а то и в десятки раз. А представленный пример - это действительно &lt;strong&gt;пример &lt;/strong&gt;, который рассчитывался на абсолютно неподготовленного читателя=)</description>
		<content:encoded><![CDATA[<p>GS, было б неплохо взглянуть на такой пример. Кстати, для ускорения производительности я использую вариантный массив. Считываем за 1 раз весь лист в массив и уже потом в памяти вытаскиваем необходимые данные. Скорость возрастает в разы, а то и в десятки раз. А представленный пример &#8212; это действительно <strong>пример </strong>, который рассчитывался на абсолютно неподготовленного читателя=)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: GS</title>
		<link>http://www.webdelphi.ru/2009/08/rabota-s-excel-v-delphi-osnovy-osnov/comment-page-1/#comment-8831</link>
		<dc:creator>GS</dc:creator>
		<pubDate>Wed, 21 Dec 2011 15:14:11 +0000</pubDate>
		<guid isPermaLink="false">http://www.webdelphi.ru/?p=263#comment-8831</guid>
		<description>Предлагаемый вариант конечно работоспособен, но у него есть важные недостатки:
- низкая производительность (попробуйте создать таблицу например размером 100 на 10000 ячеек со сложным форматированием)
- высокие требования к необходимой оперативной памяти (опять же см. пример с размером таблицы) 
- необходим установленный Excel (нет экселя, нет итогового файла. актуально, если подготовка отчетов делается на выделенном сервере, где лимитирован список установленного софта)

Лично я использую XLSReadWrite - вышеуказанных недостатков нет (таблица, указанную выше, у меня генерится за 0.4 секунды). Будет интересно - могу выложить реальный код примера</description>
		<content:encoded><![CDATA[<p>Предлагаемый вариант конечно работоспособен, но у него есть важные недостатки:<br />
- низкая производительность (попробуйте создать таблицу например размером 100 на 10000 ячеек со сложным форматированием)<br />
- высокие требования к необходимой оперативной памяти (опять же см. пример с размером таблицы) <br />
- необходим установленный Excel (нет экселя, нет итогового файла. актуально, если подготовка отчетов делается на выделенном сервере, где лимитирован список установленного софта)</p>
<p>Лично я использую XLSReadWrite &#8212; вышеуказанных недостатков нет (таблица, указанную выше, у меня генерится за 0.4 секунды). Будет интересно &#8212; могу выложить реальный код примера</p>
]]></content:encoded>
	</item>
</channel>
</rss>

