Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Прошу сильно не пинать... Честно стырил в инете код экспорта в эксель, но не могу разобраться в чем дело... В общем все происходит хорошо но заголовка последнего столбца в Экселе нету. Сам столбец и данные в нем есть а вот заголовка нет.
Код:
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, 18:07   #2
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Цитата:
Сообщение от 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, 06:14   #3
cw82
Пользователь
 
Аватар для cw82
 
Регистрация: 14.10.2010
Сообщений: 52
По умолчанию

Вопрос не понял. Все работает, только вот заголовка 8 столбца нет.
cw82 вне форума Ответить с цитированием
Старый 09.12.2016, 09:13   #4
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

и все же, почему -2 ?
Код:
ExcelApp.cells[1,i] :=Form2.DBGridEh1.Columns.Items[k-2].Title.caption;
Заголовки выводятся от 1 к 7-му, или же от 2 к 8му?

upd. пардон, не дочитал до конца.
А цикл до Form2.DBGridEh1.FieldCount+1 пускали?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 09.12.2016, 10:12   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

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 в 10:25.
evg_m вне форума Ответить с цитированием
Старый 12.12.2016, 07:18   #6
cw82
Пользователь
 
Аватар для cw82
 
Регистрация: 14.10.2010
Сообщений: 52
По умолчанию

Спасибо всем кто откликнулся. К сожалению я еще не дорос чтобы понять ваши коментарии... Вернее что то понял , что то понял не так... В общем сделал вот так и все наладилось. Экспортирует как надо.
Код:
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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экспорт таблицы в эксель по 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 17:52
Экспорт в эксель (использование формул) sashaslam Общие вопросы Delphi 2 06.02.2009 12:21