Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail



Ответ
 
Опции темы
Старый 08.12.2016, 07:53   #1
cw82
Форумчанин
 
Аватар для cw82
 
Регистрация: 14.10.2010
Сообщений: 52
Репутация: 10
По умолчанию Экспорт в Эксель

Прошу сильно не пинать... Честно стырил в инете код экспорта в эксель, но не могу разобраться в чем дело... В общем все происходит хорошо но заголовка последнего столбца в Экселе нету. Сам столбец и данные в нем есть а вот заголовка нет.
Код:

procedure TForm2.Button3Click(Sender: TObject);
var
ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData  : OLEVariant;
BeginCol, BeginRow, RowCount, ColCount, i, j, k: integer;
begin

 SaveDialog1.DefaultExt :='xlsx';
 if not SaveDialog1.Execute then Exit;
  // Координаты левого верхнего угла области, в которую будем выводить данные
  BeginCol := 1;
  BeginRow := 2;    

  // Создание экземпляра Excel
  ExcelApp := CreateOleObject('Excel.Application');
  try
  // Отключаем реакцию Excel на события, чтобы ускорить вывод информации
  ExcelApp.Application.EnableEvents := False;
  //  Создаем Книгу (Workbook)
  Workbook := ExcelApp.WorkBooks.Add;
    if RadioButton1.Checked=True then
    begin
  // Размеры выводимого массива данных
  RowCount := ADOQuery1.RecordCount;
  ColCount := ADOQuery1.FieldCount;
  end ;

  // Создаем Вариантный Массив, который заполним выходными данными
  ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);
 ADOQuery1.First;
 ADOQuery1.DisableControls;

 i :=0;
// экспорт  заголовка таблицы (шапки)

for k :=1 to Form2.DBGridEh1.FieldCount do
if Form2.DBGridEh1.Columns.Items[k-1].Visible then
 begin
  i :=i+1;
  ExcelApp.cells[1,i] :=Form2.DBGridEh1.Columns.Items[k-2].Title.caption;   
 end;
  //параметры шрифта заголовка

  WorkBook.WorkSheets[1].Rows[1].Font.Bold := True;
  WorkBook.WorkSheets[1].Rows[1].Font.Color := clRed;
  WorkBook.WorkSheets[1].Rows[1].Font.Size := 12;
   // Выравниваем заголовок по центру по горизонтали
  WorkBook.WorkSheets[1].Rows[1].HorizontalAlignment := 3;


//экспорт данных
    //While not Form2.DBGridEh1.EOF do
 While not ADOQuery1.EOF do
   Begin
    For j := 1 To  ADOQuery1.Fields.Count do
       //For j := 1 To  Form2.DBGridEh1.Columns.Count do
       Begin
           ArrayData[ ADOQuery1.RecNo, j] :=
             ADOQuery1.FieldbyName( ADOQuery1.Fields[j - 1].FieldName).value;
       End;
        ADOQuery1.Next;
end;
 ADOQuery1.EnableControls;
  ExcelApp.cells[1,1].Select;//перенесем курсор Excel'а в первую ячейку

  // Левая верхняя ячейка области, в которую будем выводить данные
  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;
    Range.HorizontalAlignment :=2; //выравниваем по левому краю содержимое ячеек
  ExcelApp.Columns.AutoFit; //автоподбор ширины колонок
          //Выставляем все границы
  Range.Borders.LineStyle :=1; //тип линии обрамления
  Range.Borders.Weight :=2;  //толщина линий (тонкие)
  //ориентация - альбомная
  ExcelApp.ActiveSheet.PageSetup.Orientation := 2;
 ADOQuery1.First;//возвращаем курсор на первую запись
   Workbook.SaveAs(SaveDialog1.FileName); //сохраняем документ
   finally

  //отвязываем Excel
  Workbook.Close(SaveChanges :=False);
  ExcelApp.Quit;
  ExcelApp := Unassigned;
   end;
        end;

Если в строке
Код:

  ExcelApp.cells[1,i] :=Form2.DBGridEh1.Columns.Items[k-2].Title.caption;

Ставлю k-1 то не отображает заголовок поля key , если k-2 то заголовок key вижу, но заголовока последнего столбика нет...
Какую строчку подправить чтобы було и key и последний заголовок. Или как сделать чтобы поля key вообще не было?
cw82 вне форума   Ответить с цитированием
Старый 08.12.2016, 19:07   #2
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 127
Репутация: 74
По умолчанию

Цитата:
Сообщение от cw82 Посмотреть сообщение
Код:

for k :=1 to Form2.DBGridEh1.FieldCount do
if Form2.DBGridEh1.Columns.Items[k-1].Visible then
 begin
  i :=i+1;
  ExcelApp.cells[1,i] :=Form2.DBGridEh1.Columns.Items[k-2].Title.caption;   
 end

У Вас при первой же итерации Item[-1] и работает?
Replicant вне форума   Ответить с цитированием
Старый 09.12.2016, 07:14   #3
cw82
Форумчанин
 
Аватар для cw82
 
Регистрация: 14.10.2010
Сообщений: 52
Репутация: 10
По умолчанию

Вопрос не понял. Все работает, только вот заголовка 8 столбца нет.
cw82 вне форума   Ответить с цитированием
Старый 09.12.2016, 10:13   #4
Aleksandr H.
Профессионал
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Адрес: Wild West Ukraine
Сообщений: 1,416
Репутация: 529

icq: 86-069-220
skype: aleksandr.gryb
По умолчанию

и все же, почему -2 ?
Код:

ExcelApp.cells[1,i] :=Form2.DBGridEh1.Columns.Items[k-2].Title.caption;

Заголовки выводятся от 1 к 7-му, или же от 2 к 8му?

upd. пардон, не дочитал до конца.
А цикл до Form2.DBGridEh1.FieldCount+1 пускали?
__________________
Wix-Filters.A Filter For Every Application.
"спасибо" принимаются на webmoney: R676842461689, Z243088649038, U164738001305; QIWI: 38O97935I3O8; ПриватБанк.UA
Aleksandr H. на форуме   Ответить с цитированием
Старый 09.12.2016, 11:12   #5
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,103
Репутация: 1843
По умолчанию

1.
Код:

for k :=1 to Form2.DBGridEh1.FieldCount do

число полей (Fieldcount) вполне может быть МЕНЬШЕ чем число колонок (Colcount)(или columns.count) !!!
да-да некоторые колонки вполне могут не иметь относящихся к ним полей.
и последние колонки не будут скопированы.
да и индексы полей и колонок в общем случае вовсе не совпадают.
вполне может быть field[i] <> Columns.Item[i].field

2.
Код:

if Form2.DBGridEh1.Columns.Items[k-1].Visible then
 begin
  i :=i+1;
  ExcelApp.cells[1,i] :=Form2.DBGridEh1.Columns.Items[k-2].Title.caption;   
 end

если какая-то колонка(k-1) видна то копировать название ПРЕДЫДУЩЕЙ ((k-1)-1){=k-2} колонки.
и опять последнюю колонку мы так и не увидим.

Цитата:
У Вас при первой же итерации Item[-1] и работает?
первая(нулевая) колонка не видна, вот все и работает.
работает, так что даже не заметил что скопированы НЕ ТЕ заголовки.
первый заголовок должен быть от скрытой колонки!!
__________________
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 09.12.2016 в 11:25.
evg_m на форуме   Ответить с цитированием
Старый 12.12.2016, 08:18   #6
cw82
Форумчанин
 
Аватар для cw82
 
Регистрация: 14.10.2010
Сообщений: 52
Репутация: 10
По умолчанию

Спасибо всем кто откликнулся. К сожалению я еще не дорос чтобы понять ваши коментарии... Вернее что то понял , что то понял не так... В общем сделал вот так и все наладилось. Экспортирует как надо.
Код:

for k :=1 to Form2.DBGridEh1.FieldCount do
//if Form2.DBGridEh1.Columns.Items[k-1].Visible then
 begin
  i :=i+1;
  ExcelApp.cells[1,i] :=Form2.DBGridEh1.Columns.Items[k-1].Title.caption;
 end;

cw82 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экспорт таблицы в эксель по 65 536 строк tibhar940 Microsoft Office Access 4 15.01.2013 02:55
Позиция в DBLookUpComboBox и экспорт в эксель mejikuu БД в Delphi 1 24.02.2012 21:27
Эксель + Интернет ( экспорт данных) ShamanK Microsoft Office Excel 1 16.10.2009 13:23
экспорт отчетов аксесс в эксель с полным форматированием kate158 Помощь студентам 1 11.03.2009 18:52
Экспорт в эксель (использование формул) sashaslam Общие вопросы Delphi 2 06.02.2009 13:21




14:46.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
таргетированный трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru