Delphi dataset to excel

Содержание

  1. Печать из Delphi в Excel по шаблону
  2. Зачем это нужно?
  3. Что и как экспортировать?
  4. Готовые решения на основе шаблонов
  5. Do It Yourself
  6. Таблицы и поля в шаблонах
  7. Свойства и компоненты в шаблонах
  8. Реализация
  9. Dataset to excel delphi
  10. Dataset to excel delphi
  11. Что и как экспортировать?
  12. Готовые решения на основе шаблонов
  13. Do It Yourself
  14. Таблицы и поля в шаблонах
  15. Свойства и компоненты в шаблонах
  16. Реализация

Печать из Delphi в Excel по шаблону

Прилагается исходный код компонента ExcelView и процедуры экспорта и печати по шаблону в Excel для Delphi 2010/XE/XE2. Доступна полная версия с примерами использования.

Зачем это нужно?

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

Поэтому вполне закономерно, что Excel широко используется и для разработки различных печатных форм. Хотя по своим возможностям он уступает специализированным генераторам отчетов, уже практически для всех типовых документов можно найти готовые Excel-шаблоны, от коммерческого предложения до товарно-транспортной накладной по форме 1-Т (http://blanker.ru/doc/38)

Что и как экспортировать?

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

В шаблоне могут использоваться в качестве переменных:

  • все published свойства формы-владельца
  • все компоненты, принадлежащие форме-владельцу, и их published свойства
  • все наборы данных (наследники TDataSet) обрабатываются специальным образом, в шаблон подставляются значения их полей

Готовые решения на основе шаблонов

Компоненты для вывода в Excel довольно легко найти в интернете, например:

  • TMS Flexcel Studio (http://www.tmssoftware.com/site/flexcel.asp) — $125
  • ARExcelReport (http://www.vector-ski.com/reports/arexcelreport_index.htm) — бесплатный для некоммечерского использования, стоимость исходников — $125
  • Don Excel Report (http://www.don-soft.com.ar/DonExcelReport/products.php) — $75
  • AfalinaSoft XL Report (http://www.afalinasoft.com/download-xl-report.html) — «будет open source через месяц-два», — написано в 2003 году. Увы.
  • FlexCelReport (http://www.freewebs.com/flexcel/) — бесплатный, в исходниках. Для Delphi 5/6/7. Сайт в настоящее время недоступен. При пересборке пакетов под Delphi 2010-XE2 необходимо вносить серьезные изменения.

Do It Yourself

Библиотеки компонентов всем хороши (кроме стоимости, конечно), но даже наличие исходных текстов не всегда спасает от возможных неприятностей. Проблема в том, что кода становится слишком много. Например, один из лучших (на мой взгляд) — FlexCelReport — это 916 Кб в 174 исходных файлах. Переносить этот проект на современные версии Delphi становится проблематично.

В таких случаях остается вариант написания процедуры или компонента самостоятельно. В качестве стартовой точки для ознакомления можно рекомендовать http://www.webdelphi.ru/2009/08/rabota-s-excel-v-delphi-osnovy-osnov/, http://www.codenet.ru/progr/delphi/stat/export-to-excel.php и т.д.

Таблицы и поля в шаблонах

У всех компонентостроителей — свои правила записи переменных в шаблонах. В FlexCelReport — это именованные диапазоны с двумя подчеркиваниями «__MAIN__» и переменные в ячейках вида ##DataSetName##FieldName, в ARExcelReport — . и т.д.

Мы хотим еще проще. Только FieldName и ничего лишнего.

А где задается DataSet?

В первой колонке. Отведем всю колонку под служебную информацию, благо в Экселе их (колонок) и так более чем достаточно. При выводе будем эту колонку скрывать.

Еще одно допущение — если мы хотим вывести все записи из DataSet-а в виде таблицы, ставим перед его именем звездочку (*tblOrders). Без звездочки будут выводиться только значения полей текущей записи.

Свойства и компоненты в шаблонах

Для вывода в шаблоне published свойства текущей формы запишем в ячейке имя этого свойства в квадратных скобках: [Caption], [Tag]. Свойства компонентов формы записываются с именем компонента через точку: [Memo1.Lines]. Поддерживаются (пока) свойства следующих типов: Integer, Int64, String, Double, Boolean, TStrings.

Реализация

Весь код находится в файле ExcelView.pas (7 Кб). Компонент TExcelView имеет единственное published свойство TemplateFileName — это имя файла шаблона. Метод Show открывает Excel и запускает процесс экспорта.

Можно и не устанавливать компонент в палитру, а сразу выполнить процедуру

Обратите внимание на параметр Owner! Это тот компонент (форма, датамодуль), чьи свойства, компоненты, датасеты и будут экспортироваться в Excel.

Взаимодействие с Excel происходит через OLE:

Для вывода набора данных сначала формируется вариантный массив:

А потом уже вставляется в нужное место:

Для вывода свойств используется модуль Rtti:

Источник

Dataset to excel delphi

Доброго всем дня и с наступающим НГ.

Может кто еще на начал праздновать ответит на вопрос такого плана: переношу данные из ДатаСета в Эксель с помощью потоков, переноситься вроде, корявенько конечно, но доработаем, теперь нужно с помощью этих же потоков задать формат ячейки (размещение в ней текста по центру, с переносом на по словам и т.п.), ее цвет и контур. У мну не получется :((( Где можно почитать как это наколдовать.


Vlad ( 2003-12-31 11:52 ) [1]

Лист Excel — это COM объект. Вот и работай с ним как с COM-объектом и не мучайся.


Vick ( 2003-12-31 11:58 ) [2]

А мне нада через поток.


_T1000_ ( 2003-12-31 12:37 ) [3]

Привет. С наступающим НГ.
Вот как я делаю ета.

//Создаьот ОЛЕ обект
function DInitObjNew(pFileName: pChar): boolean; cdecl;
begin
try
ExcelApp := CreateOLEObject(«Excel.Application»);
except
raise Exception.Create(«Нету Excel»);
Result := False;
Exit;
end;
ExcelApp.Visible := True;
ExcelApp.WorkBooks.Add.SaveAs(string(pFileName));
Result := True;
end;

//Видим или нет
procedure BVisible(flag: Boolean); cdecl;
begin
ExcelApp.Visible := flag;
end;

procedure DSetColumWidth(i: Integer; WidthCol: Double); cdecl;
begin
ExcelApp.WorkBooks[1].ActiveSheet.Columns[i].ColumnWidth := WidthCol;
end;

procedure DSetFormatedString(I, J: LongInt; pVal: PChar; CellJustify, FontSize: Integer; FontStyle: TFontStyles; FontName: PChar); cdecl;
begin
ExcelApp.WorkBooks[1].ActiveSheet.Cells[I, J].Font.Name := String(FontName);
ExcelApp.WorkBooks[1].ActiveSheet.Cells[I, J].Font.Size := FontSize;
if (fsBold in FontStyle) then
ExcelApp.WorkBooks[1].ActiveSheet.Cells[I, J].Font.Bold := True;
if (fsItalic in FontStyle) then
ExcelApp.WorkBooks[1].ActiveSheet.Cells[I, J].Font.Italic := True;
if (fsUnderline in FontStyle) then
ExcelApp.WorkBooks[1].ActiveSheet.Cells[I, J].Font.Underline := True;
if (fsStrikeOut in FontStyle) then
ExcelApp.WorkBooks[1].ActiveSheet.Cells[I, J].Font.fsStrikeOut := True;

if CellJustify <> cjNoSetJustify then
case CellJustify of
cjLeft: ExcelApp.WorkBooks[1].ActiveSheet.Cells[I, J].HorizontalAlignment := xlHAlignLeft;
cjRight: ExcelApp.WorkBooks[1].ActiveSheet.Cells[I, J].HorizontalAlignment := xlHAlignRight;
cjCenter: ExcelApp.WorkBooks[1].ActiveSheet.Cells[I, J].HorizontalAlignment := xlHAlignCenter;
cjJustify: ExcelApp.WorkBooks[1].ActiveSheet.Cells[I, J].HorizontalAlignment := xlHAlignJustify;
end;

ExcelApp.WorkBooks[1].ActiveSheet.Cells[I, J] := string(pVal);
end;

procedure DSetBorders(I,J: PChar; LineStyleB, WeightB: Integer); cdecl;
var K1, K2:String;
begin
K1:=string(I);
K2:=string(J);
case LineStyleB of
0:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.LineStyle := xlLineStyleNone;
1:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.LineStyle := xlContinuous;
2:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.LineStyle := xlDash;
3:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.LineStyle := xlDashDot;
4:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.LineStyle := xlDashDotDot;
5:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.LineStyle := xlDot;
6:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.LineStyle := xlDouble;
7:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.LineStyle := xlSlantDashDot;
end;

case WeightB of
1:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.Weight := xlHairline;
2:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.Weight := xlThin;
3:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.Weight := xlThick;
4:ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Borders.Weight := xlMedium;
end;
end;

procedure DSetColorToRange(I,J:PChar;Color:TColor);cdecl;
var K1, K2:String;
begin
K1:=string(I);
K2:=string(J);
ExcelApp.WorkBooks[1].ActiveSheet.Range[K1,K2].Interior.Color:=Color;
end;

Надеюс смог памочь
Пример:

SetColumWidth(3,13.57);
SetFormatedString(4,4, PChar(«A1″),0 ,10,[fsBold],PChar,»Arial»));
SetColorToRange(PChar(«A1»), PChar(«A2»), clRed);
SetBorders(PChar(«A1»), PChar(«A2»),1,2);

Даполнителнъе фунцъи можеш написат сматря хелп Visual Basic Editor в Eksele


Vick ( 2003-12-31 12:41 ) [4]

ЛЮДИ. Вы читать умеете. В том что писать умеете я не сомневаюсь. Поток нужно организовать. Какае биты и что в них писать. Через ОЛЕ я тоже умею. 🙂

http://www.delphikingdom.com/helloworld/excelsm.htm
и все статьи со словом Excel


jack128 ( 2004-01-01 11:43 ) [6]


> ЛЮДИ. Вы читать умеете. В том что писать умеете я не
> сомневаюсь. Поток нужно организовать.

И в чем проблема? Копируй код в TExcelThread.Execute вот те и поток.


KSergey ( 2004-01-03 10:56 ) [7]

Автору: о каких потоках речь? Уточните. А то общественность, похоже,путается.
Может, Stream имеется в виду? А это вообще как?

Источник

Dataset to excel delphi

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

Поэтому вполне закономерно, что Excel широко используется и для разработки различных печатных форм. Хотя по своим возможностям он уступает специализированным генераторам отчетов, уже практически для всех типовых документов можно найти готовые Excel-шаблоны, от коммерческого предложения до товарно-транспортной накладной по форме 1-Т (http://blanker.ru/doc/38)

Что и как экспортировать?

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

В шаблоне могут использоваться в качестве переменных:

  • все published свойства формы-владельца
  • все компоненты, принадлежащие форме-владельцу, и их published свойства
  • все наборы данных (наследники TDataSet) обрабатываются специальным образом, в шаблон подставляются значения их полей

Готовые решения на основе шаблонов

Компоненты для вывода в Excel довольно легко найти в интернете, например:

  • TMS Flexcel Studio (http://www.tmssoftware.com/site/flexcel.asp) — $125
  • ARExcelReport (http://www.vector-ski.com/reports/arexcelreport_index.htm) — бесплатный для некоммечерского использования, стоимость исходников — $125
  • Don Excel Report (http://www.don-soft.com.ar/DonExcelReport/products.php) — $75
  • AfalinaSoft XL Report (http://www.afalinasoft.com/download-xl-report.html) — «будет open source через месяц-два», — написано в 2003 году. Увы.
  • FlexCelReport (http://www.freewebs.com/flexcel/) — бесплатный, в исходниках. Для Delphi 5/6/7. Сайт в настоящее время недоступен. При пересборке пакетов под Delphi 2010-XE2 необходимо вносить серьезные изменения.

Do It Yourself

Библиотеки компонентов всем хороши (кроме стоимости, конечно), но даже наличие исходных текстов не всегда спасает от возможных неприятностей. Проблема в том, что кода становится слишком много. Например, один из лучших (на мой взгляд) — FlexCelReport — это 916 Кб в 174 исходных файлах. Переносить этот проект на современные версии Delphi становится проблематично.

В таких случаях остается вариант написания процедуры или компонента самостоятельно. В качестве стартовой точки для ознакомления можно рекомендовать http://www.webdelphi.ru/2009/08/rabota-s-excel-v-delphi-osnovy-osnov/, http://www.codenet.ru/progr/delphi/stat/export-to-excel.php и т.д.

Таблицы и поля в шаблонах

У всех компонентостроителей — свои правила записи переменных в шаблонах. В FlexCelReport — это именованные диапазоны с двумя подчеркиваниями «__MAIN__» и переменные в ячейках вида ##DataSetName##FieldName, в ARExcelReport — . и т.д.

Мы хотим еще проще. Только FieldName и ничего лишнего.

А где задается DataSet?

В первой колонке. Отведем всю колонку под служебную информацию, благо в Экселе их (колонок) и так более чем достаточно. При выводе будем эту колонку скрывать.

Еще одно допущение — если мы хотим вывести все записи из DataSet-а в виде таблицы, ставим перед его именем звездочку (*tblOrders). Без звездочки будут выводиться только значения полей текущей записи.

Свойства и компоненты в шаблонах

Для вывода в шаблоне published свойства текущей формы запишем в ячейке имя этого свойства в квадратных скобках: [Caption], [Tag]. Свойства компонентов формы записываются с именем компонента через точку: [Memo1.Lines]. Поддерживаются (пока) свойства следующих типов: Integer, Int64, String, Double, Boolean, TStrings.

Реализация

Весь код находится в файле ExcelView.pas (7 Кб). Компонент TExcelView имеет единственное published свойство TemplateFileName — это имя файла шаблона. Метод Show открывает Excel и запускает процесс экспорта.

Можно и не устанавливать компонент в палитру, а сразу выполнить процедуру

Обратите внимание на параметр Owner! Это тот компонент (форма, датамодуль), чьи свойства, компоненты и датасеты будут экспортироваться в Excel.

Взаимодействие с Excel происходит через OLE:

Для вывода набора данных сначала формируется вариантный массив:

А потом уже вставляется в нужное место:

Для вывода свойств используется модуль Rtti:

Источник

This TscExcelExport component is an advanced, powerful but easy to use component which enables you to export all records of a dataset from Embarcadero Delphi to Microsoft Excel. Many features are provided to change the layout, use conditional formatting, to add totals, to create groups, to set a filter, … The component works in Delphi 5, 6, 7, 2006, 2007, 2009, 2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8, 10 Seattle, 10.1 Berlin, 10.2 Tokyo, 10.3 Rio, 10.4 Sydney and 11 Alexandria and it supports all Excel versions from 97 to 2019.

TscExcelExport component (Delphi VCL)

TscExcelExport component (Delphi VCL)

Features

Properties

All kinds of settings to modify the layout of the worksheet are provided.

  • Name of worksheet and file
  • Header and footer texts
  • Begin row and column of header, footer, titles (=fieldnames) and data (fieldvalues)
  • Width of columns or autofit
  • Font of header, footer, titles, summary and data (Alignment, VerticalAlignment, WrapText, Orientation, MergeCells)
  • Backgroundcolor and borders of header, footer, titles, summary and data
  • Summaries for numeric or given fields (SUM, MIN, MAX, AVG, COUNT)
  • AutoFilter for titles
  • Create groups with given fields
  • Create new worksheets are reuse existing files
  • Access to the Excel objects (ExcelApplication, ExcelWorkbook, ExcelWorksheet, …)

Events

  • To define the background color and font color, size, name and bold style of each cell
  • For exporting/writing data without using a TDataset

Methods

  • Export to Excel
  • Save worksheet as XLSX (Open XML), XLS, HTML, XML or CSV
  • Show print preview

Component editor

  • The component editor can be used to change some settings on an easy way.

Live templates

  • Live templates for all Delphi versions since 2006 (ExcelExportUse and ExcelExportCreate)

Info

Type library / OCX / COM

  • This ExcelExport component uses the Office server components from the Embarcadero COM type library to implement OLE automation with Excel.
  • By using compiler directives (in unit scExcelExportConfig.inc) you can override the default type library. The available libraries are Excel97, Excel2000, ExcelXP and Excel2010.
  • Microsoft Excel should be installed on the PC when using this component.

Delphi / Office

  • This VCL component was tested in

    • Borland Delphi 5 (SP1)
    • Borland Delphi 6
    • Borland Delphi 7
    • Borland Delphi (BDS) 2005
    • Borland Delphi (BDS) 2006
    • CodeGear Turbo Delphi
    • CodeGear Delphi 2007
    • CodeGear Delphi 2009
    • Embarcadero Delphi 2010
    • Embarcadero Delphi XE
    • Embarcadero Delphi XE2
    • Embarcadero Delphi XE3
    • Embarcadero Delphi XE4
    • Embarcadero Delphi XE5
    • Embarcadero Delphi XE6
    • Embarcadero Delphi XE7
    • Embarcadero Delphi XE8
    • Embarcadero Delphi 10 Seattle
    • Embarcadero Delphi 10.1 Berlin
    • Embarcadero Delphi 10.2 Tokyo
    • Embarcadero Delphi 10.3 Rio & Community Edition
    • Embarcadero Delphi 10.4 Sydney
    • Embarcadero Delphi 11 Alexandria
  • This ExcelExport component works with

    • Microsoft Excel 97
    • Microsoft Excel 2000
    • Microsoft Excel XP
    • Microsoft Excel 2003
    • Microsoft Excel 2007
    • Microsoft Excel 2010
    • Microsoft Excel 2013
    • Microsoft Excel 2016
    • Microsoft Excel 2019
    • Microsoft Excel 365
  • It has been tested with Dutch and some English Office versions.
  • It will also give you access to the Excel Application, Workbook and Worksheet objects so you can access all VBA properties and methods.

Demo application

  • A full demo application with 18 examples is provided to test all features of the component (and Excel automation).
  • The project file and source code is located in the Source demo folder. The executable DemoExcelExport.exe is also included in this folder.

Installation

  • Step 1: Open the run-time package ExcelExportPack5.dpk (for Delphi5), ExcelExportPack6.dpk (for Delphi6) ExcelExportPack7.dpk (for Delphi7), ExcelExportPack9.dpk (for Delphi 2005), ExcelExportPack10.dproj (for Delphi 2006 and Turbo Delphi), ExcelExportPack11.dproj (for Delphi 2007), ExcelExportPack12.dproj (for Delphi 2009), ExcelExportPack14.dproj (for Delphi 2010), ExcelExportPackXE.dproj (for Delphi XE), ExcelExportPackXE2.dproj (for Delphi XE2), …, ExcelExportPackXE10.dproj (for Delphi XE10), ExcelExportPackD10.dproj (for Delphi 10 Seattle), ExcelExportPackD101.dproj (for Delphi 10.1 Berlin), ExcelExportPackD102.dproj (for Delphi 10.2 Tokyo), ExcelExportPackD103.dproj (for Delphi 10.3 Rio and Community Edition) and ExcelExportPackD104.dproj (for Delphi 10.4 Sydney). Compile or Build the package.
  • Step 2: Open the design-time package dclExcelExportPackx.dproj and Compile or Build it
  • Step 3: Install it. The Install option is only available in the context popup menu when you right click
  • The TscExcelExport component will appear in the tabsheet SC of the component palette.
  • When you like to add the component to an existing package, make sure the DCP file dclOffice which can be found in the Delphi/Lib folder is added as «required». When creating a new design-time package, the DCP file designide.dcp should be added.

Technical info

  • See header of unit scExcelExport.pas for more information about all properties, methods, events, …
  • Documentation, release notes and examples about the Delphi TscExcelExport component (in PDF format) (3,6 Mb)

Screenshots






Delphi examples

Example 1 : easiest way to export/write/copy dataset to Excel

scExcelExport1.Dataset:=Table1;
scExcelExport1.ExportDataset;
scExcelExport1.Disconnect;

Example 2 : using layout properties, adding summary cells and save file

scExcelExport1.WorksheetName := 'MyDataset';
scExcelExport1.Dataset:=Table1;
scExcelExport1.StyleColumnWidth:=cwOwnerWidth;
scExcelExport1.ColumnWidth := 20;
scExcelExport1.HeaderText.Text := 'Header';
scExcelExport1.BeginRowHeader := 2;
scExcelExport1.FontTitles := LabelTitle.Font;
scExcelExport1.FontTitles.Orientation := 45;
scExcelExport1.BorderTitles.BackColor := clYellow;
scExcelExport1.BorderTitles.BorderColor := clRed;
scExcelExport1.BorderTitles.LineStyle := blLine;
scExcelExport1.BeginRowTitles := 5;
scExcelExport1.FontData := LabelData.Font;
scExcelExport1.SummarySelection := ssValues;
scExcelExport1.SummaryCalculation := scMAX;
scExcelExport1.AutoFilter := True;
scExcelExport1.ExcelVisible:=False;
try
  scExcelExport1.ExportDataset;
  scExcelExport1.ExcelWorkSheet.Range['A1','A10'].Value := 'Delphi';
  scExcelExport1.SaveAs('c:test.xls',ffXLS);
finally
  scExcelExport1.Disconnect;
end;

Example 3 : grouping data

try
  scExcelExport1.Dataset:=QuerySortShipVia;

  scExcelExport1.SummarySelection := ssValues;
  scExcelExport1.SummaryCalculation := scAVG;
  scExcelExport1.SummaryDisplayFormat := '###0.000';

  scExcelExport1.StyleColumnWidth := cwEnhAutoFit;

  scExcelExport1.GroupFields.Clear;
  scExcelExport1.GroupFields.Add('ShipVia');
  scExcelExport1.GroupFields.Add('Terms');

  scExcelExport1.ExportDataset;
finally
  scExcelExport1.Disconnect;
end;

Example 4 : export several datasets

scExcelExport1.ExcelVisible:=True;
try
  scExcelExport1.Dataset:=Table1;
  scExcelExport1.WorksheetName:='1';
  scExcelExport1.ConnectTo := ctNewExcel;
  scExcelExport1.ExportDataset;
  scExcelExport1.Disconnect;
  scExcelExport1.Dataset:=Table2;
  scExcelExport1.WorksheetName:='2';
  scExcelExport1.ConnectTo := ctNewWorkbook;
  scExcelExport1.ExportDataset;
  scExcelExport1.Disconnect;
  scExcelExport1.Dataset:=Table3;
  scExcelExport1.WorksheetName:='3';
  scExcelExport1.ConnectTo := ctNewWorksheet;
  scExcelExport1.ExportDataset;
finally
  scExcelExport1.Disconnect;
end;

Example 5 : change background color and font style in the OnGetCellStyle event

procedure scExcelExportGetCellStyleEvent(Sender: TObject; Field: TField; 
  var ColorBackground : TColor; FontCell : TxlFont);
begin
  if Field.FieldName = 'CustNo' then
  begin
    if Field.Value > 2000 then
    begin
      FontCell.Color := clRed;
      FontCell.Name := 'Times New Roman';
      FontCell.Size := 14;
    end;
    if Field.Value > 3000 then
    begin
      FontCell.Color := clGreen;
      FontCell.Style := [fsBold];
    end;
  end;

  if Field.FieldName = 'EmpNo' then
  begin
    if Field.Dataset.FieldByName('CustNo').Value > 2000 then
      ColorBackground := clRed;
  end;

  if Field.DataSet.FieldByName('EmpNo').Value > 100 then
    ColorBackground := clYellow;
end;

Example 6 : access to the properties of the Excel Worksheet object

try
  scExcelExport1.Dataset:=Table1;
  scExcelExport1.Connect;
  scExcelExport1.ExcelWorkSheet.Range['A2','C8'].Borders.Color := clRed;

  scExcelExport1.ExportDataset;

  scExcelExport1.ExcelWorkSheet.Range['B2','B2'].Select;  scExcelExport1.ExcelApplication.ActiveWindow.FreezePanes := True;

  scExcelExport1.ExcelWorkSheet.Range['B5','E7'].Cells.Clear;

  scExcelExport1.ExcelWorkSheet.Range[Format('A%d',[scExcelExport1.EndRowData+3]),
    Format('A%d',[scExcelExport1.EndRowData+3])].Value := 'Add extra info to the Excel worksheet';

  scExcelExport1.ExcelWorkSheet.Range['M1','M1'].Value := 10;
  scExcelExport1.ExcelWorkSheet.Range['M2','M2'].Value := 5;
  scExcelExport1.ExcelWorkSheet.Range['M3','M3'].Value := '=M1+M2';
  scExcelExport1.ExcelWorkSheet.Range['M3','M3'].Font.Color := clRed;
  scExcelExport1.ExcelWorkSheet.Range['M1','M20'].EntireColumn.Autofit;

  scExcelExport1.ExcelWorkSheet.Range['B2','B2'].AddComment('This is comment for a cell');
finally
  scExcelExport1.Disconnect;
end;

Copyrights and distribution

  • All copyrights to this component are owned by the author Stefan Cruysberghs.
  • This component is open-source and can be distributed and used freely for non-commercial purposes. In commercial environments a license is required!
  • All sources (with detailed comments) are included.
  • The author doesn’t give a warranty for error free running of this component.
  • Registered users can count on it that bugs will be solved as soon as possible.

Registration

  • If you like this component or you are using it in a commercial environment then you have to register it.
  • You will encourage the author to further develop and improve this ExcelExport component.
  • After registering you do not need a registration key! No email will be send. The version which can be downloaded at this page is fully functional.

Benefits of registering

  • Full source code for Delphi version 5 to XE8 and to 11 Alexandria.
  • Unlimited deployment license in commercial environments.
  • Lifetime license, so once you’ve paid the license fee, you don’t need to pay any further to get updates.
  • Basic support can be provided by e-mail.

Single developer license

  • Price: 35 EURO
  • Buy single license via PayPal

Site license (unlimited developers, unlimited time valid)

  • Price: 130 EURO
  • Buy site license via PayPal

If you are a satisfied home user of this component and you would like to further support its development, you can donate 2 euros via PayPal. Thanks in advance for the support!

    Donatie van 2 euro PayPal

Download

TscExcelExport component

  • Contents: TscExcelExport component with sources, demo application and documentation
  • Version: 4.42 (2021-10-27)
  • File size: 11.29 Mb
  • Author: Stefan Cruysberghs

Download now

Автор: ООО «РИЛИО»

Прилагается исходный код компонента ExcelView и процедуры экспорта и печати по шаблону в Excel для Delphi 2010/XE/XE2. Доступна полная версия с примерами использования.

Зачем это нужно?

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

Поэтому вполне закономерно, что Excel широко используется и для разработки различных печатных форм. Хотя по своим возможностям он уступает специализированным генераторам отчетов, уже практически для всех типовых документов можно найти готовые Excel-шаблоны, от коммерческого предложения до товарно-транспортной накладной по форме 1-Т (http://blanker.ru/doc/38)

Что и как экспортировать?

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

В шаблоне могут использоваться в качестве переменных:

  • все published свойства формы-владельца
  • все компоненты, принадлежащие форме-владельцу, и их published свойства
  • все наборы данных (наследники TDataSet) обрабатываются специальным образом, в шаблон подставляются значения их полей

Готовые решения на основе шаблонов

Компоненты для вывода в Excel довольно легко найти в интернете, например:

  • TMS Flexcel Studio (http://www.tmssoftware.com/site/flexcel.asp) — $125
  • ARExcelReport (http://www.vector-ski.com/reports/arexcelreport_index.htm) — бесплатный для некоммечерского использования, стоимость исходников — $125
  • Don Excel Report (http://www.don-soft.com.ar/DonExcelReport/products.php) — $75
  • AfalinaSoft XL Report (http://www.afalinasoft.com/download-xl-report.html) — «будет open source через месяц-два», — написано в 2003 году. Увы…
  • FlexCelReport (http://www.freewebs.com/flexcel/) — бесплатный, в исходниках. Для Delphi 5/6/7. Сайт в настоящее время недоступен. При пересборке пакетов под Delphi 2010-XE2 необходимо вносить серьезные изменения.

Do It Yourself

Библиотеки компонентов всем хороши (кроме стоимости, конечно), но даже наличие исходных текстов не всегда спасает от возможных неприятностей. Проблема в том, что кода становится слишком много. Например, один из лучших (на мой взгляд) — FlexCelReport — это 916 Кб в 174 исходных файлах. Переносить этот проект на современные версии Delphi становится проблематично.

В таких случаях остается вариант написания процедуры или компонента самостоятельно. В качестве стартовой точки для ознакомления можно рекомендовать http://www.webdelphi.ru/2009/08/rabota-s-excel-v-delphi-osnovy-osnov/, http://www.codenet.ru/progr/delphi/stat/export-to-excel.php и т.д.

Таблицы и поля в шаблонах

У всех компонентостроителей — свои правила записи переменных в шаблонах. В FlexCelReport — это именованные диапазоны с двумя подчеркиваниями «__MAIN__» и переменные в ячейках вида ##DataSetName##FieldName, в ARExcelReport — <#table:DataSetName> … <#table> и т.д.

Мы хотим еще проще. Только FieldName и ничего лишнего.

А где задается DataSet?

В первой колонке. Отведем всю колонку под служебную информацию, благо в Экселе их (колонок) и так более чем достаточно. При выводе будем эту колонку скрывать.

Еще одно допущение — если мы хотим вывести все записи из DataSet-а в виде таблицы, ставим перед его именем звездочку (*tblOrders). Без звездочки будут выводиться только значения полей текущей записи.

шаблон ExcelView

Свойства и компоненты в шаблонах

Для вывода в шаблоне published свойства текущей формы запишем в ячейке имя этого свойства в квадратных скобках: [Caption], [Tag]. Свойства компонентов формы записываются с именем компонента через точку: [Memo1.Lines]. Поддерживаются (пока) свойства следующих типов: Integer, Int64, String, Double, Boolean, TStrings.

Реализация

Весь код находится в файле ExcelView.pas (7 Кб). Компонент TExcelView имеет единственное published свойство TemplateFileName — это имя файла шаблона. Метод Show открывает Excel и запускает процесс экспорта.

Можно и не устанавливать компонент в палитру, а сразу выполнить процедуру

Код:

procedure ShowExcelView(Owner: TComponent; FileName: TFileName);

Обратите внимание на параметр Owner! Это тот компонент (форма, датамодуль), чьи свойства, компоненты, датасеты и будут экспортироваться в Excel.

Взаимодействие с Excel происходит через OLE:

Код:

Excel := CreateOleObject(‘Excel.Application’);

Для вывода набора данных сначала формируется вариантный массив:

Код:

ArrayData := VarArrayCreate([1, DataSet.RecordCount, 1, FieldList.Count], varVariant);
y := 1;
while not DataSet.Eof do
begin
 z := 1;
 for i := 0 to FieldList.Count1 do begin
 if FieldList[i]=» then ArrayData[y, z] :=»
 else begin
 if DataSet.FieldByName(FieldList[i]).DataType=ftFloat then
 ArrayData[y, z] := DataSet.FieldByName(FieldList[i]).AsFloat
 else ArrayData[y, z] := DataSet.FieldByName(FieldList[i]).Value;
 end;
 inc(z);
 end;
 DataSet.Next;
 inc(y);
end;

А потом уже вставляется в нужное место:

Код:

Range.Value := ArrayData;

Для вывода свойств используется модуль Rtti:

Код:

c := TRttiContext.Create;
t:=c.GetType(cmp.ClassInfo);
p:=t.GetProperty(PropName);
if p <> nil then begin
 IsNumeric:=false;
 if p.PropertyType.ToString = ‘TStrings’ then PropValue:=p.GetValue(cmp).AsType.Text
 else if p.PropertyType.ToString = ‘Boolean’ then PropValue:=BoolToStr(p.GetValue(cmp).AsBoolean,true)
 else
 case p.PropertyType.TypeKind of
 tkInteger,
 tkInt64 : begin
 PropValue := IntToStr(p.GetValue(cmp).AsInteger);
 IsNumeric:=true;
 end;
 tkString,
 tkUString,
 tkLString : PropValue := p.GetValue(cmp).AsString;
 tkFloat : begin
 PropValue := FloatToStr(p.GetValue(cmp).AsExtended);
 IsNumeric:=true;
 end;
 else PropValue := »;
 end;
 if IsNumeric and (Trim(Copy(st,1,i11))=») and (Trim(Copy(st,i2+1,length(st)))=») then
 Sheet.Cells[Row, Col]:=StrToFloat(PropValue)
 else Sheet.Cells[Row, Col]:=Copy(st,1,i11)+PropValue+Copy(st,i2+1,length(st));
end;
c.Free;

Из за использования модулей Rtti и TypInfo компонент не работает в Delphi младше 2010. Можно либо удалить эти ссылки и весь метод ProcessProperty, либо переписать его для младших версий Delphi (см. http://delphi7.org/lit/faq/1618.php)

​Исходный код

Код:

//////////////////////////////////////////////////////////////
// ExcelView v 0.1 //
// Freeware component for Delphi 2010/XE/XE2 //
// //
// Copyright (c) 2012 RILIO (http://rilio.net) //
// //
// Software distributed on an «AS IS» basis, //
// WITHOUT WARRANTY OF ANY KIND, either express or implied. //
// //
//////////////////////////////////////////////////////////////
unit ExcelView;
interface
uses
 SysUtils, Classes, DB;
type
 TExcelView = class(TComponent)
 private
 FTemplateFileName: TFileName;
 procedure SetTemplateFileName(const Value: TFileName);
 procedure ProcessSheet(Sheet: Variant);
 procedure ProcessDataSet(Sheet: Variant; Row: integer);
 procedure ProcessMultipleRecords(Sheet: Variant; Row: integer; DataSet: TDataSet);
 procedure ProcessProperty(Sheet: Variant; Row: integer; Col: integer);
 protected
 public
 procedure Show;
 published
 property TemplateFileName: TFileName read FTemplateFileName write SetTemplateFileName;
 end;
procedure ShowExcelView(Owner: TComponent; FileName: TFileName);
procedure Register;
implementation
uses Variants, ActiveX, ComObj, Rtti, TypInfo;
procedure ShowExcelView(Owner: TComponent; FileName: TFileName);
begin
 with TExcelView.Create(Owner) do begin
 TemplateFileName:=FileName;
 Show;
 Free;
 end;
end;
function IsExcelInstalled: boolean;
var
 ClassID: TCLSID;
begin
 Result := CLSIDFromProgID(PWideChar(WideString(‘Excel.Application’)), ClassID) = S_OK;
end;
procedure Register;
begin
 RegisterComponents(‘RILIO’, [TExcelView]);
end;
{ TExcelView }
procedure TExcelView.ProcessDataSet(Sheet: Variant; Row: integer);
var DataSetName: string;
 MultipleRecords: boolean;
 DataSet: TDataSet;
 i: integer;
 FieldName: string;
begin
 DataSetName:=Sheet.Cells[Row,1];
 MultipleRecords:=DataSetName[1]=‘*’;
 if MultipleRecords then
 DataSetName:=Copy(DataSetName,2,length(DataSetName));
 DataSet:=TDataSet(Owner.FindComponent(DataSetName));
 if DataSet <> nil then
 if MultipleRecords and (DataSet.RecordCount > 1) then ProcessMultipleRecords(Sheet,Row,DataSet) else
 for i := 2 to Sheet.UsedRange.Columns.Count do begin
 FieldName:=string(Sheet.Cells[Row,i]);
 if DataSet.FindField(FieldName) <> nil then begin
 if DataSet.FieldByName(FieldName).DataType=ftFloat then
 Sheet.Cells[Row,i]:=DataSet.FieldByName(FieldName).AsFloat
 else Sheet.Cells[Row,i]:=DataSet.FieldByName(FieldName).AsString;
 end;
 end;
end;
procedure TExcelView.ProcessMultipleRecords(Sheet: Variant; Row: integer; DataSet: TDataSet);
var i,z,y: integer;
 ArrayData : Variant;
 FieldName: string;
 FieldList: TStringList;
 StartCol: integer;
 Cell1,Cell2,Cell3,Range,RowRange: OleVariant;
begin
 StartCol:=0;
 FieldList:=TStringList.Create;
 for i:=2 to Sheet.UsedRange.Columns.Count do begin
 FieldName:=string(Sheet.Cells[Row,i]);
 if DataSet.FindField(FieldName) <> nil then begin
 FieldList.Add(FieldName);
 if StartCol=0 then StartCol:=i;
 end else if StartCol <> 0 then FieldList.Add(»);
 end;
 FieldList.Text:=Trim(FieldList.Text);
 DataSet.Last;
 DataSet.First;
 ArrayData := VarArrayCreate([1, DataSet.RecordCount, 1, FieldList.Count], varVariant);
 y := 1;
 while not DataSet.Eof do
 begin
 z := 1;
 for i := 0 to FieldList.Count1 do begin
 if FieldList[i]=» then ArrayData[y, z] :=»
 else begin
 if DataSet.FieldByName(FieldList[i]).DataType=ftFloat then
 ArrayData[y, z] := DataSet.FieldByName(FieldList[i]).AsFloat
 else ArrayData[y, z] := DataSet.FieldByName(FieldList[i]).Value;
 end;
 inc(z);
 end;
 DataSet.Next;
 inc(y);
 end;
 for i := 1 to DataSet.RecordCount1 do
 Sheet.Rows[Row+1].Insert;
 Cell1 := Sheet.Cells[Row, StartCol];
 Cell2 := Sheet.Cells[Row, StartCol + FieldList.Count1];
 Cell3 := Sheet.Cells[Row + DataSet.RecordCount1, StartCol + FieldList.Count1];
 RowRange := Sheet.Range[Cell1, Cell2];
 Range := Sheet.Range[Cell1, Cell3];
 if DataSet.RecordCount=0 then RowRange.Value:=» else begin
 RowRange.AutoFill(Range, 3);
 Range.WrapText:= True;
 Range.VerticalAlignment := 1;
 Range.Value := ArrayData;
 end;
 FieldList.Free;
end;
procedure TExcelView.ProcessProperty(Sheet: Variant; Row, Col: integer);
var st, PropName, PropValue: string;
 i1, i2, dotpos: integer;
 cmp: TComponent;
 c : TRttiContext;
 t : TRttiType;
 p : TRttiProperty;
 IsNumeric: boolean;
begin
 st:=string(Sheet.Cells[Row, Col]);
 i1:=Pos(‘[‘,st);
 i2:=Pos(‘]’,st);
 PropName:=Copy(st,i1+1,i2i11);
 dotpos:=Pos(‘.’,PropName);
 if dotpos <> 0 then begin
 cmp:=Owner.FindComponent(Copy(PropName,1,dotpos1));
 PropName:=Copy(PropName,dotpos+1,length(PropName));
 end else cmp:=Owner;
 if cmp <> nil then begin
 c := TRttiContext.Create;
 t:=c.GetType(cmp.ClassInfo);
 p:=t.GetProperty(PropName);
 if p <> nil then begin
 IsNumeric:=false;
 if p.PropertyType.ToString = ‘TStrings’ then PropValue:=p.GetValue(cmp).AsType<TStrings>.Text
 else if p.PropertyType.ToString = ‘Boolean’ then PropValue:=BoolToStr(p.GetValue(cmp).AsBoolean,true)
 else
 case p.PropertyType.TypeKind of
 tkInteger,
 tkInt64 : begin
 PropValue := IntToStr(p.GetValue(cmp).AsInteger);
 IsNumeric:=true;
 end;
 tkString,
 tkUString,
 tkLString : PropValue := p.GetValue(cmp).AsString;
 tkFloat : begin
 PropValue := FloatToStr(p.GetValue(cmp).AsExtended);
 IsNumeric:=true;
 end;
 else PropValue := »;
 end;
 if IsNumeric and (Trim(Copy(st,1,i11))=») and (Trim(Copy(st,i2+1,length(st)))=») then
 Sheet.Cells[Row, Col]:=StrToFloat(PropValue)
 else Sheet.Cells[Row, Col]:=Copy(st,1,i11)+PropValue+Copy(st,i2+1,length(st));
 end;
 c.Free;
 end;
end;
procedure TExcelView.ProcessSheet(Sheet: Variant);
var
 i,j,Cols,Rows: integer;
begin
 Sheet.Activate;
 Rows:=Sheet.UsedRange.Rows.Count;
 Cols:=Sheet.UsedRange.Columns.Count;
 for i := 1 to Rows+1 do begin
 for j := 1 to Cols+1 do
 if Pos(‘[‘,string(Sheet.Cells[i,j])) <> 0 then
 ProcessProperty(Sheet,i,j);
 end;
 for i := 1 to Rows+1 do begin
 if string(Sheet.Cells[i,1]) <> » then
 ProcessDataSet(Sheet,i);
 end;
 Sheet.Columns[1].Hidden:=true;
end;
procedure TExcelView.SetTemplateFileName(const Value: TFileName);
begin
 FTemplateFileName := Value;
end;
procedure TExcelView.Show;
var
 Excel, Book, Sheet, ArrayData : Variant;
 i: integer;
 ClassID: TCLSID;
begin
 if not FileExists(TemplateFileName) then raise Exception.Create(‘Template file «‘+TemplateFileName+‘» not found’);
 if CLSIDFromProgID(PWideChar(WideString(‘Excel.Application’)), ClassID) <> S_OK then raise Exception.Create(‘MS Excel application not found’);
 try
 Excel := CreateOleObject(‘Excel.Application’);
 Excel.EnableEvents := False;
 Excel.Visible:=false;
 Book := Excel.Workbooks.Add(TemplateFileName);
 for i := 1 to Book.Sheets.Count do
 ProcessSheet(Book.Sheets.Item[i]);
 Book.Sheets.Item[1].Activate;
 finally
 Excel.EnableEvents := true;
 Excel.Visible:=true;
 Excel.Visible:=false;
 Excel.Visible:=true;
 end;
end;
end.

I wanted to know if anyone ones a way that I can export data from a DBGrid to Excel ? I am using Delphi 7 , Excel 2007 and ADO .
Any help will be appreciated.

asked Jun 12, 2013 at 5:57

0x436f72647265's user avatar

0x436f726472650x436f72647265

4162 gold badges8 silver badges21 bronze badges

6

If you want a fast export of raw data, just export your recordset (ADODataset.recordset) with something like that:

procedure ExportRecordsetToMSExcel(DestName: string; Data: _Recordset);
var
  ovExcelApp: OleVariant;
  ovExcelWorkbook: OleVariant;
  ovWS: OleVariant;
  ovRange: OleVariant;
begin
  ovExcelApp := CreateOleObject('Excel.Application'); //If Excel isnt installed will raise an exception
  try
    ovExcelWorkbook   := ovExcelApp.WorkBooks.Add;
    ovWS := ovExcelWorkbook.Worksheets.Item[1]; // go to first worksheet
    ovWS.Activate;
    ovWS.Select;
    ovRange := ovWS.Range['A1', 'A1']; //go to first cell
    ovRange.Resize[Data.RecordCount, Data.Fields.Count];
    ovRange.CopyFromRecordset(Data, Data.RecordCount, Data.Fields.Count); //this copy the entire recordset to the selected range in excel
    ovWS.SaveAs(DestName, 1, '', '', False, False);
  finally
    ovExcelWorkbook.Close(SaveChanges := False);
    ovWS := Unassigned;
    ovExcelWorkbook := Unassigned;
    ovExcelApp := Unassigned;
  end;
end;

answered Jun 12, 2013 at 14:05

Agustin Seifert's user avatar

Agustin SeifertAgustin Seifert

1,9281 gold badge16 silver badges29 bronze badges

2

It is working by using Tfilestream component

procedure TForm2.ExportdatatoexcelClick(Sender: TObject);
 var
  Stream: TFileStream;
  i: Integer;
  OutLine,f: string;
  sTemp,s: string;
begin
  Stream := TFileStream.Create('D:Yogesh Delphiemployee1.csv', fmCreate);
  try
       s := string(adotable1.Fields[0].FieldName);

      for I := 1 to adotable1.FieldCount - 1 do
       begin
        s:= s+ ',' + string(adotable1.Fields[I].FieldName);
       end;
         s:= s+ #13#10;
        stream.Write(s[1], Length(s) * SizeOf(Char));
       {S := '';
      for I := 0 to adotable1.FieldCount - 1 do
        begin
         S := (adotable1.Fields[I].FieldName);
        outline := OutLine+S + ' ,';
        end; }

    while not adotable1.Eof do
    begin
      // You'll need to add your special handling here where OutLine is built
       s:='';
      OutLine := '';
      for i := 0 to adotable1.FieldCount - 1 do
      begin
        sTemp := adotable1.Fields[i].AsString;
        // Special handling to sTemp here
        OutLine := OutLine + sTemp +',';
      end;
      // Remove final unnecessary ','
      SetLength(OutLine, Length(OutLine) - 1);
      // Write line to file
      Stream.Write(OutLine[1], Length(OutLine) * SizeOf(Char));
      // Write line ending
      Stream.Write(sLineBreak, Length(sLineBreak));
      adotable1.Next;
    end;

  finally
    Stream.Free;  // Saves the file
  end;
    showmessage('Records Successfully Exported.') ;
end;
    {Yog}

Alexander's user avatar

Alexander

4,3617 gold badges26 silver badges40 bronze badges

answered Mar 26, 2018 at 11:16

user9552247's user avatar

I want to export the records of a table in MS Access to a excel file or a tab delimited text file in DELPHI. Here i have tried with ADOTable since i have no idea of exporting it with ADODataset. My code is,

procedure TForm1.Button4Click(Sender: TObject);
const
   adClipString = 2;
   ColumnDelimiter = ‘;’;
   RowDelimiter = #13#10;
var
   s : String;
   fs : TFileStream;
   export_filename:string;
   ADOTable1:TADOTable;
   rs123:TADODataset;
begin
    connect;
    rs123:=TADOdataset.create(nil);
    rs123.Connection :=con;
    rs123.CommandText :=’select * from b_table1′;
    rs123.Open;
    export_filename:=’c:test.csv’;
   ADOTable1:=TADOTable.Create(nil);
   ADOTable1.Connection :=con;
   ADOTable1.TableName :=’b_table1′;
   ADOTable1.Open;
   s := ADOTable1.Recordset.GetString(adClipString, ADOTable1.Recordset.RecordCount, ColumnDelimiter, RowDelimiter, »);
fs := TFileStream.Create(export_filename, fmCreate);
 try
  fs.WriteBuffer(s[1], Length(s));
 finally
  fs.Free;
end;
   showmessage(‘completed’);
end;

When i opened the excel file, i found that all the field values are stored in one cell separated by commas. But i want each of the field value in each column.

I want the output file with details in the following format(in the case of text file):
H      FirstName      LastName      Age      !!
A      Ram      Ramu      21      !!
A      Sam      Samu      19      !!
A      Sen      Senu      23      !!      

In case of Excel, i want each field value in separate columns.

Please help me.

Понравилась статья? Поделить с друзьями:
  • Deleting duplicates from excel
  • Deleting duplicate rows in excel
  • Deleting columns excel vba
  • Deleting cells on excel
  • Delphi csv to excel