Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/43: Рейтинг темы: голосов - 43, средняя оценка - 4.63
гость
0 / 0 / 17
Регистрация: 17.04.2015
1

Управление Excel из С++ Builder 6

26.05.2007, 20:18. Просмотров 7857. Ответов 4
Метки нет (Все метки)

Друзья спаите, помогите!!! Нужно написать метод записи строки в ячейку Exsel.

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
class ExServer
{
public:
 
ExServer();
~ExServer();
 
bool ExcelOpen();  //открывает Excel
...
...
bool CellSetString( int x, int y, AnsiString CellText );//заносит строку в ячейку
 
private:
 
Variant var_Excel,
        var_Book,
        var_Books,
        var_Sheet,
        var_Sheets,
        var_Cell;
};
 
 
 
 
ExServer::ExServer()
{
}
 
...
...
...
мой метод не работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Запись в ячейку строки
 
bool ExServer::CellSetString( int x, int y, AnsiString CellText )
{
try
  {
  var_Cell = var_Sheet.OlePropertyGet("Cells").
                        OlePropertyGet("Item",x,y);
  var_Cell.OlePropertySet("Value",CellText);
  return true;
  }
catch(...)
  {
  MessageBox( 0, "Ошибка при записи в ячейку", "Ошибка", MB_OK );
  return false;
  }
}
Я его вызываю
C++
1
2
AnsiString CellText = "Test";
MyExServer->CellSetString( 5, 5, CellText );
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2007, 20:18
Ответы с готовыми решениями:

Управление Word-м из С++ Builder 6
Дали задание в институте научиться управлять MS Word из С++ BUILDER 6 с...

Управление Web-страницей из C++ Builder
Доброго всем времени суток !!! Если кто-то знает, подскажите, пожалуйста,...

Управление роутером средствами C++ Builder
Необходимо создать программу, которая будет управлять роутером (я использую...

Excel и С++ Builder
Ребята, проблема такая: Есть программа на С++, которая копирует файлы......

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

4
Lord_Voodoo
Супер-модератор
8609 / 2240 / 133
Регистрация: 07.03.2007
Сообщений: 10,830
Завершенные тесты: 1
29.05.2007, 12:43 2
а ты не пробывал через TExcelApplication, TExcelBook и TExcelSheet писать?
пример:
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
    TOraQuery* Query1 = new TOraQuery(NULL);
    Query1->Session = DbManager->Session1;
    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();
      ExcelWorksheet1->Disconnect();
      delete ExcelWorksheet1;
      AnsiString S = Application->ExeName.SubString(1, Application->ExeName.LastDelimiter("\") - 1) + "\\docs\\record.xls";
      // 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;
 
//---------------------------------------------------------------------------
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
Dr.Brain
0 / 0 / 0
Регистрация: 26.05.2007
Сообщений: 3
02.06.2007, 23:02 3
Дружище побробуй следующее:
Вместо типа AnsiString использовать тип WideString. Уменя все работает.
0
Lord_Voodoo
Супер-модератор
8609 / 2240 / 133
Регистрация: 07.03.2007
Сообщений: 10,830
Завершенные тесты: 1
03.06.2007, 15:57 4
Цитата Сообщение от Dr.Brain Посмотреть сообщение
Дружище побробуй следующее:
Вместо типа AnsiString использовать тип WideString. Уменя все работает.
Вообще-то сырцы рабочие, поэтому WideString - это уже для любителей
0
гость
0 / 0 / 17
Регистрация: 17.04.2015
26.06.2007, 15:17  [ТС] 5
Оно то работает, но както наворочено и не понятно.
Я сократил и работает точно также:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(SaveDialog2->Execute())
{
RangePtr my_range;
ExcelApplication1->Connect();
ExcelApplication1->Workbooks->Add();
ExcelWorkbook1->ConnectTo(ExcelApplication1->Workbooks->get_Item(TVariant(1)));
ExcelWorkbook1->Activate(0);
ExcelWorksheet1->ConnectTo(ExcelWorkbook1->Worksheets->get_Item(TVariant(1)));
ExcelWorksheet1->Activate(0);
for (int i=0;i</*скока надо*/;i++)
   {
    my_range = ExcelWorksheet1->get_Cells()->get_Item(TVariant(i), TVariant(1));
    my_range->set_Value(TVariant(/*чего покласть*/));
   }
ExcelWorksheet1->Disconnect();
ExcelWorkbook1->Close(TVariant(true), TVariant(SaveDialog2->FileName), TNoParam(), LOCALE_USER_DEFAULT);
ExcelWorkbook1->Disconnect();
ExcelApplication1->Quit();
ExcelApplication1->Disconnect();
}
компоненты можно положить сразу на форму для быстроты
0
26.06.2007, 15:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2007, 15:17

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

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

Builder c++ xe7 Excel
Добрый день, нужна подсказка как получить информацию из ячейки указанного...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru