Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/57: Рейтинг темы: голосов - 57, средняя оценка - 4.61
3 / 3 / 2
Регистрация: 24.09.2009
Сообщений: 81

Экспорт из DBGrid в Excel

05.11.2009, 00:42. Показов 10746. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!!!
кто-нить может подсказать как вывести инфу из DBGrid в excel ???
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.11.2009, 00:42
Ответы с готовыми решениями:

Экспорт из DBGrid в Excel
Ребят все просто, вот код экспорта из ДБгрида в Excel. Но фишка в том что я хочу заносить данные в шаблон но когда пишу вот это Workbook :=...

Экспорт из dbgrid в excel
procedure TForm3.Button5Click(Sender: TObject); var i,j,index: Integer; ExcelApp,sheet: Variant; begin ExcelApp :=...

Экспорт dbgrid в Excel
Здравствуйте,уважаемые эксперты. Есть код который экспортирует информацию из dbgrid в excel. Но экспорт названий столбцов не...

8
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
05.11.2009, 01:07
вот тебе пример:

C++
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
86
87
88
89
90
91
92
  Query1->DatabaseName = Database1->DatabaseName;
  Query1->SQL->Clear();
  Query1->SQL->Add("select income_cd, biz_cd, sum(samt) as s_amt, sum(pdv) as s_pdv, ");
  Query1->SQL->Add("sum(wpdv) as s_wpdv from result where income_cd is not null ");
  Query1->SQL->Add("and (divide = 'ЦТП' or divide = 'Райони') group by income_cd, biz_cd");
  Query2->DatabaseName = Database1->DatabaseName;
  Query2->SQL->Clear();
  Query2->SQL->Add("select distinct income_cd from result where income_cd <> ''");
  AnsiString text = "";
  try{
    Query1->Open();
    Query2->Open();
    ExcelApplication1 = new TExcelApplication(NULL);
    ExcelWorkbook1 = new TExcelWorkbook(NULL);
    ExcelWorksheet1 = new TExcelWorksheet(NULL);
    AnsiString S = Application->ExeName.SubString(1, Application->ExeName.LastDelimiter("\\") - 1) + "\\Balance.xls";
    try{
      Excel_2k::RangePtr my_range, cell;
      NamePtr name;
      AnsiString r = "";
      // connect to Excel
      ExcelApplication1->Connect();
      // open a workbook
      ExcelApplication1->Workbooks->Open(TVariant(S));
      // open the workbook
      ExcelWorkbook1->ConnectTo(ExcelApplication1->get_ActiveWorkbook());
      ExcelWorkbook1->Activate(0);
      // open the workbook to the first worksheet
      ExcelWorksheet1->ConnectTo(ExcelWorkbook1->Sheets->get_Item(TVariant(1)));
      ExcelWorksheet1->Activate(0);
      // insert data into the worksheet
      my_range = ExcelWorksheet1->get_Range(TVariant("A3"), TVariant("A3"));
      my_range->set_VerticalAlignment(TVariant(xlCenter));
      my_range->set_HorizontalAlignment(TVariant(xlCenter));
      my_range->set_Value(TVariant(Months[Ind] + " " + IntToStr(Year_B) + "р."));
      my_range = ExcelWorksheet1->get_Range(TVariant("A4"), TVariant("E44"));
      // clear contents
      cell = ExcelWorksheet1->get_Range(TVariant("C6"), TVariant("E15"));
      cell->ClearContents();
      cell = ExcelWorksheet1->get_Range(TVariant("C17"), TVariant("E26"));
      cell->ClearContents();
      cell = ExcelWorksheet1->get_Range(TVariant("C28"), TVariant("E29"));
      cell->ClearContents();
      cell = ExcelWorksheet1->get_Range(TVariant("C31"), TVariant("E33"));
      cell->ClearContents();
      cell = ExcelWorksheet1->get_Range(TVariant("C35"), TVariant("E39"));
      cell->ClearContents();
      cell = ExcelWorksheet1->get_Range(TVariant("C41"), TVariant("E44"));
      cell->ClearContents();
      AnsiString adress = "";
      while(!Query2->Eof){
        my_range->AutoFilter(TVariant(1), TVariant(Query2->FieldByName("income_cd")->AsInteger),
        xlAnd, TNoParam(),TVariant(false));
        Query1->Filtered = false;
        Query1->Filter = "income_cd = " + Query2->FieldByName("income_cd")->AsString;
        Query1->Filtered = true;
        while(!Query1->Eof){
          cell = my_range->Find(TVariant(Query1->FieldByName("biz_cd")->AsInteger), TNoParam(), TVariant(xlValues),
          TNoParam(), TNoParam(), xlNext, TNoParam(), TNoParam());
          if(cell){
            adress = cell->get_Address(TVariant(false), TVariant(false), xlA1, TNoParam(), TNoParam());
            cell = ExcelWorksheet1->get_Range(TVariant("C" + CutNumber(adress)), TVariant("C" + CutNumber(adress)));
            cell->set_Value(TVariant(""));
            cell->set_Value(TVariant(Query1->FieldByName("s_wpdv")->AsFloat));
            cell = ExcelWorksheet1->get_Range(TVariant("D" + CutNumber(adress)), TVariant("D" + CutNumber(adress)));
            cell->set_Value(TVariant(""));
            cell->set_Value(TVariant(Math_Round(Query1->FieldByName("s_pdv")->AsFloat)));
            cell = ExcelWorksheet1->get_Range(TVariant("E" + CutNumber(adress)), TVariant("E" + CutNumber(adress)));
            cell->set_Value(TVariant(""));
            cell->set_Value(TVariant(Math_Round(Query1->FieldByName("s_amt")->AsFloat)));
          }
          Query1->Next();
        }
        ExcelWorksheet1->set_AutoFilterMode(TVariant(false), 0);
        Query2->Next();
      }
      Query1->Filtered = false;
      Query1->Filter = "";
      Query1->Close();
      Query2->Close();      delete my_range;
      delete cell;
      ExcelWorksheet1->Disconnect();
      delete ExcelWorksheet1;
      // save the workbook with an user-given filename
      ExcelWorkbook1->Close(TVariant(true));
      ExcelWorkbook1->Disconnect();
      delete ExcelWorkbook1;
      // disconnect from Excel
      ExcelApplication1->Quit();
      ExcelApplication1->Disconnect();
      delete ExcelApplication1;
    }catch(...){}
1
3 / 3 / 2
Регистрация: 24.09.2009
Сообщений: 81
05.11.2009, 01:14  [ТС]
спасибо!!!
0
0 / 0 / 0
Регистрация: 08.12.2010
Сообщений: 6
21.01.2011, 19:07
Lord_Voodoo, Мне тоже нужно вывести результат SQL запроса в Excel, можно какой простой пример? Ибо этот у меня не компилируется, спасибо.

Работает !
0
0 / 0 / 0
Регистрация: 26.04.2011
Сообщений: 25
08.05.2011, 18:51
Привет Мне нужно из базы данных в Excel вывести 2 таблицы. Может кто-нибудь знает ссылки, где подробно это все расписано? А то и инете искала, мало чего нашла, да и не совсем понятно. я только учусь...
0
2 / 2 / 0
Регистрация: 18.06.2011
Сообщений: 64
18.06.2011, 17:51
Народ нужна помощь в дописание функции которая будет из DBGrid транслировать
данные в Excel(что бы получить отчет).

DBGrid наполняется с помощью DataSource и через ADOQuery.

Вот то что я смог наваять.. Открывается Excel с нужным мне отчетом потом
считывается строка и тут я всталю Как мне записать все строки DBGrida в Excel
**************************************** *
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
AnsiString Path;
Path=ExtractFilePath(Application->ExeName)+"OT4ET.xls";
Form5->ExcelApplication1->Connect();
Form5->ExcelApplication1->Visible[0]=true; //По кнопке откроет Excel. Т.е
отобразит таблицу.
//Form5->ExcelApplication1->Visible[0]=false;
Form5->ExcelApplication1->Workbooks->Open(StringToOleStr(Path));
//Открытие документа Excel проходит на Ура.. Осталось загрузить данные.
 
 
Form5->DBGrid1->SelectedIndex = 0;
AnsiString l_string;
for (int i = 0; i < Form5->DBGrid1->DataSource->DataSet->RecordCount; i++)
{
l_string = "";
for (int f = 0; f < Form5->DBGrid1->DataSource->DataSet->FieldCount; f++)
{
if ( f > 0 )
l_string+= ", ";
l_string+= Form5->DBGrid1->DataSource->DataSet->Fields->Fields[f]->AsString;
 
}
 
Form5->DBGrid1->DataSource->DataSet->Next();
**************************************** ******
Если не сложно помогите плиз.

Добавлено через 17 минут
Мне небходимо реализовать для Windows а то посмотрел что у тебя UNIX подписано.
0
14 / 14 / 7
Регистрация: 10.01.2011
Сообщений: 146
25.12.2012, 15:34
_BeasT_, я вывожу так
C++
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
 
  try {
   App=Variant::GetActiveObject("Excel.Application");
  } catch(...) {
     try {
          App=Variant::CreateObject("Excel.Application");
          } catch (...)
          {
      Application->MessageBox("Íåâîçìîæíî îòêðûòü Microsoft Excel!"
      "Âîçìîæíî Excel íå óñòàíîâëåí íà êîìïüþòåðå.","Îøèáêà",MB_OK+MB_ICONERROR);
      }
  }
  try {
     App.OlePropertyGet("WorkBooks").OleProcedure("add");
 
    Sh=App.OlePropertyGet("WorkSheets",1);
  } catch(...) {
    Application->MessageBox("Îøèáêà îòêðûòèÿ êíèãè Microsoft Excel!",
                                         "Îøèáêà",MB_OK+MB_ICONERROR);
  }
  for (int i=0;i<((TDBGrid *)(FindComponent("DBGRid"+IntToStr(PageControl1->TabIndex+1))))->DataSource->DataSet->RecordCount;i++)
  {
    for (int y=0;y<((TDBGrid *)(FindComponent("DBGRid"+IntToStr(PageControl1->TabIndex+1))))->DataSource->DataSet->FieldCount;y++)
    {
      try {
        Variant  cur = Sh.OlePropertyGet("Cells", i+1, y+1);
        cur.OlePropertySet("Value", (((TDBGrid *)(FindComponent("DBGRid"+IntToStr(PageControl1->TabIndex+1))))->DataSource->DataSet->Fields->Fields[y]->AsString).c_str());
        }
        catch (...) {;}
    }
    ((TDBGrid *)(FindComponent("DBGRid"+IntToStr(PageControl1->TabIndex+1))))->DataSource->DataSet->Next();
  }
 
  
    if(!App.IsEmpty())App.OlePropertySet("Visible",true);
 
    Sh.Clear();
    App.Clear();
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
27.12.2012, 04:14
Лучший ответ Сообщение было отмечено как решение

Решение

Тоже поделюсь примером. Надеюсь кому поможет.
C++
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
86
87
88
89
90
91
92
93
94
95
96
TDataSet * DataSet = DBGrid1->DataSource->DataSet;
    if (!DataSet->Active)
    try
      {DataSet->Open();}
    catch(...)
      {Application->MessageBox("Ошибка при открытии Набора Данных(DataSet)!","Ошибка", MB_OK + MB_ICONERROR);
       return;}
    Cursor = crHourGlass;
    Variant Excel, Cells;
    try
      {Excel = CreateOleObject("Excel.Application");}
    catch(...)
      {Excel = Unassigned;
       Cursor = crDefault;
       Application->MessageBox("Ошибка при открытии сервера Excel!","Ошибка", MB_OK + MB_ICONERROR);
       return;}
    Excel.OlePropertySet("DisplayAlerts", false);
    Excel.OlePropertySet("Visible",false);
    Excel.OlePropertySet("WindowState",-4137);
 
    try
      {Excel.OlePropertyGet("Workbooks").OleProcedure("Add");}
    catch(...)
      {Excel.OleProcedure("Quit");
       Excel = Unassigned;
       Cursor = crDefault;
       Application->MessageBox("Ошибка при создании книги!","Ошибка", MB_OK + MB_ICONERROR);
       return;}
    
    Cells = Excel.OlePropertyGet("Cells");
    short n(0);//VisibleColumnsCount
    try
     {
      for (int i=0; i < DBGrid1->Columns->Count; i++)
        if (DBGrid1->Columns->Items[i]->Visible)
         {n++;
          Cells.OlePropertyGet("Item",1,n).OlePropertySet("Value", DBGrid1->Columns->Items[i]->Title->Caption.c_str());
          //Горизонтальное выравнивание -> По центру
          Cells.OlePropertyGet("Item", 1, n).OlePropertySet("HorizontalAlignment", -4108);
          //Шрифт -> Жирный
          Cells.OlePropertyGet("Item",1,n).OlePropertyGet("Font").OlePropertySet("Bold", True);
         }
     }
    catch(...)
     {Excel.OleProcedure("Quit");
      if (DataSet->ControlsDisabled()) DataSet->EnableControls();
      Cursor = crDefault;
      Application->MessageBox("Ошибка при передачи данных столбцов!","Ошибка", MB_OK + MB_ICONERROR);
      Excel = Unassigned; Cells = Unassigned;
      return;}
 
    TBookmark  m = DataSet->GetBookmark();
    DataSet->DisableControls();
    DataSet->First();
    try
     {
      while(!DataSet->Eof)
       {n = 0;
        for (int i=0; i < DBGrid1->Columns->Count; i++)
          if (DBGrid1->Columns->Items[i]->Visible)
           {n++;
            Cells.OlePropertyGet("Item",DataSet->RecNo + 1, n).
              OlePropertySet("Value", DBGrid1->Columns->Items[i]->Field->AsString.c_str());
            if (i != 2)
              Cells.OlePropertyGet("Item", DataSet->RecNo + 1, n).OlePropertySet("HorizontalAlignment", -4108);
            else
              //С левого края
              Cells.OlePropertyGet("Item", DataSet->RecNo + 1, n).OlePropertySet("HorizontalAlignment", -4131);
           }
        DataSet->Next();
       }
      //Cтиль линии      
      Excel.OlePropertyGet("Range",Cells.OlePropertyGet("Item", 1, 1),
        Cells.OlePropertyGet("Item", DataSet->RecordCount + 1, n)).
        OlePropertyGet("Borders").OlePropertySet("LineStyle", 1);
     }
    catch(...)
     {Excel.OleProcedure("Quit");
      DataSet->GotoBookmark(m); DataSet->FreeBookmark(m);
      if (DataSet->ControlsDisabled()) DataSet->EnableControls();
      Excel = Unassigned; Cells = Unassigned;
      Cursor = crDefault;
      Application->MessageBox("Ошибка при передачи данных","Ошибка", MB_OK + MB_ICONERROR);
      return;}
    //Ставим АвтоФильтр
    Excel.OlePropertyGet("Range",Cells.OlePropertyGet("Item",1,1),
      Cells.OlePropertyGet("Item",1,n)).OleProcedure("AutoFilter");
    //АвтоФит
    for (int i=1; i <= n; i++)
      Excel.OlePropertyGet("Columns").OlePropertyGet("Item",i).OleProcedure("AutoFit");
    DataSet->GotoBookmark(m); DataSet->FreeBookmark(m);
    if (DataSet->ControlsDisabled()) DataSet->EnableControls();
    Cursor = crDefault;
    Excel.OlePropertySet("Visible",true);
    Excel = Unassigned;
    Cells = Unassigned;
Если помог, поблагодари.
11
2 / 2 / 1
Регистрация: 25.11.2016
Сообщений: 11
17.05.2018, 17:43
Bit_Man, Спасибо, работает хорошо, но есть проблема: данные в ячейках почему-то копируются по половине. Например, есть поле с текстом "Соль", в Excel оно запихивает почему "Со".. И так со всем.
Вот тема Баг при выводе в Excel из DBGrid

Добавлено через 2 часа 18 минут
Решено. Спасибо volvo.
Всё дело в этом:
C++
1
          Cells.OlePropertyGet("Item",1,n).OlePropertySet("Value", WideString(DBGrid1->Columns->Items[i]->Title->Caption));
и в этом:
C++
1
2
            Cells.OlePropertyGet("Item",DataSet->RecNo + 1, n).
              OlePropertySet("Value", WideString(DBGrid1->Columns->Items[i]->Field->AsWideString));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.05.2018, 17:43
Помогаю со студенческими работами здесь

Экспорт из DBGrid в Excel
Помогите, пожалуйста. procedure TForm4.Button3Click(Sender: TObject); var XLA,Sheet,Colum:variant; index,i:integer; begin ...

Экспорт из DBgrid в Excel
Помогите вывести данные из дбгрида в ексель.

Экспорт данных из DBGrid в Excel
Ещё раз доброго времени суток. Вторая проблема заключается, как вы уже поняли из названия темы, в экспорте данных из DBGrid'a (а он...

Экспорт данных из DBGrid в Excel
Имеется код экспорта данных из DBGrid в Excel. Что необходимо добавить в код, чтобы заголовки таблицы тоже выводились в Excel? procedure...

Excel - экспорт выбранной ячейки из DBGrid
Здравствуйте! нужно экспортировать выбранную ячейку из DBGrid в Excel. использую AdoQuery (можно два варианта Adoquery и Adotable). заранее...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru