Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Загрузка данных из Excel


Автор: Самозванка 13.11.2007, 15:16
При загрузке данных из Excel в стрингрид по нажтию кнопки делаю так....
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(!OpenDialog1->Execute())
         return;
    ExcelClass.CreateApplication();
    ExcelClass.OpenDocument(OpenDialog1->FileName);
    for(int i=1;i<1000;i++)
        for(int j=1;j<15;j++)
                 StringGrid1->Cells[j][i] = ExcelClass.GetCell(i,j);
    ExcelClass.CloseAppication();

Код класса:
Код

//---------------------------------------------------------------------------
void __fastcall TExcelClass::CreateApplication()
{
        Excel=CreateOleObject("Excel.Application");
}
//---------------------------------------------------------------------------
void __fastcall TExcelClass::OpenDocument(AnsiString FileName)
{
        TemplatePath=FileName+"t";
    Excel.OlePropertyGet("Workbooks").OleProcedure("Open",FileName.c_str());
}
//---------------------------------------------------------------------------
void __fastcall TExcelClass::CloseAppication()
{
    DeleteFileA(TemplatePath);
    Excel.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs",TemplatePath.c_str());
    DeleteFileA(TemplatePath);
    Excel.OlePropertyGet("Workbooks").OleProcedure("Close");
    Excel.Clear();
    Excel = Unassigned;
}
//---------------------------------------------------------------------------
AnsiString  TExcelClass::GetCell(int i,int j)
{
    return Excel.OlePropertyGet("Cells",i,j).OlePropertyGet("Value");
}


Так вот всё работает но проблема в том, что мы не знаем скока строк в файле екселя... и мне надо как то избавиться от цикла....
Код

    for(int i=1;i<1000;i++)
        for(int j=1;j<15;j++)
                 StringGrid1->Cells[j][i] = ExcelClass.GetCell(i,j);

С OLE давно не работала, можно ли как то определить что данные в екселевском файле закончились? а не пробегать пустые строчки? Есть ли такая функция?

Автор: Самозванка 13.11.2007, 16:46
никто не знает или непонятен вопрос???

Автор: ama_kid 13.11.2007, 16:55
Цитата(Самозванка @  13.11.2007,  15:16 Найти цитируемый пост)
можно ли как то определить что данные в екселевском файле закончились?
А что означает - "данные закончились"? Какой признак "законченности"? В конце концов - можно принять пустую строку за сигнатуру "окончания" и сделать break циклу...
Цитата(Самозванка @  13.11.2007,  15:16 Найти цитируемый пост)
не знаем скока строк в файле екселя
на листе экселя находится максимум 65536 строк...

Автор: Самозванка 13.11.2007, 16:57
ama_kid,  Спасибо ,я с помощью break токо что и сделала. Просто так программа долго весит, пока считывается информация из файла

А как сделать чтобы конец файла бы был по последнему введенному тексту, а то у меня псле пустых строк еще текст в файле идти может....?

Автор: dumb 13.11.2007, 18:13
наверное как-то так:
Код

class TExcelClass ...
{
...
  public:
    int Rows, Columns;
...

Код

void __fastcall TExcelClass::OpenDocument(AnsiString FileName)
{
  TemplatePath = FileName+"t";
  Excel.OlePropertyGet("Workbooks").OleProcedure("Open",FileName.c_str());
  Excel.OlePropertyGet("Cells").OlePropertyGet("SpecialCells",11).OleProcedure("Activate"); // 11 = xlCellTypeLastCell
  Rows = Excel.OlePropertyGet("ActiveCell").OlePropertyGet("Row");
  Columns = Excel.OlePropertyGet("ActiveCell").OlePropertyGet("Column");
}


Добавлено через 1 минуту и 32 секунды
красоту(типа затягивания получения границ в метод) наводите сами... smile

Автор: Zan Zarabear 1.2.2008, 17:04
Попробуйте от это:
Код

Variant Range = WorkSheet.OlePropertyGet("UsedRange");

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)