Как прочитать данные в Excelе из C++ Builder
От: hyper  
Дата: 23.05.02 16:05
Оценка:
Господа
помогите, плиз, примером
Как прочесть содержимое ячеек из существующего файла Excel с помощью C++ Builder

а то я тут ковыряюсь, да разобраться не могу

просто я в COM не очень шарю, а прога просто должна уметь читать данные из Excel

спасибо
Re: Как прочитать данные в Excelе из C++ Builder
От: vav Россия  
Дата: 24.05.02 01:37
Оценка: 1 (1)
H>помогите, плиз, примером
H>Как прочесть содержимое ячеек из существующего файла Excel с помощью C++ Builder

H>а то я тут ковыряюсь, да разобраться не могу


не могу сказать, что функция, написанная ниже, оптимальна, но представление как "просто" работать с екселем дает. Писана для жены, которая хотела прочитать данные из екселя не задумываясь как это делать -))

unit UExcelReader;

interface

uses OleServer, ComCtrls,ComObj,Excel97,ActiveX;

function ReadRangeFromExcel
  (FileName, //имя файла
  ListName:string; // название листа
  RangeFrom,RangeTo:string // начальная и конечная 
  //ячейки например 'A1', 'F19'
   ):variant; //возвращает массив вариантов

implementation

function ReadRangeFromExcel(FileName,ListName:string;RangeFrom,RangeTo:string):variant;
var
  ExcelApplication1: TExcelApplication;
  IWorkbook: Excel97.ExcelWorkbook;
  ISheet: Excel97.ExcelWorksheet;
  IRange: Excel97.Range;
  V:variant;
begin
  // запускаем ексель
  if not Assigned(ExcelApplication1)
  then ExcelApplication1 := TExcelApplication.Create(Nil);
  //
  try
    ExcelApplication1.ConnectKind := ckRunningOrNew;
    ExcelApplication1.Connect;
    ExcelApplication1.Visible[0] := False;
    // подключаемся к книге
    IWorkbook := ExcelApplication1.Workbooks.Add(FileName,0);
    ISheet := IWorkbook.Worksheets.Item[ListName] as Excel97.ExcelWorksheet;
    IRange := ISheet.Range[RangeFrom,RangeTo];
    v := VarArrayCreate([0,0,IRange.Columns.Count-1,IRange.Rows.Count-1],varVariant);
    v := IRange.Value;
  finally
    FreeAndNil(ExcelApplication1);
  end;
end;

end.
Re[2]: Как прочитать данные в Excelе из C++ Builder
От: hyper  
Дата: 24.05.02 10:14
Оценка:
Здравствуйте vav, Вы писали:

vav>
vav>skipped
vav>


ну это все, конечно, хорошо

но как будет выглядеть код на С++ для Builder?
пытаюсь перевести эту прогу, но не компилится, зараза

TExcelWorkbook exWB = ExcelApplication1->Workbooks->Add("e:\\plan.xls", 0);

не работает, говорит
[C++ Error] Unit1.cpp(23): E2034 Cannot convert '_WorkbookPtr' to 'TExcelWorkbook *'

И ЧТО делать
а?
Re: Как прочитать данные в Excelе из C++ Builder
От: KBH  
Дата: 24.05.02 11:26
Оценка: 3 (1)
Здравствуйте hyper, Вы писали:

H>Господа

H>помогите, плиз, примером
H>Как прочесть содержимое ячеек из существующего файла Excel с помощью C++ Builder

#include <ComObj.hpp>

  // Путь к файлу
  char *Path = "C:\\*.XLS";
  // Открываем документ
  Variant V = CreateOleObject("Excel.Application");
  V.Exec(PropertySet("Visible")<<false);
  V.Exec(Function("WorkBooks")).Exec(Procedure("Open")<<Path);
  V.Exec(PropertyGet("Worksheets")<<1).Exec(Procedure("Select"));
  // Читаем значение ячейки
  int row = 10;
  int col = 10;
  int i = (int)V.Exec(PropertyGet("Cells") << row << col);
  ...
  // Закрываем документ
  V.Exec(Function("Quit"));
  V = Unassigned;
Re[2]: Как прочитать данные в Excelе из C++ Builder
От: FireWorm Беларусь  
Дата: 24.05.02 12:29
Оценка:
Здравствуйте KBH, Вы писали:

KBH>[ccode]

KBH>#include <ComObj.hpp>
skipped
СПАСИБО большое за пример, теперь все работатет!!!!!!!
НО...
а что делать с локализациями разными
например
KBH> V.Exec(PropertySet("Visible")<<false);
Visible по-немецки будет отличаться от Visible по-французски
то есть в немецком офисе и во французском это не отработает

чиво делать, спрашивается, а?
как делать переносимыми в разноязычные офисы?

Re[3]: Как прочитать данные в Excelе из C++ Builder
От: FireWorm Беларусь  
Дата: 27.05.02 10:41
Оценка:
ЛЮЮЮУУУУДИИИИИ!!!
Так что с локализациями делать
ПОМОГИТЕ, плиз советом, может кто-нить сталкивался
Re[4]: Как прочитать данные в Excelе из C++ Builder
От: Pavel XP  
Дата: 28.05.02 22:35
Оценка:
Здравствуйте FireWorm, Вы писали:

FW>ЛЮЮЮУУУУДИИИИИ!!!

FW>Так что с локализациями делать
FW>ПОМОГИТЕ, плиз советом, может кто-нить сталкивался

Не знаю поможет ли с немецкими, французкими,но у меня на английской 2к и русской win98 все прекрасно работает в таком виде.

Тут на основе шаблона создается файл с 6 листами, переименовывает их и на первый лист в ячейку А1 пишется строка "ааа",поминаем (пример это, все проверки пропущены)


   try {
      ExcelApplication->Connect();
      .... 
      ExcelApplication->SheetsInNewWorkbook[0] = 6;
      ExcelApplication->Workbooks->Add( TVariantInParam("e:\\пример1.xlt") );

      ExcelApplication->Visible[0] = True;
      ExcelWorkbook->ConnectTo(ExcelApplication->ActiveWorkbook);
      ExcelWorkbook->SaveAs("e:\\ddd.xls",
                 TNoParam(),TNoParam(),TNoParam(),TNoParam(),TNoParam(),
                xlNoChange/*XlSaveAsAccessMode*/,
                TNoParam(),TNoParam(),TNoParam(),TNoParam(),TDefLCID());

      ExcelWorksheet->ConnectTo(ExcelWorkbook->ActiveSheet);

      wchar_t name[10];
      for(int Index = 1;Index<=6;Index++)
      {
         swprintf(name,L"MC%3d",Index);
         ExcelWorksheetPtr r = ExcelWorkbook->Sheets->get_Item(Index);
         r->set_Name(TVariantInParam(name));
      }
      
      TVariantInParam str("aaa");
      TVariantInParam Cell1("A1");
      
      Excel_2k::RangePtr r = ExcelWorksheet->Get_Range(Cell1, TNoParam());
      r->set_Value(str); // для чтения ес-но getValue
    .....
    }
    catch( ....)
    {
    }


А вообще всю идею смотри на "королевстве дельфи" цикл статей "По просторам интеграции" части с 1-3.
Останется только превести код с синтаксиса Паскаля на с++.
Более детальную информацию можно подчерпнуть из файлов в директории include\vcl\excel_2k*.h и include\vcl\excel_97*.h.
Re[5]: Как прочитать данные в Excelе из C++ Builder
От: Holy Россия  
Дата: 24.11.02 12:27
Оценка:
Здравствуйте, уважвемый, Pavel XP, Вы писали:

PX>Тут на основе шаблона создается файл с 6 листами, переименовывает их и на первый лист в ячейку А1 пишется строка "ааа",поминаем (пример это, все проверки пропущены)


PX>

PX>
PX>   try {
PX>      ExcelApplication->Connect();
PX>      .... 
PX>      ExcelApplication->SheetsInNewWorkbook[0] = 6;
PX>      ExcelApplication->Workbooks->Add( TVariantInParam("e:\\пример1.xlt") );

PX>      ExcelApplication->Visible[0] = True;
PX>      ExcelWorkbook->ConnectTo(ExcelApplication->ActiveWorkbook);
PX>      ExcelWorkbook->SaveAs("e:\\ddd.xls",
PX>                 TNoParam(),TNoParam(),TNoParam(),TNoParam(),TNoParam(),
PX>                xlNoChange/*XlSaveAsAccessMode*/,
PX>                TNoParam(),TNoParam(),TNoParam(),TNoParam(),TDefLCID());

PX>      ExcelWorksheet->ConnectTo(ExcelWorkbook->ActiveSheet);

PX>      wchar_t name[10];
PX>      for(int Index = 1;Index<=6;Index++)
PX>      {
PX>         swprintf(name,L"MC%3d",Index);
PX>         ExcelWorksheetPtr r = ExcelWorkbook->Sheets->get_Item(Index);
PX>         r->set_Name(TVariantInParam(name));
PX>      }
PX>      
PX>      TVariantInParam str("aaa");
PX>      TVariantInParam Cell1("A1");
PX>      
PX>      Excel_2k::RangePtr r = ExcelWorksheet->Get_Range(Cell1, TNoParam());
PX>      r->set_Value(str); // для чтения ес-но getValue
PX>    .....
PX>    }
PX>    catch( ....)
PX>    {
PX>    }
PX> 
PX>


Все OK но... , как быть с ошибкой, возникающей при использовании r->set_Value(str) ?
Что делать? Заранее благодорен!

[C++ Error] utilcls.h(2334): E2031 Cannot cast from 'const TBaseVariantT<tagVARIANT>' to 'TVariant &'
  /* Assignment operators */
  TVariantT& operator =(const TBaseVariantT<T>& rhs)
  {
    if (&rhs != this)
    {
      ::VariantClear(this);
      ::VariantCopy(this, &(const_cast<TVariantT&>(rhs))); //  <-- Здесь
    }
    return *this;
  }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.