Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 3
1

excel & builder

12.05.2008, 21:11. Показов 3512. Ответов 1
Метки нет (Все метки)

Я не знаю как с помощью языка С++Builder 6.0 написать приложение, которое могло бы автоматически заполнять ячейки в Microsoft Excel 2003 (Имя_файла.xls).
Ситуация следующая:
На форме следующие компоненты:
DateTimePicker1
Edit1
Edit2
Button1
В документе Microsoft Excel находится следующая таблица:


Дата _________Число1 ____Число2 _______Число1*Число2
02.05.2008 ____150 _______55 ___________8250
03.05.2008 ____140 _______55 ___________7700
04.05.2008 ____90 ________55 ___________4950
05.05.2008 ____125 _______55 ___________6875
06.05.2008 ____110 _______55 ___________6050
07.05.2008 ______________55 ____________0
08.05.2008 ______________55 ____________0
09.05.2008 ______________55 ____________0


И в Button1 прописать следующее:
По дате (DateTimePicker1) найти строку в файле Имя_файла.xls. Потом передать найденной строке в Excel «число1» из Edit1. Готовый полученный в Excel результат вычислений должен появиться (например последний 6050) в компоненте Edit2.
Имя_файла.xls должен сохраняться с новыми данными.
Может быть нужны ещё какие-то компоненты?
Как прописать Button1 (какой код)?

Вот такая задачка у меня. Как решить её не знаю.

Может кому-то легко провернуть такое. Подскажите пожалуйста, буду очень благодарен.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2008, 21:11
Ответы с готовыми решениями:

С++ Builder && VBA Excel
как можно реализовать такое задание: забиваем в билдере матрицу, передаем ее екселю, ексель...

Builder & MatLAB
Привет всем! Скажите кто-нибудь, как связать C++ Builder и MatLAB? чтобы из билдера можно было...

С++11 & Builder C++ XE7
Вопрос такой, есть ли возможность подключить стандарт C++11 в C++ Builder XE7?

Drag&Drop С++ Builder
подскажите как с ListBox передать текст в Edit?

1
Супер-модератор
8758 / 2487 / 140
Регистрация: 07.03.2007
Сообщений: 11,789
13.05.2008, 09:14 2
вот тебе пример работы:
Код
void __fastcall TMainForm::BalanceClick(TObject *Sender)
{
  Balance->Enabled = false;
  AnsiString Begin = TimeToStr(Now());
  TExcelApplication* ExcelApplication1;
  TExcelWorkbook* ExcelWorkbook1;
  TExcelWorksheet* ExcelWorksheet1;
  AnsiString Months[13] = {"", "Січень", "Лютий", "Березень", "Квітень", "Травень", "Червень", "Липень",
                      "Серпень", "Вересень", "Жовтень", "Листопад", "Грудень"};
  int Year_B = StrToInt("20" + Year(Now())), Ind = StrToInt(Month(Now())) - 1;
  if(Y->AsInteger != 0 && M->AsInteger != 0 ){
    Year_B = 2000 + Y->AsInteger, Ind = M->AsInteger;
    RegionTotal(PadL(M->Text, 2), PadL(Y->Text, 2));
  }else{
    if(Ind == 0){
      Ind = 12;
      Year_B--;
    }
    RegionTotal(PadL(IntToStr(Ind), 2), PadL(IntToStr(Year_B - 2000), 2));
  }
  st->Panels->Items[0]->Text = "Формирование баланса";
  Application->ProcessMessages();
  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) + "[URL="file://\\Balance.xls"]\\Balance.xls[/URL]";
    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("E42"));
      // clear contents
      cell = ExcelWorksheet1->get_Range(TVariant("C6"), TVariant("E14"));
      cell->ClearContents();
      cell = ExcelWorksheet1->get_Range(TVariant("C16"), TVariant("E25"));
      cell->ClearContents();
      cell = ExcelWorksheet1->get_Range(TVariant("C27"), TVariant("E28"));
      cell->ClearContents();
      cell = ExcelWorksheet1->get_Range(TVariant("C30"), TVariant("E31"));
      cell->ClearContents();
      cell = ExcelWorksheet1->get_Range(TVariant("C33"), TVariant("E36"));
      cell->ClearContents();
      cell = ExcelWorksheet1->get_Range(TVariant("C38"), TVariant("E41"));
      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();
      double penya = 0;
      cell = ExcelWorksheet1->get_Range(TVariant("B59"), TVariant("G61"));
      cell->ClearContents();
      Query1->SQL->Clear();
      Query1->SQL->Add("select sum(pnlt_serv1) as penya from acc_" + PadL(IntToStr(Year_B - 2000), 2) + " where bill_mm = '" + PadL(IntToStr(Ind), 2) + "' and ");
      Query1->SQL->Add("cstmr_cd in (select  cstmr_cd from pay1_" + PadL(IntToStr(Year_B - 2000), 2) + " where bill_mm = '" + PadL(IntToStr(Ind), 2) + "' and (way_cd = 4))");
      Query1->Open();
      cell = ExcelWorksheet1->get_Range(TVariant("D63"), TVariant("D63"));
      cell->set_Value(TVariant(Query1->FieldByName("penya")->AsFloat));
      penya += Query1->FieldByName("penya")->AsFloat;
      Query1->Close();
      Query1->SQL->Clear();
      Query1->SQL->Add("select sum(pnlt_serv1) as penya from acc_" + PadL(IntToStr(Year_B - 2000), 2) + " where bill_mm = '" + PadL(IntToStr(Ind), 2) + "' and ");
      Query1->SQL->Add("cstmr_cd in (select  cstmr_cd from pay1_" + PadL(IntToStr(Year_B - 2000), 2) + " where bill_mm = '" + PadL(IntToStr(Ind), 2) + "' and (way_cd = 2))");
      Query1->Open();
      cell = ExcelWorksheet1->get_Range(TVariant("D64"), TVariant("D64"));
      cell->set_Value(TVariant(Query1->FieldByName("penya")->AsFloat));
      penya += Query1->FieldByName("penya")->AsFloat;
      Query1->Close();
      Query1->SQL->Clear();
      Query1->SQL->Add("select sum(in_amt1) as in_saldo, sum(tot_pay1) + sum(pnlt_serv1) as opl, sum(tot_serv1) - sum(pnlt_serv1) as nach, ");
      Query1->SQL->Add("sum(pnlt_serv1) as penya,  sum(out_amt1) as out_saldo");
      Query1->SQL->Add("from acc_" + PadL(IntToStr(Year_B - 2000), 2) + " where bill_mm = '" + PadL(IntToStr(Ind), 2) + "'");
      Query1->Open();
      cell = ExcelWorksheet1->get_Range(TVariant("B59"), TVariant("B59"));
      cell->set_Value(TVariant(Query1->FieldByName("in_saldo")->AsFloat));
      cell = ExcelWorksheet1->get_Range(TVariant("C59"), TVariant("C59"));
      cell->set_Value(TVariant(Query1->FieldByName("opl")->AsFloat * (-1)));
      cell = ExcelWorksheet1->get_Range(TVariant("D59"), TVariant("D59"));
      cell->set_Value(TVariant(Query1->FieldByName("nach")->AsFloat));
      cell = ExcelWorksheet1->get_Range(TVariant("G59"), TVariant("G59"));
      cell->set_Value(TVariant(Query1->FieldByName("out_saldo")->AsFloat));
      Query1->Close();
      Query1->SQL->Clear();
      Query1->SQL->Add("select sum(in_amt1) as debet from acc_" + PadL(IntToStr(Year_B - 2000), 2) + " ");
      Query1->SQL->Add("where bill_mm = '" + PadL(IntToStr(Ind), 2) + "' and in_amt1 >= 0");
      Query1->Open();
      cell = ExcelWorksheet1->get_Range(TVariant("B60"), TVariant("B60"));
      cell->set_Value(TVariant(Query1->FieldByName("debet")->AsFloat));
      Query1->Close();
      Query1->SQL->Clear();
      Query1->SQL->Add("select sum(in_amt1) as credit from acc_" + PadL(IntToStr(Year_B - 2000), 2) + " ");
      Query1->SQL->Add("where bill_mm = '" + PadL(IntToStr(Ind), 2) + "' and in_amt1 < 0");
      Query1->Open();
      cell = ExcelWorksheet1->get_Range(TVariant("B61"), TVariant("B61"));
      cell->set_Value(TVariant(Query1->FieldByName("credit")->AsFloat* (-1)));
      Query1->Close();
      Query1->SQL->Clear();
      Query1->SQL->Add("select sum(out_amt1) as debet from acc_" + PadL(IntToStr(Year_B - 2000), 2) + " ");
      Query1->SQL->Add("where bill_mm = '" + PadL(IntToStr(Ind), 2) + "' and out_amt1 >= 0");
      Query1->Open();
      cell = ExcelWorksheet1->get_Range(TVariant("G60"), TVariant("G60"));
      cell->set_Value(TVariant(Query1->FieldByName("debet")->AsFloat));
      Query1->Close();
      Query1->SQL->Clear();
      Query1->SQL->Add("select sum(out_amt1) as credit from acc_" + PadL(IntToStr(Year_B - 2000), 2) + " ");
      Query1->SQL->Add("where bill_mm = '" + PadL(IntToStr(Ind), 2) + "' and out_amt1 < 0");
      Query1->Open();
      cell = ExcelWorksheet1->get_Range(TVariant("G61"), TVariant("G61"));
      cell->set_Value(TVariant(Query1->FieldByName("credit")->AsFloat * (-1)));
      Query1->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(...){}
  }catch(...){}
  Query1->Close();
  st->Panels->Items[0]->Text = "";
  Application->ProcessMessages();
  AnsiString End = TimeToStr(Now());
  st->Panels->Items[0]->Text = TimeToStr(StrToTime(End) - StrToTime(Begin)) + " сек";
  Application->ProcessMessages();
  Balance->Enabled = true;
}
а поиск глянь в вба, в билдере он организовывается аналогично, так проги по экселю первые и писал, переносил код из вба...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2008, 09:14

Помощь в написании контрольных, курсовых и дипломных работ здесь.

C++ Builder XE3 & OpenCV
Всем привет. Объясните пожалуйста как прикручивать OpenCV к билдеру XE3. Прочёл много примеров, но...

Fastreport & С++builder, построение графиков
Кто нибудь вообще с FastReport работает?

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

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


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

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

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