Delphi компоненты для работы с excel

Read, Write excel 2002/2003 XML (SpreadsheetML / XML Spreadsheet) library.

// Creating new workbook
var workBook: TZWorkBook;
...
workBook := TZWorkBook.Create();
try
  workBook.Sheets.Add('My sheet');
  workBook.Sheets[0].ColCount := 10;
  workBook.Sheets[0].RowCount := 10;
  workBook.Sheets[0].CellRef['A', 0].AsString := 'Hello';
  workBook.Sheets[0].RangeRef['A', 0, 'B', 2].Merge();
  workBook.SaveToFile('file.xlsx');
finally
  workBook.Free();
end
// Editing exists workbook
var workBook: TZWorkBook;
...
workBook := TZWorkBook.Create();
try
  workBook.LoadFromFile('file.xlsx');
  workBook.Sheets[0].CellRef['A', 0].AsString := 'Hello';
  workBook.Sheets[0].CellRef['A', 0].FontStyle := [fsBold];
  workBook.SaveToFile('file.xlsx');
finally
  workBook.Free();
end

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
Как ни крути, а время DOS и килобайтов оперативной памяти прошло. Вряд ли кто-то всерьез сейчас задумывается над тем куда это с винчестера пропал мегабайт? Да и использование в своих приложениях функциональности программ, которых ты не писал, но которые выполняют что-то лучше — это всё-таки больший прогресс, нежели корпеть год-два над программой, а потом узнать, что время-то прошло.

Введение

Итак, цель сегодняшней статьи — поделиться с Вами опытом работы с Microsoft Excel в приложениях, написанных на Delphi.
Вспомнился сейчас один случай. Когда я только начинал работать по своей специальности, пригласили меня написать программу-расчётник для экологов нашего нефтезавода. В принципе ничего серьёзного — программа считает выброс от нагревательной печи и выдает табличку результатов, которую необходимо распечатать и уложить в толстую папку с отчётами. Естественно, что в области разработки подобных приложения я далеко не пионер, поэтому дали взглянуть на аналог будущей программы, который работал ещё под DOS и печатались отчёты на дико скрипящем матричном принтере с 12-ю иголками. Ну посмотрел, элементарная таблица, расчёт немного запутан, но жить можно — начал по-тихоньку писать. И попалась мне тогда на глаза статейка про работу с Excel в Delphi. Вот я и решил попробовать выдавать отчёт не только на форму приложения, а ещё и скидывать весь ход расчёта с формулами и прочим делом в Excel…Надо сказать более сильно детской радости начальника отдела я не видел до сих пор :). Люди, всю жизнь проработавшие в DOS увидели как тот же самый расчёт может выглядеть в современных условиях. Вот теперь при определении технических заданий на каждую новую программу, обязательно присутствует пункт, гласящий, что программа должна передавать данные либо в MS Word либо в MS Excel.Соответственно и цена на разработку возрастает, иногда значительно.

Отсюда можно сделать простой и однозначный вывод — заказчики готовы пожертвовать лишними деньгами только для того, чтобы всё в программе было красиво. Excel может дать вашему приложению ту самую красоту и удобство.

Ну, а для того, чтобы каждый раз не утруждать себя выполнением однотипных операций, я разработал небольшой модуль для работы с Excel. Этот же модуль я в настоящее время дорабатываю под ещё одну задачу, но об этом после. Сегодня основы основ работы с Excel в Delphi.

Создаем новый модуль (unit) и подключаем в uses следующие модули:

uses ComObj, ActiveX, Variants, Windows, Messages, SysUtils, Classes;

теперь объявляем глобальную переменную:

Одну константу (для удобства):

const ExcelApp = 'Excel.Application';

И пишем простенькую функцию:

function CheckExcelInstall:boolean;
var
  ClassID: TCLSID;
  Rez : HRESULT;
begin
// Ищем CLSID OLE-объекта
  Rez := CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID);
  if Rez = S_OK then  // Объект найден
    Result := true
  else
    Result := false;
end;

Или ещё короче:

function CheckExcelInstall: boolean;
var
  ClassID: TCLSID;
begin
  Result:=CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID) = S_OK;
end;

Если функция CLSIDFromProgID находит CLSID OLE-объекта, то, соответственно — Excel установлен.

Но проверка на наличие установленного Excel — это только часть необходимых операций перед началом работы. Другой немаловажной проверкой является проверка на наличие уже запущенного экземпляра Excel. Если этого не делать, то может случиться такая нехорошая ситуация, когда в системе будет зарегистрировано …дцать процессов Excel и все оперативная память волшебным образом утекает «в трубу» — за такое могут и по ушам надавать. Но мы-то свои уши бережем. Пишем вторую функцию проверки.

2. Определяем запущен ли Excel

function CheckExcelRun: boolean;
begin
  try
    MyExcel:=GetActiveOleObject(ExcelApp);
    Result:=True;
  except
    Result:=false;
  end;
end;

Думаю тут лишних объяснений не потребуется? Всё предельно просто — если есть активный процесс Excel, то мы просто получаем на него ссылку и можем использовать Excel для своих корыстных целей. Главное — не забыть проверить — может кто-то этот самый Excel забыл закрыть, но это другой момент. Будем считать, что Excel в нашем полном распоряжении.

3. Как запустить Excel?

Одно дело, когда мы получаем в распоряжение уже запущенный Excel, другое — когда Excel требуется запустить из Delphi. Напишем функцию запуска Excel:

function RunExcel(DisableAlerts:boolean=true; Visible: boolean=false): boolean;
begin
  try
{проверяем установлен ли Excel}
    if CheckExcelInstall then
      begin
        MyExcel:=CreateOleObject(ExcelApp);
//показывать/не показывать системные сообщения Excel (лучше не показывать)
        MyExcel.Application.EnableEvents:=DisableAlerts;
        MyExcel.Visible:=Visible;
        Result:=true;
      end
    else
      begin
        MessageBox(0,'Приложение MS Excel не установлено на этом компьютере','Ошибка',MB_OK+MB_ICONERROR);
        Result:=false;
      end;
  except
    Result:=false;
  end;
end;

Здесь мы в начале проверяем, установлен ли Excel в принципе и, если он все же установлен, запускам. При этом мы можем сразу показать окно Excel пользователю — для этого необходимо выставить параметр Visible в значение True.

Также рекомендую всегда отключать системные сообщения Excel, иначе, когда программа начнет говорить голосом Excel — пользователь может занервничать.

Переходим к следующему этапу работы — созданию рабочей книги.

4. Создаем пустую рабочую книгу Excel

Для создания пустой рабочей книги я обычно использую вот такую функцию:

function AddWorkBook(AutoRun:boolean=true):boolean;
begin
  if CheckExcelRun then
    begin
      MyExcel.WorkBooks.Add;
      Result:=true;
    end
  else
   if AutoRun then
     begin
       RunExcel;
       MyExcel.WorkBooks.Add;
       Result:=true;
     end
   else
     Result:=false;
end;

Второй вариант (более лаконичный):

function AddWorkBook(AutoRun: boolean = true): boolean;
begin
  Result := CheckExcelRun;
  if (not Result) and (AutoRun) then
  begin
    RunExcel;
    Result := CheckExcelRun;
  end;
  if Result then
    MyExcel.WorkBooks.Add;
end;

То есть сразу проверяю запущен ли Excel и, если он не запущен, то либо запускаю и добавляю книгу, либо просто выхожу — всё зависит от ситуации.

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

function GetAllWorkBooks:TStringList;
var i:integer;
begin
  try
    Result:=TStringList.Create;
    for i:=1 to MyExcel.WorkBooks.Count do
      Result.Add(MyExcel.WorkBooks.Item[i].FullName)
  except
    MessageBox(0,'Ошибка перечисления открытых книг','Ошибка',MB_OK+MB_ICONERROR);
  end;
end;

Функция возвращает список TStringList всех рабочих книг Excel открытых в данный момент. Обратите внимание, что в отличие от Delphi Excel присваивает первой книге индекс 1, а не 0 как это обычно делается в Delphi при работе, например, с теми же индексами в ComboBox’ах.

Ну, и наконец, после того, как поработали с книгами — их требуется закрыть. Точнее сохранить, а потом уж закрыть.

5. Сохраняем рабочую книгу и закрываем Excel

Для того, чтобы сохранить рабочую книгу, я использовал такую функцию:

function SaveWorkBook(FileName:TFileName; WBIndex:integer):boolean;
begin
  try
    MyExcel.WorkBooks.Item[WBIndex].SaveAs(FileName);
    if MyExcel.WorkBooks.Item[WBIndex].Saved then
      Result:=true
    else
      Result:=false;
  except
    Result:=false;
  end;
end;

Если у Вас открыто 10 книг — просто вызываете функцию 10 раз, меняя значение параметра WBIndex и имени файла и дело в шляпе.

А закрывается Excel вот так:

function StopExcel:boolean;
begin
  try
    if MyExcel.Visible then MyExcel.Visible:=false;
    MyExcel.Quit;
    MyExcel:=Unassigned;
    Result:=True;
  except
    Result:=false;
  end;
end;

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

Книжная полка

Название:Разработка приложений Microsoft Office 2007 в Delphi

Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.

купить книгу delphi на ЛитРес

5
3
голоса

Рейтинг статьи

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Пример размещения Delphi компонента

A7rexcel это компонент формирования отчетов в Excel для Delphi 7Delphi XE2 (Embarcadero RAD Studio XE2). Компонент полностью бесплатен и свободен для использования где угодно и как угодно, единственная просьба — ссылка на этот сайт при упоминании этого компонента на просторах интернета.

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

Результат работы Delphi компонентаA7rexcel  позволяет выводить информацию в Excel используя в качестве шаблона xls-файл, благодаря чему становится просто настроить внешний вид получаемого документа, ориентацию листа, поля, нумерацию, и все остальное что можно настраивать в экселевском документе.

Предлагаемый компонент настолько прост, что в его внутренностях сможет разобраться даже начинающий программист, если потребуется расширение функционала. Так же он прекрасно подходит для тех, кто просто хочет разобраться как работать из Delphi-приложения с Microsoft Excel.

Исходные коды компонента на hithub — github.com/a7in/a7rexcel

Скачать компонент и демо-проект — a7rexcel.zip

Пример простейшего отчета:

 Компонент работает со всеми версиями офиса — 2003,2007,2010,2013.

Now write codes using above variables on a Button click or other appropriate event.

1. Create and connect with an Excel Application…

    myxlApp := TExcelApplication.Create(Nil);

    myxlApp.Connect;

    myxlApp.Visible[LCID] := True; // will show newly connected Excel application // most of case not required //

2. Close and Free the Excel application….

    myxlApp.Disconnect;

    myxlApp.Quit;

    FreeAndNil(myxlApp);

3. Add a Workbook

    myxlApp.Workbooks.Add(EmptyParam, LCID); //it will also add a default sheet to workbok//

    myxlBook := TExcelWorkbook.Create(myxlApp);

    myxlBook.ConnectTo(myxlApp.ActiveWorkbook);

4. Disconnect Workbook before close

    myxlBook.Close(True,’C:jitendraExcelTest1.xlsx’); //Saves the changes to mentioned file//

    myxlBook.Disconnect;

    FreeAndNil(myxlBook);

5. Add new Worksheet

    myxlSheet11 := TExcelWorksheet.Create(myxlBook);

    myxlSheet11.ConnectTo(myxlBook.ActiveSheet as _worksheet); //connecting with the default worksheet//

    myxlSheet11.Name := ‘Class 11’;

6. Disconnect worksheet before close

    myxlSheet11.Disconnect;

    FreeAndNil(myxlSheet11);

7. Adding a new Worksheet to the Workbook

myxlBook.Worksheets.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam, LCID);

    myxlSheet12 := TExcelWorksheet.Create(myxlBook);

    myxlSheet12.ConnectTo(myxlBook.ActiveSheet as _worksheet);

    myxlSheet12.Name := ‘Class 12’;

8. Access Sheets by Index or Name

(myxlApp.Worksheets[0] as _Worksheet).Activate(LCID);

Or

(myxlApp.Worksheets[‘Sheet1’] as _Worksheet).Activate(LCID);

9. Assign values to Cell by using Cell or Range property

    myxlApp.Cells.Item[1,1] := ‘Value 1’; //with row, col number//

    myxlApp.Range[‘A3′,’A3’].Value := ‘value 2’; //with cell from, to names//

    myxlSheet11.Cells.Item[1,5] := ‘JITENDRA’; //with row, col number//

    myxlSheet11.Range[‘E3′,’E3’].Value := ‘7834911261’; //with cell from, to names//

10. Change font format of an Excel Range

    with myxlSheet11.Range[‘A1’, ‘B3’] do

    begin

      Font.Name := ‘Verdana’;

      Font.Size := 15;

      Font.Bold := True;

      Font.Strikethrough := True;

      Font.Color := clRed;

    end;

11. Change Background Color of cells

    with myxlSheet11.Range[‘A1’, ‘A1’].Interior.Color := clYellow;

myxlSheet11.Range[‘A5’, ‘D7’].Merge(False);// merge cells and fill color in merged cells//

myxlSheet11.Range[‘A5’, ‘D7’].Interior.Color := clRed;

12. Merge Cells in a range

    myxlSheet11.Range[‘A5’, ‘D7’].Merge(False); //False by default if True it would merge cells row by row//

    myxlSheet11.Range[‘A5’, ‘D7’].Value := ‘Merged data’;

13. Change Column width and Row height

    myxlSheet11.Range[‘B5’, ‘B5’].ColumnWidth := 5; //single column B//

    myxlSheet11.Range[‘J5’, ‘L8’].ColumnWidth := 15; //multiple column J,K,L//

    myxlSheet11.Range[‘B5’, ‘B5’].RowHeight := 50; //single row 5//

    myxlSheet11.Range[‘J10’, ‘J15’].RowHeight := 50; //multiple row 10-15//

14. Open the workbook that already exists: 

myxlApp.Workbooks.Open ( ‘C:jitendraExcelTest1.xlsx’

EmptyParam , EmptyParam , EmptyParam , EmptyParam ,

EmptyParam , EmptyParam , EmptyParam , EmptyParam ,

EmptyParam , EmptyParam , EmptyParam , EmptyParam , 0 );

15. Copy and Paste Data from one cell to another in same sheet…

a. 

myxlSheet11.UsedRange[LCID].Copy(myxlSheet11.Range[‘J10’, ‘J10’]);

myxlSheet11.Range[‘A5’, ‘D7’].Copy(myxlSheet11.Range[‘J10’, ‘J10’]);

b. 

       myxlSheet11.UsedRange[LCID].Copy(EmptyParam);

       myxlSheet11.Range[‘J10’, ‘J10’].PasteSpecial(xlPasteAll,                xlPasteSpecialOperationNone, EmptyParam, EmptyParam);

myxlSheet11.Range[‘A5’, ‘D7’].Copy(EmptyParam);

    myxlSheet11.Range[‘J10’, ‘J10’].PasteSpecial(xlPasteAll, xlPasteSpecialOperationNone, EmptyParam, EmptyParam);

16. Copy and Paste Data from one Sheet to another sheet.

a. 

myxlSheet11.UsedRange[LCID].Copy(myxlSheet12.Range[‘J10’, ‘J10’]);

myxlSheet11.Range[‘A5’, ‘D7’].Copy(myxlSheet12.Range[‘J10’, ‘J10’]);

b. 

    myxlSheet11.UsedRange[LCID].Copy(EmptyParam);

    myxlSheet12.Range[‘J10’, ‘J10’].PasteSpecial(xlPasteAll, xlPasteSpecialOperationNone,EmptyParam, EmptyParam);

myxlSheet11.Range[‘A5’, ‘D7’].Copy(EmptyParam);

    myxlSheet12.Range[‘J10’, ‘J10’].PasteSpecial(xlPasteAll, xlPasteSpecialOperationNone,EmptyParam, EmptyParam);

17. Insert new columns before b1

myxlSheet11.Range[‘b1’, ‘b1’].Columns.Insert(xlShiftToRight); // we can use xlShiftToLeft//

18. Insert new rows above b2

myxlSheet11.Range[‘b2’, ‘b2’].Rows.Insert(xlShiftDown); // we can use xlShiftUp//

19. Clear a Selected Range Content or Format

    myxlSheet11.Range[‘b3’, ‘b10’].ClearContents;

    myxlSheet11.Range[‘b3’, ‘b10’].ClearFormats;

20.Save, Save as a Sheet / Workbook

  myxlSheet11.SaveAs(‘Filename’);

    myxlBook.Save;

21. Print Preview / Print of a Sheet / Workbook

    myxlSheet11.PrintPreview;

    myxlSheet11.PrintOut;

    myxlBook.PrintPreview;

    myxlBook.PrintOut;

22. Set Sheet PageSetup

myxlSheet11.PageSetup.

A. header: 

myxlSheet11.PageSetup.CenterHeader := » The report shows » ;

B. footer: 

myxlSheet11.PageSetup.CenterFooter := » The & P » ;

The C. header into the top margin 2cm: 

myxlSheet11.PageSetup.HeaderMargin := 2 / 0.035 ;

D. footer bottom margin 3cm: 

myxlSheet11.PageSetup.HeaderMargin := 3 / 0.035 ;

E. top margin 2cm: 

myxlSheet11.PageSetup.TopMargin := 2 / 0.035 ;

The bottom edge of the f. from the 2cm: 

myxlSheet11.PageSetup.BottomMargin := 2 / 0.035 ;

G. left 2cm: 

myxlSheet11.PageSetup.LeftMargin := 2 / 0.035 ;

On the right side of the H. from the 2cm: 

myxlSheet11.PageSetup.RightMargin := 2 / 0.035 ;

I. pages horizontally: 

myxlSheet11.PageSetup.CenterHorizontally := 2 / 0.035 ;

The J. page vertically: 

myxlSheet11.PageSetup.CenterVertically := 2 / 0.035 ;

K. print cell line: 

myxlSheet11.PageSetup.PrintGridLines := True ;

23. Auto Fill of Range. Fills value 1-10 in p1:p10

    myxlSheet11.Range[‘p1’, ‘p1’].Value := 1;

    myxlSheet11.Range[‘p2’, ‘p2’].Value := 2;

    myxlSheet11.Range[‘p1’, ‘p1’].AutoFill(myxlSheet11.Range[‘p1’, ‘p10’], xlFillSeries);

Other fill options

  xlFillCopy 

  xlFillDays 

  xlFillDefault 

  xlFillFormats 

  xlFillMonths 

  xlFillSeries 

  xlFillValues 

  xlFillWeekdays 

  xlFillYears 

  xlGrowthTrend 

  xlLinearTrend 

24. Change Border style of cells in a range

    myxlSheet11.Range[‘p3’, ‘p4’].Borders.Color := clRed;

    myxlSheet11.Range[‘p3’, ‘p4’].Borders.LineStyle := xlDouble;

    myxlSheet11.Range[‘p3’, ‘p4’].Borders.Item[xlEdgeLeft].Color := clBlue;

    myxlSheet11.Range[‘p3’, ‘p4’].Borders.Item[xlEdgeRight].Color := clBlue;

    Other line styles.

xlContinuous 

xlDash 

xlDashDot 

xlDashDotDot 

xlDot 

xlDouble 

xlSlantDashDot 

xlLineStyleNone

25. Fill pattern style of cells in a range

    myxlSheet11.Range[‘p3’, ‘p4’].Interior.Pattern := xlPatternCrissCross;

    myxlSheet11.Range[‘p3’, ‘p4’].Interior.PatternColor := clBlue;

      Other pattern styles

xlPatternAutomatic

xlPatternChecker 

xlPatternCrissCross 

xlPatternDown 

xlPatternGray16 

xlPatternGray25

xlPatternGray50

xlPatternGray75 

xlPatternGray8 

xlPatternGrid

xlPatternHorizontal 

xlPatternLightDown 

xlPatternLightHorizontal 

xlPatternLightUp 

xlPatternLightVertical 

xlPatternNone 

xlPatternSemiGray75 

xlPatternSolid 

xlPatternUp 

xlPatternVertical

26. Add calculation function SUM/AVG/MAX/COUNT etc..

    myxlSheet11.Range[‘k1’, ‘k1’].Formula := ‘=Sum(p3:p8)’;

    myxlSheet11.Range[‘k3’, ‘k3’].Formula := ‘=Avg(p3:p8)’;

    myxlSheet11.Range[‘k5’, ‘k5’].Formula := ‘=Max(p3:p8)’;

    myxlSheet11.Range[‘k7’, ‘k7’].Formula := ‘=Count(p3:p8)’;

Содержание

TXLSFile

  • TXLSFile не требует для работы установленного Microsoft Excel

  • xlsx не поддерживает

  • картинки есть

  • индексы листов и ячеек с нуля

дока

C:CompTXLSFileHelp

последняя версия с существенными изменениями от 06-Oct-2008

Примеры

создание

uses XLSFile
var
  xf: TXLSFile;
  xf:= TXLSFile.Create;
  try
    { Sheets' and cells' indices are 0-based }
    with xf.Workbook.Sheets[0] do begin
      for I:= 0 to 10000 - 1 do  
        Cells[I, 0].Value:= 'Demo' + IntToStr(I);
    end;
    xf.SaveAs('out.xls');
  finally
    xf.Destroy;
  end;

Цвет

uses XLSFile, XLSFormat;
var
  xf: TXLSFile;
  Row, Col: integer;
  FG, BG: TXLColorIndex;
  xf:= TXLSFile.Create;
  try
    with xf.Workbook.Sheets[0] do begin
      for FG:= Low(TXLColorIndex) to High(TXLColorIndex) do begin
        Row:= ord(FG) - 1;
        for BG:= Low(TXLColorIndex) to High(TXLColorIndex) do begin
            Col:= ord(BG) - 1; 
            Cells[Row, Col].Value:= 'Demo';
            { Set cell fill pattern and color }
            Cells[Row, Col].FillPattern := xlPatternSolid;
            Cells[Row, Col].FillPatternBGColorIndex := BG; 
            { Set font color }
            Cells[Row, Col].FontColorIndex := FG;
          end;
      end;
    end;
    xf.SaveAs('out.xls');
  finally
    xf.Destroy;   	    	    	   		 	 	  		 	      end;

Формулы

   xf:= TXLSFile.Create;
  try
    with xf.Workbook.Sheets[0] do begin 
      Cells[0, 0].Value:= 1;
      Cells[0, 1].Formula:= '100+A1';
      Cells[1, 1].Formula:= 'SUM(A1:A100)';
      Cells[2, 1].Formula:= 'A1+B1';
      Cells[3, 1].Formula:= 'ROW()';
      Cells[4, 1].Formula:= 'SIN(1+COS(2))';
      Cells[5, 1].Formula:= 'MAX(A1;A2;A3)';
      Cells[6, 1].Formula:= 'MAX(A1:A3)';
      Cells[7, 1].Formula:= 'LEN("text constant")';
      Cells[8, 1].Formula:= 'IF(LEN("text constant")=1;1;2)';
      Cells[9, 1].Formula:= 'IF(A1=A2;"yes";"no")';
      Cells[10, 1].Formula:= 'AND(a1;a2)';
      Cells[10, 1].Formula:= '(1 + 2) * 3';
    end;
 
    {cross-sheet formulas}
    xf.Workbook.Sheets[0].Name:= 'Test sheet 1';
    xf.Workbook.Sheets.Add('Test sheet 2');
    xf.Workbook.Sheets[1].Cells[0, 0].Formula:= '''Test sheet 1''!A1 + 1';
    xf.Workbook.Sheets[1].Cells[1, 0].Formula:= 'SUM(Test sheet 1!A1:A1) + Test sheet 1!A2';
 
    xf.SaveAs('out.xls');
  finally
    xf.Destroy;   	    	    	   		 	 	  		 	    
  end;

картинки

xf:= TXLSFile.Create;
  try
    with xf.Workbook do begin
      { Add image }
      Sheets[0].Images.Add('1.jpg', 4, 4);
      { Fit image into a cell }
      Sheets[0].Columns[0].WidthPx:= 200;
      Sheets[0].Rows[0].HeightPx:= 200;
      Sheets[0].Images.AddStretch('1.jpg', 0, 0, 0, 0);
    end;
    xf.SaveAs('out.xls');
  finally
    xf.Destroy;
  end;

Настройки окна

      WindowOptions.DisplayGrids:= False;
      WindowOptions.DisplayRowColHeaders:= False;
      WindowOptions.DisplayZero:= False;
 
      WindowOptions.PageBreakPreview:= True;

Чтение

var
  xf: TXLSFile;
  I: Integer;
  C: TCell;
  S: String;
begin
  xf:= TXLSFile.Create;
  try
    with xf.Workbook.Sheets[0] do begin
      Cells[0, 0].Value:= 123;
      Cells[1, 0].Value:= 'Text';
      Cells[2, 0].Value:= Now;
    end;
    xf.SaveAs('in.xls');
  finally
    xf.Destroy;
  end;
 
  xf:= TXLSFile.Create;
  try
    xf.OpenFile('in.xls');
    for I:= 0 to xf.Workbook.Sheets[0].Cells.Count - 1 do begin
      C:= xf.Workbook.Sheets[0].Cells.Item[I];
      S:= 'Row ' + IntToStr(C.Row) + ', Column ' + IntToStr(C.Col);
      if (C.Formula <> '') then
        S:= S + ', formula = ' + C.Formula;
      case VarType(C.Value) of
        varInteger, varSmallint, varByte, varDouble, varSingle:
          S:= S + ', number = ' + FloatToStr(C.Value);
        varString, varOleStr:
          S:= S + ', string = ' + C.Value;
        varDate: 
          S:= S + ', date = ' + FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz', C.Value);
      end;
      Memo1.Lines.Add(S);
    end;
    Memo1.Lines.Add('');
  finally
    xf.Destroy;
  end;

Экспорт

компонент-связка XLSExportDBGrid1: TXLSExportDBGrid — к нему привязываем DBGrid1 и компонент XLSExportFile1: TXLSExportFile (нет свойств, умеет экспортировать).

TXLSExportDBGrid имеет свойство не показывать заголовки колонок.

  XLSExportFile1.Workbook.Clear;
  XLSExportFile1.Workbook.Sheets.Add('Sheet1');
  XLSExportDBGrid1.ExportData(0, 0, 0);
  XLSExportFile1.SaveToFile('out.xls');

Есть еще XLSExportDataSource1: TXLSExportDataSource и XLSExportStringGrid1: TXLSExportStringGrid

Комментарии

  xf:= TXLSFile.Create;
  try
    xf.Workbook.Sheets[0].CellComments.Comment[0, 0].Assign
      ( 'Text text text'  // comment text
      , 'MyName'          // author
      , ''                // no rich formatting
      , True              // add author's name before text
      );
 
    xf.Workbook.Sheets[0].CellComments.Comment[1, 0].AssignWithSize
      ( 'Text demo text'             // comment text
      , 'MyName'                     // author
      , '1-4(size:20;color:ff0000);' // rich format 
      , 400                          // width
      , 100                          // height
      , True);                       // add author's name before text
 
    xf.SaveAs('out.xls');
  finally
    xf.Destroy;
  end;

RichFormat syntax

  RichFormat ::= RichFormatToken | RichFormat[;RichFormatToken]
  RichFormatToken ::= <PosStart>-<PosEnd>(
                    [style:{b}{i}{u};]
                    [color:<BGR-color>;]
                    [size:<Size>;]
                    [font:<Fontname>;])
  PosStart ::= Integer
  PosEnd ::= Integer
  BGR-color ::= Integer
  Size ::= Integer
  Fontname ::= String

style:{b}{i}{u}

bold (b), italic (i), underlined (u).

color:<BGR-color>

BGR-color is a hex number. The value FF0000 represents pure blue, 00FF00 is pure green, and 0000FF is pure red. 000000 is black and FFFFFF is white.

size:<Size>

Size is an integer number. It represents a font’s height.

font:<Fontname>

Fontname is a text value. It represents a font’s name.

var
  xf: TXLSFile;
begin
  xf:= TXLSFile.Create;
  try
    xf.Workbook.Sheets[0].Cells[0, 0].Value:= 'abcdef';
    xf.Workbook.Sheets[0].Cells[0, 0].RichFormat:= '3-4(style:bi; size:20;)';
 
    xf.SaveAs('out.xls');
  finally
    xf.Destroy;
  end;
end;

Иерархия классов

Классы, методы и свойства

TXLSFile
--------
Методы
  SaveAs(AFileName)
  SaveAsProtected(AFileName, APassword);
  OpenFile(AFileName);
  OpenProtectedFile(AFileName; APassword);
  Clear
 
Свойства
  Workbook: TWorkbook
  OnProgress: TProgressEvent
  CodePage: Integer
  ListSeparator: AnsiChar
  ReadEmptyCells: Boolean
  ReadRowFormats: Boolean
  ReadColumnFormats: Boolean
  ReadFormulas: Boolean
  RaiseErrorOnReadUnknownFormula: Boolean
  ReadDrawings: Boolean
 
Helper functions 
  function GetXLSFileVersion(const AFileName: WideString): Byte;
    xfVersionBIFFNONE - Not Excel 97-2003 file. 
    xfVersionBIFF8 - Excel 97-2003 file. 
 
  function GetXLSFileProtectionMethod(const AFileName: WideString): Integer;
 
TWorkbook
---------
Методы 
    function SheetByName(ASheetName): TSheet;
    Clear;
    Protect(APassword)
    UnProtect(APassword)
 
Свойства
    property Sheets: TSheets 
    property FormatStrings: TFormatStrings 
    property FontTable: TVirtualFontTable 
    property XFTable: TVirtualXFTable 
    property LinkTable: TXLSLinkTable 
    property Palette: TXLPalette
    property IsProtected: Boolean
 
 
TSheet
------
Методы 
 Freeze(const ARow: Word; AColumn: Byte);
 UnFreeze;
 GroupRows(const ARowFrom, ARowTo: Word);
 GroupColumns(const AColumnFrom, AColumnTo: Byte);
 UnGroupRows(const ARowFrom, ARowTo: Word);
 UnGroupColumns(const AColumnFrom, AColumnTo: Byte);
 SaveAsHTML(const AFileName: AnsiString);
 SaveRectAsHTML(const AFileName: AnsiString; const ARect: TRangeRect);
 SaveAsTXT(const AFileName: AnsiString; const AFileType: TTXTFileType);
 SaveRectAsTXT(const AFileName: AnsiString; const AFileType: TTXTFileType; const ARect: TRangeRect);
Свойства
  Cells: TCells
  CellValidations: TCellValidations
  CellComments: TCellComments
  Columns: TColumns
  Rows: TRows
  Ranges: TRanges
  Name: WideString
  Index: Integer
  PageSetup: TPageSetup
  PageBreaks: TCellCoords
  IsProtected: Boolean
  Selected: Boolean 
  Visible: Boolean 
  Images: TXLSImages - картинки
 
TCell
-----
    procedure Clear;
    property Col: Word 
    property Row: Word 
    property Formula: AnsiString 
    property Hyperlink: WideString 
    property HyperlinkType: TCellHyperlinkType 
    property RichFormat: AnsiString
    property Value: Variant 
    property ValueAsString: WideString 
 
TColumn 
-------
    procedure Clear;
    property Width: Double 
    property WidthPx: Integer 
    property VisibleWidth: Double 
    property VisibleWidthPx: Integer
 
TRow
----
    procedure AutoFit;
    procedure Clear;
    property Height: Double 
    property HeightPx: Integer 
    property VisibleHeight: Double 
    property VisibleHeightPx: Integer
 
TColumns
--------
  AutoFit
  procedure DeleteColumns(ALeftColumn, ARightColumn: Word);
  procedure InsertColumns(AColumnAfter: Word; ColumnCountToInsert: Word);
  procedure ClearColumns(ALeftColumn, ARightColumn: Word);
  procedure CopyColumns(ALeftColumn, ARightColumn: Word; ADestLeftColumn: Word);
  procedure MoveColumns(ALeftColumn, ARightColumn: Word; ADestLeftColumn: Word);
  property Column[ACol: Word]:TColumn read GetColumn; default;
 
TRows
-----
    procedure DeleteRows(ATopRow, ABottomRow: Word);
    procedure InsertRows(ARowAfter: Word; RowCountToInsert: Word);
    procedure ClearRows(ATopRow, ABottomRow: Word);
    procedure CopyRows(ATopRow, ABottomRow: Word; ADestTopRow: Word);
    procedure MoveRows(ATopRow, ABottomRow: Word; ADestTopRow: Word);
    property Row[ARow: Word]:TRow read GetRow; default;
 
TRange
------
    procedure MergeCells;
    procedure UnMergeCells;    
    procedure Clear;    
    procedure BordersOutline(AColorIndex: TXLColorIndex; AStyle: TXLBorderStyle);
    procedure BordersEdge(AColorIndex: TXLColorIndex;  AStyle: TXLBorderStyle; Edge: TCellBorderIndex);
    procedure BordersOutlineRGB(AColorRGB: Integer; AStyle: TXLBorderStyle);
    procedure BordersEdgeRGB(AColorRGB: Integer; AStyle: TXLBorderStyle; Edge: TCellBorderIndex);
 
    property BorderColorIndex[Index: TCellBorderIndex]: TXLColorIndex write SetBorderColorindex;
    property BorderColorRGB[Index: TCellBorderIndex]: Integer write SetBorderColorRGB;
    property BorderStyle[Index: TCellBorderIndex]: TXLBorderStyle write SetBorderStyle;
    property Empty: Boolean read GetEmpty;
    property FillPatternBGColorIndex: TXLColorIndex write SetFillPatternBGColorIndex;
    property FillPatternFGColorIndex: TXLColorIndex write SetFillPatternFGColorIndex;
    property FillPatternBGColorRGB: Integer write SetFillPatternBGColorRGB;
    property FillPatternFGColorRGB: Integer write SetFillPatternFGColorRGB;
    property FillPattern: TXLPattern write SetFillPattern;
    property FontBold: Boolean write SetFontBold;
    property FontItalic: Boolean write SetFontItalic;
    property FontUnderline: Boolean write SetFontUnderline;
    property FontStrikeOut: Boolean write SetFontStrikeOut;
    property FontUnderlineStyle: TXLFontUnderlineStyle write SetFontUnderlineStyle;
    property FontSSStyle: TXLFontSSStyle write SetFontSSStyle;
    property FontName: WideString write SetFontName;
    property FontColorIndex: TXLColorIndex write SetFontColorIndex;
    property FontColorRGB: Integer write SetFontColorRGB;
    property FontHeight: Word write SetFontHeight;
    property FormatStringIndex: Integer write SetFormatStringIndex;
    property HAlign: TCellHAlignment write SetHAlign;
    property VAlign: TCellVAlignment write SetVAlign;
    property Wrap: Boolean write SetWrap;
    property Rotation: TCellRotation write SetRotation;
    property Indent: Byte write SetIndent;
    property Merged: Boolean read FMerged;
    property Locked: Boolean write SetLocked;
    property Name: WideString read FName write SetName;
    property Formula: AnsiString write SetFormula;
    property Hyperlink: WideString write SetHyperlink;
    property HyperlinkType: TCellHyperlinkType write SetHyperlinkType;
    property Value: variant write SetValue;
    property Sheet: TSheet read FSheet;
 
TXLSImage
---------
    constructor Create(const AFileName: AnsiString;
      const ALeftColumn, ATopRow, ARightColumn, ABottomRow: Integer);
    procedure SaveAs(const AFileName: AnsiString; const AutoExtension: Boolean);
    property FileName: AnsiString read FFileName;
    property ImageData: TEasyStream read FImageData;
    property ImageType: TXLSImageType read GetImageType;
    property LeftColumn: Integer read FLeftColumn;
    property TopRow: Integer read FTopRow;
    property RightColumn: Integer read FRightColumn;
    property BottomRow: Integer read FBottomRow;
    property LeftColumnOffsetPx: Integer read FLeftColumnOffsetPx;
    property TopRowOffsetPx: Integer read FTopRowOffsetPx;
    property StretchToWidthPx: Integer read FStretchToWidthPx;
    property StretchToHeightPx: Integer read FStretchToHeightPx;

И так опробовал 3 библиотеки:
1. XLSReadWriteII 5.2,
TMS FlexCell,
zexmlss

Не много о каждой:
1. Начну с платной XLSReadWriteII 5.2 — обладает почти полным функционалом для работы с файлами xlsx и xls. Много различных классов и описаний, и прочего. На версии 5,2 нашел 1 косяк при попытке записать ячейку с данными в формате «{}» вместо фигурной скобки «}» выводит — «/» на более поздних версиях не могу сказать не тестировал. Сохраняет все стандартные форматы (xml,xls,xlsx). Есть возможность перевода в другие форматы Html и прочие. Подробнее на сайте у производителя.

2. TMS FlexCel — из всех 3 испытанных на данный момент больше всего понравилась. Не нашел косяков + работа с файлами формата xml, Xls, Xls.

3. zexmlss простенькая библиотека с исходным кодом, доступно описан класс. От остальных отстает тем что нет возможности работать с диаграммами и комментарием, Они хоть и описаны в классе, но сохраняются только в формате Xml, Xslx формат их вырезает.

Like this post? Please share to your friends:
  • Delphi компонент как excel
  • Delphi как узнать excel или нет
  • Delphi как удалить листы в excel
  • Delphi как сохранить программно excel
  • Delphi как создать таблицу в excel