Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/58: Рейтинг темы: голосов - 58, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 29.09.2013
Сообщений: 50
1

Вывод информации из DBGrid в шаблон Excel

09.10.2013, 16:10. Показов 12020. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Перечитал кучу информации по заезженной теме, на всех сайтах и форумах, включая мой любимый cyberforum, смог сделать то, что мне нужно, но возникли некоторые трудности! Прошу, ОГРОМНОГО прощения, за то, что как и многие создаю подобные темы!

Проблема заключается в следующем, имеется компонент DBGrid1, черпает он информацию из Базы Данных MS Access!
Так же имеется кнопка (BitBtn3 - "Создать Прайс-лист"), при нажатии на нее, кнопка, открывает программу Excel (Прайс-лист) и по шаблону заполняет все данные из Access!
Я не знаю, как мне сделать, чтобы при нажатии на кнопку (BitBtn3 - "Создать Прайс-лист"), данные заполнялись только в те столбцы, что мне нужны! Как я понял, DBGrid роли никакой не играет при составление "отчета" в Excel, всю информацию получают прямиком из Базы Данных MS Access, при том, что Excel отображает всю информацию в точь, в точь, как и в Access, тогда как сделать так, чтобы в "Прайс-листе", заполнялись только те столбцы с информацией, что мне надо, даже, если в таблице Access, столбцы с информацией расположены в хаотичном порядке!

Код программы:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
procedure TForm2.BitBtn3Click(Sender: TObject);
Var
   ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData: Variant;
   BeginCol, BeginRow, j: integer;
   RowCount, ColCount: Integer;
   AppLocation:string;
Begin
   BeginCol := 1;   // Начинает вывод информации с 1 столбца.
   BeginRow := 11; // Начинает вывод информации с 11 строки.
// Размеры выводимого массива данных
   RowCount := ADOQuery1.RecordCount;
   ColCount := ADOQuery1.FieldDefs.Count;
// Создание Excel
   ExcelApp := CreateOleObject('Excel.Application');
   ExcelApp.DisplayAlerts := false;
// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
   ExcelApp.Application.EnableEvents := false;
//  Создаем Книгу (Workbook)
//  Если заполняем шаблон, то
   Workbook := ExcelApp.WorkBooks.Add(GetCurrentDir() + '\Документы\Прайс-лист.xls');
   ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);
 // Заполняем массив
   ADOQuery1.DisableControls;
   ADOQuery1.First;
   While Not ADOQuery1.eof Do
   Begin
       For J := 1 To ADOQuery1.FieldDefs.Count Do
       Begin
           ArrayData[ADOQuery1.RecNo, J] :=
           ADOQuery1.FieldbyName(ADOQuery1.FieldDefs.Items[j - 1].DisplayName).value;
       End;
       ADOQuery1.Next;
   End;
   ADOQuery1.EnableControls;
// Левая верхняя ячейка области, в которую будем выводить данные
   Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
// Правая нижняя ячейка области, в которую будем выводить данные
   Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow + RowCount - 1,
   BeginCol + ColCount - 1];
// Область, в которую будем выводить данные
   Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];
// Вывод данных
   Range.Value := ArrayData;
// Делаем Excel видимым
   ExcelApp.Visible := True;
end;
Заранее спасибо! Надеюсь, проблему свою описал!
Миниатюры
Вывод информации из DBGrid в шаблон Excel  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2013, 16:10
Ответы с готовыми решениями:

Вывод информации в шаблон
Здравствуйте, есть одна проблема... В общем, устроился я на новую работу (поздравьте меня, да),...

Вывод информации в DbGrid
Нужно что бы при 2йном нажатии по строке DbGrid открывалась 2 форма с DbGrid имеющий не все...

Get запрос и вывод информации из БД в шаблон
Коллеги, доброго времени. Помогите решить проблему. Есть БД с данными учреждений: инн(inn),...

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

15
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,564
09.10.2013, 23:11 2
Больше 100 раз обсудили на форуме и + на все учебнике написано. Но вам читать лен да ? Лучше готовый код. копировать вставить И получите университете ДИПЛОМ .......... Дааа
0
1 / 1 / 0
Регистрация: 29.09.2013
Сообщений: 50
10.10.2013, 07:57  [ТС] 3
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Больше 100 раз обсудили на форуме и + на все учебнике написано. Но вам читать лен да ? Лучше готовый код. копировать вставить И получите университете ДИПЛОМ .......... Дааа
Согласен, что больше 100 раз, но я не очень внимателен, когда искал, подобное не нашел! Читать не лень, даже книгу купил и прочитал от "а" до "я", но именно, чтобы в ней была тема "Работа с Excel", "Вывод таблицы из Access в Excel с помощью компонента DBGrid" и что-то подобное нет! Книга - "Delphi 7 - Анатолий Хомоненко, Владимир Гофан, Евгений Мещеряков 2-е издание, полное руководство"! В первую очередь прочитаю, что мне нужно, пытаюсь найти информацию, а только потом просить о помощи!
0
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
10.10.2013, 08:26 4
Цитата Сообщение от Rosherh Посмотреть сообщение
В первую очередь прочитаю, что мне нужно, пытаюсь найти информацию, а только потом просить о помощи
А подумать?
Цитата Сообщение от Rosherh Посмотреть сообщение
Delphi
1
Range.Value := ArrayData;
Здесь ArrayData содержит, то что передается в ексель ... значит нужно туда поместить требуемые записи и поля.
Цитата Сообщение от Rosherh Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
// Заполняем массив
* *ADOQuery1.DisableControls;
* *ADOQuery1.First;
* *While Not ADOQuery1.eof Do
* *Begin
* * * *For J := 1 To ADOQuery1.FieldDefs.Count Do
* * * *Begin
* * * * * *ArrayData[ADOQuery1.RecNo, J] :=
* * * * * *ADOQuery1.FieldbyName(ADOQuery1.FieldDefs.Items[j - 1].DisplayName).value;
* * * *End;
* * * *ADOQuery1.Next;
* *End;
Наверное тут что то поменять....
Цитата Сообщение от Rosherh Посмотреть сообщение
Как я понял, DBGrid роли никакой не играет при составление "отчета" в Excel, всю информацию получают прямиком из Базы Данных MS Access
Не правильно. Компонента ADOQuery1 является компонентой TDataSet т.е. "Назначение компонента - буферизация записей, выбираемых оператором SELECT, для представления этих данных например в Grid". Если читали правильные книжки должны знать это.

Добавлено через 4 минуты
Цитата Сообщение от Rosherh Посмотреть сообщение
Delphi
1
2
// Область, в которую будем выводить данные
* *Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];
А здесь у вас задается область.
Может я не понял вопроса ... Но в коде все есть, что бы вывести данные в файл.
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,564
10.10.2013, 08:32 5
Цитата Сообщение от Rosherh Посмотреть сообщение
Согласен, что больше 100 раз, но я не очень внимателен, когда искал, подобное не нашел! Читать не лень, даже книгу купил и прочитал от "а" до "я", но именно, чтобы в ней была тема "Работа с Excel", "Вывод таблицы из Access в Excel с помощью компонента DBGrid" и что-то подобное нет! Книга - "Delphi 7 - Анатолий Хомоненко, Владимир Гофан, Евгений Мещеряков 2-е издание, полное руководство"! В первую очередь прочитаю, что мне нужно, пытаюсь найти информацию, а только потом просить о помощи!
Access в Excel с помощью компонента DBGrid Грид это просто для отображение запись , Он не имеет не какой отношения для експорт в Excel . Если вы так искали книга и не нашли такой стадия , Но посмотрите

1. Инструкция: Использование Excel из Delphi
2. Книга можно скачать Флёнов М.Е. - Библия Delphi (3-е издание) - 2011 на 440 странице

бедный студент , Как сильно хочет учится . Но он книга не нашел ....
Миниатюры
Вывод информации из DBGrid в шаблон Excel  
0
ZfoxAK
10.10.2013, 08:52
  #6

Не по теме:

Цитата Сообщение от xxbesoxx Посмотреть сообщение
бедный студент , Как сильно хочет учится . Но он книга не нашел ....
ИМХО xxbesoxx, Не стоит переходить на личности. Надо быть выше этого

0
1 / 1 / 0
Регистрация: 29.09.2013
Сообщений: 50
10.10.2013, 17:25  [ТС] 7
Цитата Сообщение от ZfoxAK Посмотреть сообщение
А подумать?
Коли программист, должен расписывать каждое действие?!
Цитата Сообщение от xxbesoxx Посмотреть сообщение
1. Инструкция: Использование Excel из Delphi
С этой статьей я сталкивался, от туда и начинал свое изучение! За книгу спасибо, буду читать сразу же!
Цитата Сообщение от ZfoxAK Посмотреть сообщение
А здесь у вас задается область.
Может я не понял вопроса ... Но в коде все есть, что бы вывести данные в файл.
Все выводится, с этим проблем нет, не могу именно те столбы вывести, что нужны мне (Например: "код", "наименование", "стоимость"), а не все подряд.

Добавлено через 5 часов 28 минут
Разобрался как делать! Вот мой код, возможно кому-то поможет! Если надо, то опишу как и что тут, чайникам вроде меня!

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure TForm2.BitBtn3Click(Sender: TObject);
Var
ExcelApp,Sheet,Colum:Variant; // указываем тип переменных.
 index,i:Integer;
begin
 ExcelApp:= CreateOleObject('Excel.Application');  // Создание OLE-объекта.
 ExcelApp.Application.EnableEvents := false; 
 ExcelApp.Workbooks.Add(GetCurrentDir() + '\Документы\Прайс-лист.xls');
 ExcelApp.Workbooks[1].WorkSheets[1].Name:='Прайс-лист';
 ExcelApp.DisplayAlerts := False;
 
 Colum:=ExcelApp.Workbooks[1].WorkSheets['Прайс-лист'].Rows;  // Форматирование строк.
 Colum.Rows[11].Font.Bold:=true;
 Colum.Rows[11].Font.Color:=clBlack;
 Colum.Rows[11].Font.Size:=8;
 Colum.Rows.Font.Name:='Times New Roman';
 
 Sheet:=ExcelApp.Workbooks[1].WorkSheets['Прайс-лист']; // Название столбцов.
 Sheet.Cells[9,1]:='Код';
 Sheet.Cells[9,2]:='Наименование товара';
 Sheet.Cells[9,3]:='Срок гарантии';
 Sheet.Cells[9,4]:='Цена (руб.)';
 
 index:=11;
 ADOQuery1.First;
 for i:=0 to ADOQuery1.RecordCount-1 do
  begin
   Sheet.Cells[index,2]:=ADOQuery1.Fields.Fields[1].AsString;
   Sheet.Cells[index,1]:=ADOQuery1.Fields.Fields[0].AsString;
   Sheet.Cells[index,4]:=ADOQuery1.Fields.Fields[3].AsString;
   Sheet.Cells[index,3]:=ADOQuery1.Fields.Fields[7].AsString;
   Inc(index);
   ADOQuery1.Next;
  end;
  ExcelApp.Visible := True;
end;
Проблему решил одним единственным циклом For, вместо двух циклов While и For, как выше было указанно мной.
Так же решил проблему, как мне вывести нужные данные таблицы из Access в Excel.
Delphi
1
2
3
4
5
 
   Sheet.Cells[index,2]:=ADOQuery1.Fields.Fields[1].AsString;
   Sheet.Cells[index,1]:=ADOQuery1.Fields.Fields[0].AsString;
   Sheet.Cells[index,4]:=ADOQuery1.Fields.Fields[3].AsString;
   Sheet.Cells[index,3]:=ADOQuery1.Fields.Fields[7].AsString;
Где index,"цифра" - это столбец в Excel, а Fields.Fields["цифра"] - это столбец данных в Access.
Так же была проблема с тем, что не полностью выводилась информация из Acceess в Excel, решил проблему с помощью
Delphi
1
 ExcelApp.Application.EnableEvents := false;
, ибо стало ясным, что действие выполняется быстрее, когда Excel не появляется сразу, а только после того, как сделает нужную операцию (Сбор всех данных из определенных таблиц и составление отчета в нужной форме).
0
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
11.10.2013, 05:49 8
Rosherh, первый вариант был более правильный чем сейчас т.к. передача данны из массива в эксел происходит быстрее чем построчное его заполнение.
Что вам мешало в компоненте ADOQuery1 запросом ограничить выдаваемые поля Select Field1, Field2 From Table1 Order by Field1 (не знаю как у вас в базе поля и таблицы называются)?
0
1 / 1 / 0
Регистрация: 29.09.2013
Сообщений: 50
11.10.2013, 08:49  [ТС] 9
Цитата Сообщение от ZfoxAK Посмотреть сообщение
Rosherh, первый вариант был более правильный чем сейчас т.к. передача данны из массива в эксел происходит быстрее чем построчное его заполнение.
Что вам мешало в компоненте ADOQuery1 запросом ограничить выдаваемые поля Select Field1, Field2 From Table1 Order by Field1 (не знаю как у вас в базе поля и таблицы называются)?
Сама таблица называется "Ассортимент", в ней есть "код", "наименование товара", "описание", "цена, руб.", "Фото", "Наличие на складе", "тип товара", "Срок гарантии".
Про Select я и забыл, хотя из этого и получилось все, что мне надо, да и не помню, куда и где его прописывать надо! Сейчас спешу к 15 числу, выступаю на конференции, поэтому мне надо как можно попроще, чтобы работало! Прототип так сказать, а уже в дальнейшей оптимизация, модернизация, чистка не нужных кодов и прочее.. В общем такие пироги!
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
11.10.2013, 15:05 10
Rosherh, возможно, следующие коды окажутся полезными.

1. Как передать в MS Excel набор данных, представленный экземпляром потомка TDataSet (TTable, TQuery, TADOTable, TADOQuery и т. д.) или, используя TDBGrid, который связан с потомком от TDataSet.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//Перенос всей таблицы БД на лист MS Excel.
procedure TForm1.Button1Click(Sender: TObject);
const
  //Идентификатор типа ячейки в диапазоне - последняя (справа внизу) ячейка диапазона.
  xlCellTypeLastCell = 11;
  //Вид смещения - вверх.
  xlShiftUp = -4162;
  //Тип линий.
  xlContinuous = 1;
  //Толщина линий.
  xlMedium = -4138;
  xlThick = 4;
  xlThin = 2;
var
  exCell1, exRng : Variant;
  i, Row : Integer;
  Bm : TBookmark;
begin
  //Проверка подключения к MS Excel.
  if VarIsClear(gExSh) then begin
    MessageBox(0, 'Нет подключения к MS Excel. Действие отменено.',
      'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  //Проверка подключения к таблице БД.
  if not ADOQuery1.Active then begin
    MessageBox(0, 'Таблица БД закрыта. Действие отменено.',
      'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  //Проверка таблицы БД на пустоту.
  if ADOQuery1.Eof then begin
    MessageBox(0, 'Таблица БД пуста. Действие отменено.',
      'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  {Верхняя левая ячейка таблицы Excel. Предположим, нам надо, чтобы её координаты
  были такими: "$B$3". Т. е., номер столбца = 2, номер строки = 3.}
  exCell1 := gExSh.Cells[3, 2];
  //Определяем номер нижней строки в области, которая уже используется на листе MS Excel.
  Row := gExSh.UsedRange.SpecialCells(xlCellTypeLastCell).Row;
  {Удаление прежних данных.
  Если номер нижней строки равен или больше номера строки, на которой расположена
  ячейка exCell1, то, значит, таблица уже содержит данные. В этом случае
  эти данные мы удаляем.}
  if Row >= exCell1.Row then begin
    //Диапазон таблицы.
    exRng := gExSh.Range[exCell1,
      exCell1.Offset[Row - exCell1.Row + 1, ADOQuery1.FieldCount - 1]];
    //Удаление диапазона со сдвигом вверх.
    exRng.Delete(xlShiftUp);
  end;
 
  //Записываем шапку таблицы над областью данных.
  for i := 0 to ADOQuery1.FieldCount - 1 do
    exCell1.Offset[0, i].Value := ADOQuery1.Fields[i].DisplayName;
  //Записываем данные таблицы БД на лист MS Excel.
  Bm := ADOQuery1.GetBookmark; //Запоминаем текущую позицию в таблице БД.
  ADOQuery1.DisableControls; //Отключаем набор данных от элементов управления.
  ADOQuery1.First; //Переход к первой записи таблицы.
  //Теперь перебираем все записи таблицы и передаём их на лист Excel.
  Row := 0;
  while not ADOQuery1.Eof do begin
    Inc(Row);
    for i := 0 to ADOQuery1.FieldCount - 1 do
      exCell1.Offset[Row, i].Value := ADOQuery1.Fields[i].AsString;
    ADOQuery1.Next;
  end;
  //Возвращаемся на прежнюю позицию в наборе данных.
  ADOQuery1.GotoBookmark(Bm);
  //Подключаем элементы управления.
  ADOQuery1.EnableControls;
 
  //Весь диапазон таблицы (шапка и данные).
  exRng := gExSh.Range[exCell1, exCell1.Offset[Row, ADOQuery1.FieldCount - 1]];
  //Обрамление диапазона.
  exRng.Borders.LineStyle := xlContinuous;
  exRng.Borders.Weight := xlThin;
  //Оформление шапки.
  exRng.Rows[1].Borders.Weight := xlMedium;
  exRng.Rows[1].Font.Bold := True; //Шрифт жирный.
  //Автоматический подбор ширины столбцов для всей таблицы.
  exRng.Columns.AutoFit;
end;
2. Ещё пример - передача набора данных на лист MS Excel с учётом сведений из связанного DBGrid: bd и нажатие кнопки. Как выбирать разные файлы БД для подключения?
1
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
14.10.2013, 05:22 11
Цитата Сообщение от Rosherh Посмотреть сообщение
Сама таблица называется "Ассортимент", в ней есть "код", "наименование товара", "описание", "цена, руб.", "Фото", "Наличие на складе", "тип товара", "Срок гарантии".
Очень не рекомендую использовать в названии полей русские буквы потом могут возникнуть проблемы, и тем более названия содержащие пробелы. Если нужно отделить символы, используйте "_".
Цитата Сообщение от Rosherh Посмотреть сообщение
про Select я и забыл, хотя из этого и получилось все, что мне надо, да и не помню, куда и где его прописывать надо!
"Незнал, забыл и вспомнить не могу..."
Delphi
1
ADOQuery.sql
1
1 / 1 / 0
Регистрация: 29.09.2013
Сообщений: 50
17.10.2013, 15:39  [ТС] 12
Цитата Сообщение от Mawrat Посмотреть сообщение
Rosherh, возможно, следующие коды окажутся полезными.

1. Как передать в MS Excel набор данных, представленный экземпляром потомка TDataSet (TTable, TQuery, TADOTable, TADOQuery и т. д.) или, используя TDBGrid, который связан с потомком от TDataSet.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//Перенос всей таблицы БД на лист MS Excel.
procedure TForm1.Button1Click(Sender: TObject);
const
  //Идентификатор типа ячейки в диапазоне - последняя (справа внизу) ячейка диапазона.
  xlCellTypeLastCell = 11;
  //Вид смещения - вверх.
  xlShiftUp = -4162;
  //Тип линий.
  xlContinuous = 1;
  //Толщина линий.
  xlMedium = -4138;
  xlThick = 4;
  xlThin = 2;
var
  exCell1, exRng : Variant;
  i, Row : Integer;
  Bm : TBookmark;
begin
  //Проверка подключения к MS Excel.
  if VarIsClear(gExSh) then begin
    MessageBox(0, 'Нет подключения к MS Excel. Действие отменено.',
      'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  //Проверка подключения к таблице БД.
  if not ADOQuery1.Active then begin
    MessageBox(0, 'Таблица БД закрыта. Действие отменено.',
      'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  //Проверка таблицы БД на пустоту.
  if ADOQuery1.Eof then begin
    MessageBox(0, 'Таблица БД пуста. Действие отменено.',
      'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  {Верхняя левая ячейка таблицы Excel. Предположим, нам надо, чтобы её координаты
  были такими: "$B$3". Т. е., номер столбца = 2, номер строки = 3.}
  exCell1 := gExSh.Cells[3, 2];
  //Определяем номер нижней строки в области, которая уже используется на листе MS Excel.
  Row := gExSh.UsedRange.SpecialCells(xlCellTypeLastCell).Row;
  {Удаление прежних данных.
  Если номер нижней строки равен или больше номера строки, на которой расположена
  ячейка exCell1, то, значит, таблица уже содержит данные. В этом случае
  эти данные мы удаляем.}
  if Row >= exCell1.Row then begin
    //Диапазон таблицы.
    exRng := gExSh.Range[exCell1,
      exCell1.Offset[Row - exCell1.Row + 1, ADOQuery1.FieldCount - 1]];
    //Удаление диапазона со сдвигом вверх.
    exRng.Delete(xlShiftUp);
  end;
 
  //Записываем шапку таблицы над областью данных.
  for i := 0 to ADOQuery1.FieldCount - 1 do
    exCell1.Offset[0, i].Value := ADOQuery1.Fields[i].DisplayName;
  //Записываем данные таблицы БД на лист MS Excel.
  Bm := ADOQuery1.GetBookmark; //Запоминаем текущую позицию в таблице БД.
  ADOQuery1.DisableControls; //Отключаем набор данных от элементов управления.
  ADOQuery1.First; //Переход к первой записи таблицы.
  //Теперь перебираем все записи таблицы и передаём их на лист Excel.
  Row := 0;
  while not ADOQuery1.Eof do begin
    Inc(Row);
    for i := 0 to ADOQuery1.FieldCount - 1 do
      exCell1.Offset[Row, i].Value := ADOQuery1.Fields[i].AsString;
    ADOQuery1.Next;
  end;
  //Возвращаемся на прежнюю позицию в наборе данных.
  ADOQuery1.GotoBookmark(Bm);
  //Подключаем элементы управления.
  ADOQuery1.EnableControls;
 
  //Весь диапазон таблицы (шапка и данные).
  exRng := gExSh.Range[exCell1, exCell1.Offset[Row, ADOQuery1.FieldCount - 1]];
  //Обрамление диапазона.
  exRng.Borders.LineStyle := xlContinuous;
  exRng.Borders.Weight := xlThin;
  //Оформление шапки.
  exRng.Rows[1].Borders.Weight := xlMedium;
  exRng.Rows[1].Font.Bold := True; //Шрифт жирный.
  //Автоматический подбор ширины столбцов для всей таблицы.
  exRng.Columns.AutoFit;
end;
2. Ещё пример - передача набора данных на лист MS Excel с учётом сведений из связанного DBGrid: bd и нажатие кнопки. Как выбирать разные файлы БД для подключения?
Благодарю! =) У меня вопрос, не подскажешь, как можно осуществить задуманное?!
Мне нужно вывести в Excel лишь одну запись, выбранную из списка (DBGrid)!
Отталкиваюсь от
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Var
ExcelApp2,Sheet,Colum:Variant;
index,i:Integer;
begin
 ExcelApp2:= CreateOleObject('Excel.Application');  // Создание OLE-объекта.
 ExcelApp2.Application.EnableEvents := false;
 ExcelApp2.Workbooks.Add(GetCurrentDir() + '\Документы\Личная карточка клиента.xlt');
 ExcelApp2.Workbooks[1].WorkSheets[1].Name:='Личная карточка клиента';
 ExcelApp2.DisplayAlerts := False;
 
 Sheet:=ExcelApp2.Workbooks[1].WorkSheets['Личная карточка клиента'];
 
 index:=20;
 ADOTable_Clients.First;
 for i:=1 to ADOTable_Clients.RecordCount-1 do
  begin
   Sheet.Cells[index,3]:=ADOTable_Clients.Fields.Fields[1].AsString;
   Sheet.Cells[index,6]:=ADOTable_Clients.Fields.Fields[2].AsString;
   Sheet.Cells[index,9]:=ADOTable_Clients.Fields.Fields[3].AsString;
   Inc(index);
   ADOTable_Clients.Next;
  end;
  ExcelApp2.Visible := True;
Заранее спасибо!
0
1 / 1 / 0
Регистрация: 29.09.2013
Сообщений: 50
18.10.2013, 16:51  [ТС] 13
Цитата Сообщение от ZfoxAK Посмотреть сообщение
"Незнал, забыл и вспомнить не могу..."
У меня вопрос, не подскажешь, как можно осуществить задуманное?!
Мне нужно вывести в Excel лишь одну запись, выбранную из списка (DBGrid)!
Отталкиваюсь от

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Var
ExcelApp2,Sheet,Colum:Variant;
index,i:Integer;
begin
 ExcelApp2:= CreateOleObject('Excel.Application'); *// Создание OLE-объекта.
 ExcelApp2.Application.EnableEvents := false;
 ExcelApp2.Workbooks.Add(GetCurrentDir() + '\Документы\Личная карточка клиента.xlt');
 ExcelApp2.Workbooks[1].WorkSheets[1].Name:='Личная карточка клиента';
 ExcelApp2.DisplayAlerts := False;
Sheet:=ExcelApp2.Workbooks[1].WorkSheets['Личная карточка клиента'];
index:=20;
 ADOTable_Clients.First;
 for i:=1 to ADOTable_Clients.RecordCount-1 do
 begin
  Sheet.Cells[index,3]:=ADOTable_Clients.Fields.Fields[1].AsString;
  Sheet.Cells[index,6]:=ADOTable_Clients.Fields.Fields[2].AsString;
  Sheet.Cells[index,9]:=ADOTable_Clients.Fields.Fields[3].AsString;
  Inc(index);
  ADOTable_Clients.Next;
 end;
 ExcelApp2.Visible := True;
0
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
18.10.2013, 20:57 14
Цитата Сообщение от Rosherh Посмотреть сообщение
Delphi
1
 Sheet.Cells[index,3]:=ADOTable_Clients.Fields.Fields[1].AsString; // здесь записывается в ячейку [2,3] значения поля 1 текущей записи
Я думаю должно быть теперь понятно.
0
1 / 1 / 0
Регистрация: 29.09.2013
Сообщений: 50
22.10.2013, 12:24  [ТС] 15
Цитата Сообщение от ZfoxAK Посмотреть сообщение
Я думаю должно быть теперь понятно.
Ты не правильно понял.. У меня имеется информация на одной строке в три столбика..

Мне нужно вывести ту строку, на которую я укажу, так же в три столбика!

Например:
1 столбец 2 столбец 3 столбец.
Петров Петр Петрович
Лоренов Иван Иванович

Укажу на вторую строку записи, нажму на "личная карточка клиента" и выведется только она в excel!
0
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
23.10.2013, 07:35 16
Это вы не поняли. В укзаной мной строке из Вашего кода все есть, что бы вывести данные в Excel. Стоит только применить головной мозг.
Цитата Сообщение от Rosherh Посмотреть сообщение
Sheet.Cells[index,3]:=
- здесь происходит внесение данных в укзанную вами ячейку [index,3] Екселя.
Цитата Сообщение от Rosherh Посмотреть сообщение
ADOTable_Clients.Fields.Fields[1].AsString;
- этот код предоставляет доступ к данным в текущей "строке", к полю с номером "1".
0
23.10.2013, 07:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2013, 07:35
Помогаю со студенческими работами здесь

Вывод из DBGrid в Excel
Добрый день, подскажите пожалуйста как сделать вывод из dbgrid в exсel корректным? У меня сейчас...

Вывод из dbgrid в excel
Ребят, подскажите, как из dbgrid вывести данные в excel в delphi 2010?

Вывод из DBGrid в Excel
procedure TForm1.SpeedButton1Click(Sender: TObject); var ExcelApp : variant; row :integer; col,...

Вывод из DBGrid в Excel
procedure TForm4.Button6Click(Sender: TObject); var ExcelApp : variant; row :integer; col,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru