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. |
5
3
голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
A7rexcel это компонент формирования отчетов в Excel для Delphi 7 — Delphi XE2 (Embarcadero RAD Studio XE2). Компонент полностью бесплатен и свободен для использования где угодно и как угодно, единственная просьба — ссылка на этот сайт при упоминании этого компонента на просторах интернета.
Зачастую отчетные системы предназначены для выдачи результата сразу на печать с предпросмотром, и возможность сохранения в Excel это лишь опция, иногда работающая так, что сохраненный файл выходит не очень похожим на оригинал, и представляет собой нагромождение объединенных ячеек, а иногда еще и с неправильным форматом данных. Для того чтобы избежать этих неприятностей, можно использовать отчетную систему, которая будет выводить информацию напрямую в Excel.
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 формат их вырезает.