Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/138: Рейтинг темы: голосов - 138, средняя оценка - 4.76
 Аватар для Anest Tasanta
1 / 1 / 0
Регистрация: 10.04.2009
Сообщений: 14

Excel и С++ Builder

10.04.2009, 07:06. Показов 25475. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, проблема такая:

Есть программа на С++, которая копирует файлы...
Как сделать так, чтобы отчет о выполнении сохранялся в .xls? Записывалось имя файла и дату копирования.
Даже не знаю как подойти. Пишите пожалуйста подробно
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.04.2009, 07:06
Ответы с готовыми решениями:

Cpp builder-Ole-Excel. WideString пишет в ячейку Excel минус перед нулем
Здравствуйте! Посмотрите пожалуйста: Когда аргумент val == 0, в ячейку Excel пишется "-0". Без WideString все нормально - в...

Builder and Excel
Чуваки, я извиняюсь))) Помощь нужна) Заключительные штришки остались) Значит такс, есть форма. На ней, я выбираю преподавателей,...

C++ Builder и Excel
Здравстуйте. Задание: написать программу, которая считывает данные из txt-файла и по ним формирует отчет в Excel. Программа...

41
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.04.2009, 10:09
пример выгрузки данных в эксель:
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
    TOraQuery* Query1 = new TOraQuery(NULL);
    Query1->Session = DbManager->Session;
    Query1->SQL->Clear();
    Query1->SQL->Add("SELECT * FROM DOG_DSL WHERE CNT = '" + DSrc->DataSet->FieldByName("CNT")->AsString + "'");
    RangePtr my_range;
    AnsiString r = "";
    TExcelApplication* ExcelApplication1 = new TExcelApplication(NULL);
    TExcelWorkbook* ExcelWorkbook1 = new TExcelWorkbook(NULL);
    TExcelWorksheet* ExcelWorksheet1 = new TExcelWorksheet(NULL);
    try{
      Query1->Open();
      RangePtr my_range;
      char s[16];
      AnsiString r = "";
      // connect to Excel
      ExcelApplication1->Connect();
      // add a workbook
      ExcelApplication1->Workbooks->Add();
      // open the workbook
      ExcelWorkbook1->ConnectTo(ExcelApplication1->Workbooks->get_Item(TVariant(1)));
      ExcelWorkbook1->Activate(0);
      // open the workbook to the first worksheet
      ExcelWorksheet1->ConnectTo(ExcelWorkbook1->Sheets->get_Item(TVariant(1)));
      ExcelWorksheet1->Activate(0);
      // insert field names into the worksheet
      for(int i = 0; i < Query1->FieldCount; i++){
        r = xlRCtoA1(1, i + 1);
        // get the range and iterate through its cells while inserting field names
        my_range = ExcelWorksheet1->get_Range(TVariant("A1"), TVariant(r));
        my_range = my_range->get_Cells()->get_Item(TVariant(1), TVariant(i + 1));
        my_range->set_Value(TVariant(Query1->Fields->Fields[i]->FieldName.c_str()));
      }
      // insert data into the worksheet
      while(!Query1->Eof){
        for(int i = 0; i < Query1->FieldCount; i++){
          r = xlRCtoA1(2, i + 1);
          // get the range and iterate through its cells while inserting data
          my_range = ExcelWorksheet1->get_Range(TVariant("A1"), TVariant(r));
          my_range = my_range->get_Cells()->get_Item(TVariant(2), TVariant(i + 1));
          if(Query1->Fields->Fields[i]->DataType != ftDateTime)
            my_range->set_NumberFormat(TVariant("@"));
          my_range->set_Value(TVariant(Query1->Fields->Fields[i]->AsString.c_str()));
        }
        if(!Query1->Eof)
          Query1->Next();
      }
      Query1->Close();
      delete my_range;
      ExcelWorksheet1->Disconnect();
      delete ExcelWorksheet1;
      AnsiString S = Application->ExeName.SubString(1, Application->ExeName.LastDelimiter("\\") - 1) + "[URL="file://\\docs\\record.xls"]\\docs\\record.xls[/URL]";
      // save the workbook with an user-given filename
      ExcelWorkbook1->Close(TVariant(true), TVariant(S), TNoParam(), LOCALE_USER_DEFAULT);
      ExcelWorkbook1->Disconnect();
      delete ExcelWorkbook1;
      // disconnect from Excel
      ExcelApplication1->Quit();
      ExcelApplication1->Disconnect();
      delete ExcelApplication1;
    }catch(...){}
    delete Query1;
0
146 / 129 / 6
Регистрация: 29.07.2008
Сообщений: 506
10.04.2009, 21:14
WooDooMan, может есть какой материал(ссылка) на тему выгрузки данных в эксель?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
11.04.2009, 10:11
у меня были сцылы по работе с экселем, но в дельфи, скажу тебе, мало чем поможет, сильно уж отличаются они... вообще полезно сначала написать скрипт в вба. а в билдере методы те же будут, но с учетом синтаксиса, понятное дело
0
 Аватар для Anest Tasanta
1 / 1 / 0
Регистрация: 10.04.2009
Сообщений: 14
13.04.2009, 03:32  [ТС]
YAUHEN
http://rxlib.ru/WinLesson/bles1.htm

А у меня такой код...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Variant app ;
Variant books ;
Variant book ;
Variant sheet ;
 
app = CreateOleObject("Excel.Application");
app.OlePropertySet("Visible", 0);
books = app.OlePropertyGet("Workbooks");
books.Exec(Procedure("Open")<<"c:\\1.xlsx");
book = books.OlePropertyGet("item",1);
sheet= book.OlePropertyGet("WorkSheets",1);
 
app.OlePropertyGet("WorkSheets",1).OleProcedure("SaveAs","c:\\1.xlsx");
app.OleProcedure("Quit");
Не знаю как вписать данные в ячейки...
0
0 / 0 / 1
Регистрация: 03.06.2009
Сообщений: 19
06.06.2009, 18:29
Цитата Сообщение от VoodooMan Посмотреть сообщение
пример выгрузки данных в эксель:
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
    TOraQuery* Query1 = new TOraQuery(NULL);
    Query1->Session = DbManager->Session;
    Query1->SQL->Clear();
    Query1->SQL->Add("SELECT * FROM DOG_DSL WHERE CNT = '" + DSrc->DataSet->FieldByName("CNT")->AsString + "'");
    RangePtr my_range;
    AnsiString r = "";
    TExcelApplication* ExcelApplication1 = new TExcelApplication(NULL);
    TExcelWorkbook* ExcelWorkbook1 = new TExcelWorkbook(NULL);
    TExcelWorksheet* ExcelWorksheet1 = new TExcelWorksheet(NULL);
    try{
      Query1->Open();
      RangePtr my_range;
      char s[16];
      AnsiString r = "";
      // connect to Excel
      ExcelApplication1->Connect();
      // add a workbook
      ExcelApplication1->Workbooks->Add();
      // open the workbook
      ExcelWorkbook1->ConnectTo(ExcelApplication1->Workbooks->get_Item(TVariant(1)));
      ExcelWorkbook1->Activate(0);
      // open the workbook to the first worksheet
      ExcelWorksheet1->ConnectTo(ExcelWorkbook1->Sheets->get_Item(TVariant(1)));
      ExcelWorksheet1->Activate(0);
      // insert field names into the worksheet
      for(int i = 0; i < Query1->FieldCount; i++){
        r = xlRCtoA1(1, i + 1);
        // get the range and iterate through its cells while inserting field names
        my_range = ExcelWorksheet1->get_Range(TVariant("A1"), TVariant(r));
        my_range = my_range->get_Cells()->get_Item(TVariant(1), TVariant(i + 1));
        my_range->set_Value(TVariant(Query1->Fields->Fields[i]->FieldName.c_str()));
      }
      // insert data into the worksheet
      while(!Query1->Eof){
        for(int i = 0; i < Query1->FieldCount; i++){
          r = xlRCtoA1(2, i + 1);
          // get the range and iterate through its cells while inserting data
          my_range = ExcelWorksheet1->get_Range(TVariant("A1"), TVariant(r));
          my_range = my_range->get_Cells()->get_Item(TVariant(2), TVariant(i + 1));
          if(Query1->Fields->Fields[i]->DataType != ftDateTime)
            my_range->set_NumberFormat(TVariant("@"));
          my_range->set_Value(TVariant(Query1->Fields->Fields[i]->AsString.c_str()));
        }
        if(!Query1->Eof)
          Query1->Next();
      }
      Query1->Close();
      delete my_range;
      ExcelWorksheet1->Disconnect();
      delete ExcelWorksheet1;
      AnsiString S = Application->ExeName.SubString(1, Application->ExeName.LastDelimiter("\\") - 1) + "[URL="file://\\docs\\record.xls"]\\docs\\record.xls[/URL]";
      // save the workbook with an user-given filename
      ExcelWorkbook1->Close(TVariant(true), TVariant(S), TNoParam(), LOCALE_USER_DEFAULT);
      ExcelWorkbook1->Disconnect();
      delete ExcelWorkbook1;
      // disconnect from Excel
      ExcelApplication1->Quit();
      ExcelApplication1->Disconnect();
      delete ExcelApplication1;
    }catch(...){}
    delete Query1;

а содержимое header - файла не бросиш?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
07.06.2009, 10:58
#include <OleServer.hpp>
#include <Excel_2K_SRVR.h>
0
0 / 0 / 1
Регистрация: 03.06.2009
Сообщений: 19
07.06.2009, 17:41
VoodooMan
а не можеш саму прогу бросить с проэктом (рабочий вариант)? Пожалуйста
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
07.06.2009, 18:08
Atilla_360, а что у тебя не получается, проект скинуть не могу
0
0 / 0 / 1
Регистрация: 03.06.2009
Сообщений: 19
07.06.2009, 18:12
та никак не могу реализовать считку с бази mysql в ексель

Добавлено через 2 минуты 23 секунды
ты используеш функции get_Range, set_Value и тд. а описания их нет
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
07.06.2009, 18:13
ну а конкретнее, ошибки какие или что не работает
0
0 / 0 / 1
Регистрация: 03.06.2009
Сообщений: 19
07.06.2009, 18:27
1) что такое RangePtr my_range; билдер не знает
2) и те функции (get_Range, set_Value) - они в твоем примере не описаны
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
07.06.2009, 18:32
а ты хидеры прописал? а еще тебе надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
AnsiString xlRCtoA1(int ARow, int ACol, bool RowAbsolute, bool ColAbsolute)
{
  int A1 = CHAR('A') - 1;  // номер "A" минус 1 (65 - 1 = 64)
  int AZ = CHAR('Z') - A1; // кол-во букв в англ. алфавите (90 - 64 = 26)
  int t, m;
  AnsiString S; // чтоб экономить память IV=256 последний столбец
  // номер колонки
  t = div(ACol, AZ).quot; // целая часть
  m = div(ACol, AZ).rem; // остаток?
  if(m == 0) t--;
  if (t > 0) S = AnsiString(CHAR(A1 + t)); else S = "";
  if(m == 0) t = AZ; else t = m;
  S = S + Char(A1 + t);
  // весь адрес
  if(ColAbsolute) S = "$" + S;
  if(RowAbsolute) S = S + "$";
  S = S + IntToStr(ARow);
  return S;
}
0
0 / 0 / 1
Регистрация: 03.06.2009
Сообщений: 19
07.06.2009, 18:40
шо то все равно не то
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
07.06.2009, 18:43
покажи свой проект. подправлю
0
0 / 0 / 1
Регистрация: 03.06.2009
Сообщений: 19
07.06.2009, 19:54
вот содержание .cpp файла

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
#include <vcl.h>
#pragma hdrstop
#include <OleServer.hpp>
#include <utilcls.h>
 
 
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bToExcelClick(TObject *Sender)
{
 MakeReport();
 Button1->Visible=true;
}
//---------------------------------------------------------------------------
void TForm1::MakeReport()
{
    // запускаем Excel
    ExcelInit("");
    if (CheckBox1->Checked)
    { // делаем его видимым
    if(!App.IsEmpty())App.OlePropertySet("Visible",true);}
}
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
AnsiString in = (InputBox("Borland C++ Builder", "Введите имя файла: ", ""));
 
// сохраняем его на диске 
    try{
 
      App.OlePropertyGet("WorkBooks",1).OleProcedure("SaveAs", in.c_str() );
      }catch(...){
         ShowMessage("Не забудьте сохранить сделанные изменения !");
         }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
mem->Clear();
 
// добавляем информацию для имён колонок
AnsiString sline = "";
for(int col = 0; col < DBGrid1->FieldCount; ++col)
{
      sline += DBGrid1->Fields[col]->DisplayLabel + (char)9;
}
 
mem->Lines->Add(sline);
 
// получаем данные из memo
   for(int row = 0; row < DBGrid1->DataSource->DataSet->RecordCount; ++row)
   {
      sline = "";
      for(int col = 0; col < DBGrid1->FieldCount; ++col)
      {
         sline += DBGrid1->Fields[col]->AsString + (char)9;
      }
      mem->Lines->Add(sline);
      DBGrid1->DataSource->DataSet->Next();
   }
 
// копируем данные в буфер обмена (clipboard)
mem->SelectAll();
mem->CopyToClipboard();
 
Sh.OleProcedure("Paste");
 
 
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::ExcelInit(String File)
{
  // если Excel запущен - подключиться к нему 
  try {
   App=Variant::GetActiveObject("Excel.Application");
  } catch(...) {
     // Excel не запущен - запустить его
     try { App=Variant::CreateObject("Excel.Application"); } catch (...) {
      Application->MessageBox("Невозможно открыть Microsoft Excel!"
      "Возможно Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);
  } }
  try {
    if(File!="")
     App.OlePropertyGet("WorkBooks").OleProcedure("Open",File.c_str());
    else
     App.OlePropertyGet("WorkBooks").OleProcedure("add");
 
    Sh=App.OlePropertyGet("WorkSheets",1);
  } catch(...) {
    Application->MessageBox("Ошибка открытия книги Microsoft Excel!",
                                         "Ошибка",MB_OK+MB_ICONERROR);
  }
}/* ExcelInit() */
//-------------------------------------
 
 
 
 
 
void __fastcall TForm1::toExcelCell(int Row,int Column, AnsiString data)
{
  try {
    Variant  cur = Sh.OlePropertyGet("Cells", Row,Column);
    cur.OlePropertySet("Value", data.c_str());
  } catch(...) { ; }
}/* toExcelCell() */
//------------------------------------------------------------------------
 
 
 
 
 
 
void __fastcall TForm1::toExcelCell(int Row,int Column, Variant data)
{
  try {
    Variant  cur = Sh.OlePropertyGet("Cells", Row,Column);
    cur.OlePropertySet("Value", data);
  } catch(...) { ; }
}/* toExcelCell() */
void __fastcall TForm1::formulaExcel(int sRow, int sColumn, int row)
{
   try {
    App.OlePropertyGet("Cells", sRow, sColumn).OlePropertySet("FormulaR1C1", 
                        ("=СУММ(R[-"+AnsiString(row)+"]C:R[-1]C)").c_str());
  } catch(...) { ; }
}/* formulaExcel() */
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// можем при желании и сразу закрыть, если закрывать не нужно - удалите этот блок
     //---
     try{
       App.OlePropertyGet("WorkBooks",1).OleProcedure("Close");
       }catch(...){
          ShowMessage("Не забудьте сами закрыть Excel.");
      }
     //---
 
    // освобождаем ресурсы
    Sh.Clear();
    App.Clear();
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Button4Click(TObject *Sender)
{
//
AnsiString  CellName = "" , CellText = "";
 
unsigned short int Row_Counter = 6 , Column_Counter = 0;
//AnsiString Set_Cell_Name (0 , 1) ;
 
while (Column_Counter < ADOQuery2->Fields->Count)
       {
     //  CellName = Set_Cell_Name (Column_Counter , 1);
 
        // функция Set_Cell_Name возвращает стринг - название ячейки типа A1 ,B2 и т.д.
 
        CellText = ADOQuery2->Fields->Fields[Column_Counter]->FullName ;
        Sh.OlePropertyGet("Range", CellName).OlePropertySet("Value",CellText);
        Column_Counter++ ;
       }
 
Column_Counter = 0;
ADOQuery2->First();
 
// собственно експорт
while (!ADOQuery2->Eof)
      {
       while (Column_Counter < ADOQuery2->Fields->Count)
              {
        //       CellName = Set_Cell_Name (Column_Counter , Row_Counter);
               CellText = ADOQuery2->Fields->Fields[Column_Counter]->AsString;
 
               Sh.OlePropertyGet("Range", CellName).
                         OlePropertySet("Value",CellText);
 
               Column_Counter++ ;
              }
      Column_Counter = 0;
      Row_Counter ++;
      ADOQuery2->Next();
      }
App.OlePropertySet("WindowState" ,2 );
Form1->WindowState = wsNormal;
 
 
 
}
//---------------------------------------------------------------------------
 
 
 
 
 
 
 
 
void __fastcall TForm1::Button5Click(TObject *Sender)
{
  ADOQuery2->SQL->Clear();
   ADOQuery2->SQL->Add("SELECT * FROM raspisanie");
    RangePtr my_range;
    AnsiString r = "";
 
    try{
      ADOQuery2->Open();
      RangePtr my_range;
      char s[16];
      AnsiString r = "";
 
      // open the workbook to the first worksheet
      Sh->ConnectTo(Book->Sh->get_Item(TVariant(1)));
      Sh->Activate(0);
      // insert field names into the worksheet
      for(int i = 0; i < ADOQuery2->FieldCount; i++){
        r = xlRCtoA1(1, i+1);
        // get the range and iterate through its cells while inserting field names
        my_range = Sh->get_Range(TVariant("A1"), TVariant(r));
        my_range = my_range->get_Cells()->get_Item(TVariant(1), TVariant(i + 1));
        my_range->set_Value(TVariant(ADOQuery2->Fields->Fields[i]->FieldName.c_str()));
      }
      // insert data into the worksheet
      while(!ADOQuery2->Eof){
        for(int i = 0; i < ADOQuery2->FieldCount; i++){
          r = xlRCtoA1(2, i + 1);
          // get the range and iterate through its cells while inserting data
          my_range = Sh->get_Range(TVariant("A1"), TVariant(r));
          my_range = my_range->get_Cells()->get_Item(TVariant(2), TVariant(i + 1));
          if(ADOQuery2->Fields->Fields[i]->DataType != ftDateTime)
          my_range->set_NumberFormat(TVariant("@"));
          my_range->set_Value(TVariant(ADOQuery2->Fields->Fields[i]->AsString.c_str()));
        }
        if(!ADOQuery2->Eof)
          ADOQuery2->Next();
      }
      ADOQuery2->Close();
      delete my_range;
      Sh->Disconnect();
//      delete Sh;
       }
 
}
//---------------------------------------------------------------------------



а вот содержание h файла

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
#ifndef mainH
#define mainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Dialogs.hpp>
#include <ADODB.hpp>
#include <DB.hpp>
#include <DBGrids.hpp>
#include <Grids.hpp>
#include <Sockets.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *bToExcel;
        TButton *Button1;
        TButton *Button2;
        TButton *Button3;
        TADOConnection *ADOConnection1;
        TDBGrid *DBGrid1;
        TDataSource *DataSource1;
        TADOQuery *ADOQuery1;
        TCheckBox *CheckBox1;
        TADOQuery *ADOQuery2;
        TMemo *mem;
        TButton *Button4;
        TButton *Button5;
        void __fastcall bToExcelClick(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
        void __fastcall Button5Click(TObject *Sender);
private:    // User declarations
        void __fastcall ExcelInit(String File);
   //     void __fastcall formulaExcel(int sRow, int sColumn, int row);
        void __fastcall toExcelCell(int c1,int c2, String data);
        void __fastcall toExcelCell(int c1,int c2, Variant data);
 
        Variant App,Sh, Book;
        void MakeReport();
        AnsiString xlRCtoA1(int ARow, int ACol, bool RowAbsolute, bool ColAbsolute)
{
  int A1 = CHAR('A') - 1;  // номер "A" минус 1 (65 - 1 = 64)
  int AZ = CHAR('Z') - A1; // кол-во букв в англ. алфавите (90 - 64 = 26)
  int t, m;
  AnsiString S; // чтоб экономить память IV=256 последний столбец
  // номер колонки
  t = div(ACol, AZ).quot; // целая часть
  m = div(ACol, AZ).rem; // остаток?
  if(m == 0) t--;
  if (t > 0) S = AnsiString(CHAR(A1 + t)); else S = "";
  if(m == 0) t = AZ; else t = m;
  S = S + Char(A1 + t);
  // весь адрес
  if(ColAbsolute) S = "$" + S;
  if(RowAbsolute) S = S + "$";
  S = S + IntToStr(ARow);
  return S;
}
 
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

событие по пятой кнопке

Добавлено через 48 секунд
а именно вот


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
void __fastcall TForm1::Button5Click(TObject *Sender)
{
  ADOQuery2->SQL->Clear();
   ADOQuery2->SQL->Add("SELECT * FROM raspisanie");
    RangePtr my_range;
    AnsiString r = "";
 
    try{
      ADOQuery2->Open();
      RangePtr my_range;
      char s[16];
      AnsiString r = "";
 
      // open the workbook to the first worksheet
      Sh->ConnectTo(Book->Sh->get_Item(TVariant(1)));
      Sh->Activate(0);
      // insert field names into the worksheet
      for(int i = 0; i < ADOQuery2->FieldCount; i++){
        r = xlRCtoA1(1, i+1);
        // get the range and iterate through its cells while inserting field names
        my_range = Sh->get_Range(TVariant("A1"), TVariant(r));
        my_range = my_range->get_Cells()->get_Item(TVariant(1), TVariant(i + 1));
        my_range->set_Value(TVariant(ADOQuery2->Fields->Fields[i]->FieldName.c_str()));
      }
      // insert data into the worksheet
      while(!ADOQuery2->Eof){
        for(int i = 0; i < ADOQuery2->FieldCount; i++){
          r = xlRCtoA1(2, i + 1);
          // get the range and iterate through its cells while inserting data
          my_range = Sh->get_Range(TVariant("A1"), TVariant(r));
          my_range = my_range->get_Cells()->get_Item(TVariant(2), TVariant(i + 1));
          if(ADOQuery2->Fields->Fields[i]->DataType != ftDateTime)
          my_range->set_NumberFormat(TVariant("@"));
          my_range->set_Value(TVariant(ADOQuery2->Fields->Fields[i]->AsString.c_str()));
        }
        if(!ADOQuery2->Eof)
          ADOQuery2->Next();
      }
      ADOQuery2->Close();
      delete my_range;
      Sh->Disconnect();
//      delete Sh;
       }
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
07.06.2009, 20:10
<Excel_2K_SRVR.h> - а самый главный хидер где?
0
0 / 0 / 1
Регистрация: 03.06.2009
Сообщений: 19
07.06.2009, 20:30
а с ним возникают ошибки
типа таких
[C++ Error] ComСrls.hppl2638]: E2015 Ambiguity between Windows' and 'Excel_2k::Windows'
[C++ Error] ComСrls.hpp(2839]: E2015 Ambiguity between Windows' and 'Excel_2k::Windows'
[C++ Error] ComCtrls.hpp(3430): E2015 Ambiguity between 'Menus' and 'Excel_2k::Menus'

Добавлено через 3 минуты 40 секунд
без него ошибки такие

[C++ Error] main.cpp(2201: E2451 Undefined symbol 'RangePlr'
[C++ Error] main.cpp(220): E2379 Statement missing;
[C++ Error] main.cpp(225]: E2379 Statement missing;
[C++ Error] main.cpp(230]: E2233 Pointer to structure required on left side of -> or ->"
[C++ Error] main.cpp(230]: E2233 Pointer to structure required on left side of -> or ->"
[C++ Error] main.cpp(231]: E2288 Pointer to structure required on left side of -> or ->"
[C++ Error] main.cpp(234]: E2193 Too few parameters in call to TForm1::xlRCtoA1(inUnt,bool,bool)'
[C++ Error] main.cpp(23S): E2451 Undefined symbol 'my_range'
[C++ Error] main.cpp(23S): E2288 Pointer to structure required on left side of -> or ->"
[C++ Error] main.cpp(243]: E2193 Too few parameters in call to TForm1::xlRCtoA1(inUnt,bool,bool)'
[C++ Error] main.cpp(245]: E2451 Undefined symbol 'my_range'
[C++ Error] main.cpp(245]: E2288 Pointer to structure required on left side of -> or ->"
[C++ Error] main.cpp(255]: E2451 Undefined symbol 'my_range'
[C++ Error] main.cpp(258): E2288 Pointer to structure required on left side of -> or ->"
[C++ Error] main.cpp(260): E2252 'catch' expected
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
07.06.2009, 20:44
а где ты помещаешь его, вобще надо в cpp
0
0 / 0 / 1
Регистрация: 03.06.2009
Сообщений: 19
07.06.2009, 20:48
в cpp
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2009, 20:48
Помогаю со студенческими работами здесь

Builder+Excel
Здравствуйте! Вот моя программа, которая считывает из excel данные, делает рассчет, записывает данные в новый лист, потом на еще одном...

C++ Builder и Excel
Всем добрый день. Столкнулся с необходимостью использования Excel в программе (для импорта данных и экспорта в .xls файл). На просторах...

Word и Excel в C++ Builder
Всем привет! Заранее скажу, что только начинаю изучать С++ и поэтому буду рад любой помощи. Появилась необходимость с помощью...

Cpp Builder / Excel
Здравствуйте! Пишу приложение &quot;C++ Builder - OLE Excel&quot; Написал такой код для прорисовки таблицы: vVarCell =...

C++ Builder. Из StringGrid в Excel
Доброго времени суток! У меня возникла проблема, нужна ваша помощь. Задание следующее, дан StringGrid в котором фамилии и оценки, при...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru