C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
извините, снова StringGrid, прошу помочь скорее
dreo
Отправлено: 01.12.2006, 15:07


Ученик-кочегар

Группа: Участник
Сообщений: 9



Уважаемые, знающие люди. Я очень кас прошу помочь мне в моей проблеме. Я в этом деле не особо силен, а вам это больших трудностей не доставит.
Как мне из текстового файла перевести данные в StringGrid пословно. Расделителем является пробел. Суть в том, что колличество слов в строке не определено, может быть любым.
Я знаю, вы будете посылать меня в Поиск, я искал, но там,например, есть, как делать это посимвольно и с четко заданным колличеством букв.
Вобщем говоря, помогите очень вас прошу.
gvg
Отправлено: 01.12.2006, 15:11


Машинист паровоза

Группа: Участник
Сообщений: 222



Разбор строк по словам обсуждался пару дней назад — далеко ходить не надо.


Смотри "как найти начало слова в строке?"

Отредактировано gvg — 01.12.2006, 15:13
dreo
Отправлено: 01.12.2006, 15:35


Ученик-кочегар

Группа: Участник
Сообщений: 9



нашел.
Можете показать на коде, как это выглядит? Простите за мою тупость.

Отредактировано dreo — 01.12.2006, 15:35
Doga
Отправлено: 01.12.2006, 15:57


Мастер участка

Группа: Участник
Сообщений: 575



CODE

void __fastcall TForm1::FillGridFromFile(TStringGrid *Grid, AnsiString FileName)
{
 if (Grid)
 {
   if (FileExists(FileName))
   {
     TStringList *RowsList = new TStringList();
     
     RowsList->LoadFromFile(FileName);

     if (RowsList->Count > 0)
     {
       Grid->RowCount = RowsList->Count;
       
       for (int k = 0; k < RowsList->Count; k++)
       {
         TStringList *CellsList = new TStringList();
         
         CellsList->Text = StringReplace(RowsList->Strings[k], " ", "\n", TReplaceFlags()<<rfReplaceAll);

         if (Grid->ColCount < CellsList->Count)
         {
           Grid->ColCount = CellsList->Count;
         }

         Grid->Rows[k] = CellsList;

         delete CellsList;
       }
     }
   
     delete RowsList;
   }
 }  
}


Отредактировано Doga — 01.12.2006, 16:14
dreo
Отправлено: 01.12.2006, 16:40


Ученик-кочегар

Группа: Участник
Сообщений: 9



спасибо biggrin.gif
dreo
Отправлено: 04.12.2006, 21:28


Ученик-кочегар

Группа: Участник
Сообщений: 9



Еще одна небольшая просьба. Могли бы вы написать, как мне к вышеуказанному примеру сделать экспорт StringGrid'a в Excel? Как сделать цикл, чтоб он из грида в эксель записывал?
Буду очень признателен.
Doga
Отправлено: 04.12.2006, 21:36


Мастер участка

Группа: Участник
Сообщений: 575



http://www.rxlib.ru/WinLesson/Winles.htm
dreo
Отправлено: 04.12.2006, 21:54


Ученик-кочегар

Группа: Участник
Сообщений: 9



можешь предоставить код? а не ссылку на уроки. Я прочитал их, но тольком не понимаю, как это сделать. Я могу заполнять ячейки по одной, но чтоб полностью стринг грид перевести в эксель я не знаю как.
olegenty
Отправлено: 05.12.2006, 08:33


Ветеран

Группа: Модератор
Сообщений: 2412



сформировать вариантный массив вариантных массивов и записать его в диапазон.
AVC
Отправлено: 05.12.2006, 09:29


Ветеран

Группа: Модератор
Сообщений: 1583



Лично я предпочитаю "перегонять" через текстовый файл.
QUOTE

Я могу заполнять ячейки по одной, но чтоб полностью стринг грид перевести в эксель я не знаю как.

Ну, например, в цикле ячеечку за ячеечкой.
olegenty
Отправлено: 05.12.2006, 09:40


Ветеран

Группа: Модератор
Сообщений: 2412



массив массивов — быстрее.
AVC
Отправлено: 05.12.2006, 10:20


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (olegenty @ 05.12.2006, 08:40)
массив массивов — быстрее.

Это бесспорно, но я хотел подчеркнуть что человек уже и так знал один из способов biggrin.gif
Make
Отправлено: 05.12.2006, 10:26


Ученик-кочегар

Группа: Участник
Сообщений: 13



Блин а что делать если табличка с изменяющимся числом строк и столбцов sad.gif
olegenty
Отправлено: 05.12.2006, 11:30


Ветеран

Группа: Модератор
Сообщений: 2412



1. Узнать сколько столбцов и строк
2. Создать вариантный массив вариантных массивов
3. Пихнуть в диапазон Excel
Gedeon
Отправлено: 05.12.2006, 12:48


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (olegenty @ 05.12.2006, 11:30)
1. Узнать сколько столбцов и строк
2. Создать вариантный массив вариантных массивов
3. Пихнуть в диапазон Excel

Кинь плиз краткий пример, я с экселем практически не работаю, а вот код бы закопировал куда-нить на всяк случай.
Make
Отправлено: 05.12.2006, 13:39


Ученик-кочегар

Группа: Участник
Сообщений: 13



так кусочка кода нам никто и не дал хотябы для двух ячеек sad.gif, а есть хелп на русском как управлять Exelom и Wordom

dreo
Отправлено: 05.12.2006, 14:41


Ученик-кочегар

Группа: Участник
Сообщений: 9



Предоставьте код пожалуйста, а то хоть обьяснено более или менее, но там нет конкретного примера с выводом из StringGrid, который может быть не 2на2,4на4 клетки (как обычно в пример приводят), а произвольного размера. Я бы сам сделал, если бы знал, а я и так не особо разбираюсь. Помогите а?
dreo
Отправлено: 05.12.2006, 14:47


Ученик-кочегар

Группа: Участник
Сообщений: 9



QUOTE (AVC @ 05.12.2006, 09:29)
Лично я предпочитаю "перегонять" через текстовый файл.
QUOTE

Я могу заполнять ячейки по одной, но чтоб полностью стринг грид перевести в эксель я не знаю как.

Ну, например, в цикле ячеечку за ячеечкой.

Ну покажи smile.gif
AVC
Отправлено: 05.12.2006, 15:40


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (dreo @ 05.12.2006, 13:47)
Ну покажи smile.gif

Что вам показать?
Как обойти все ячейки сетки? Для этого есть свойства RowCount, ColCount, Cells или Rows/Cols
Или как создать текстовый файл?
Или как этот файл открыть в Excel'е?

Кстати, поиском не пытались воспользоваться?
dreo
Отправлено: 05.12.2006, 17:35


Ученик-кочегар

Группа: Участник
Сообщений: 9



поиском пользовался. вопрос я изложил выше. как мне из стринггрида любого размера записать данные в эксель?
Make
Отправлено: 06.12.2006, 05:46


Ученик-кочегар

Группа: Участник
Сообщений: 13



И в правду дайте пример для трех, четырех столбцов и изменяющеся кол-во строк, а то как-то не врублюсь совсем sad.gif
Gedeon
Отправлено: 06.12.2006, 09:41


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (AVC @ 05.12.2006, 15:40)
QUOTE (dreo @ 05.12.2006, 13:47)
Ну покажи smile.gif

Что вам показать?
Как обойти все ячейки сетки? Для этого есть свойства RowCount, ColCount, Cells или Rows/Cols
Или как создать текстовый файл?
Или как этот файл открыть в Excel'е?

Не я хотел увидеть
QUOTE

2. Создать вариантный массив вариантных массивов
3. Пихнуть в диапазон Excel

AVC
Отправлено: 06.12.2006, 10:34


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (Make @ 06.12.2006, 04:46)
И в правду дайте пример для трех, четырех столбцов и изменяющеся кол-во строк, а то как-то не врублюсь совсем  sad.gif

Ну народ ..... А подумать? Вот работающий пример просто на коде уроков.
CODE

//---------------------------------------------------------------------------

#include <sysvari.h>
#include <olectl.h>
#include <ocidl.h>
#include <utilcls.h>

void __fastcall TForm1::Bt_SGtoXlsClick(TObject *Sender)
{
// Заполнить сетку значениями
TStringGrid *sg = StringGrid1;
sg->ColCount = 10;
sg->RowCount = 20;
for (int i(0), n(1); i < sg->RowCount; i++)
 for (int j(0);     j < sg->ColCount; j++)
   sg->Cells[j][i] = n++;


// Открыть лист в Excel
ExcelInit("");
if(!App.IsEmpty())App.OlePropertySet("Visible",true);

// записать в него данные
for (int i(0);   i < sg->RowCount; i++)
 for (int j(0); j < sg->ColCount; j++)
   toExcelCell(i+1, j+1, sg->Cells[j][i]);

}

//- — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - -

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);
   else
    App.OlePropertyGet("WorkBooks").OleProcedure("add");
   Sh=App.OlePropertyGet("WorkSheets",1);
 } catch(...) {
   Application->MessageBox("Ошибка открытия книги Microsoft Excel!",
                                        "Ошибка",MB_OK+MB_ICONERROR);
 }
}

//- — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - -

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(...) {; }
}

//- — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - -

void __fastcall TForm1::toExcelCell(int Row,int Column, Variant data)
{
 try {
   Variant  cur = Sh.OlePropertyGet("Cells", Row,Column);
   cur.OlePropertySet("Value", data);
 } catch(...) {; }
}

//---------------------------------------------------------------------------

Работает практически с любым числом срок и столбцов.

2Gedeon
Вариантный массив впереди. Надо делать, если руки дойдут smile.gif . Как писал — я работаю с excel через текстовый файл. Потеря форматирования, но зато такой выигрыш в скорости.
dreo
Отправлено: 06.12.2006, 10:50


Ученик-кочегар

Группа: Участник
Сообщений: 9



Вот теперь огромное спасибо. Думаю отдельно вариант с гридом нада в FAQ засунусь, потому что думаю не один я так тупить буду.
AVC
Отправлено: 06.12.2006, 12:02


Ветеран

Группа: Модератор
Сообщений: 1583



Получать "спасибо" за такие строки
CODE

for (int i(0); i < sg->RowCount; i++)
for (int j(0); j < sg->ColCount; j++)
  toExcelCell(i+1, j+1, sg->Cells[j][i]);

просто даже не удобно.
Остальное "тупо" скопировано прямо со страницы первого урока.


Вот что получилось на скорую руку с массивом (теперь самодостаточный код)
CODE

//---------------------------------------------------------------------------

#include <sysvari.h>
#include <olectl.h>
#include <ocidl.h>
#include <utilcls.h>

void __fastcall TForm1::SGGridToExcel(TStringGrid *sg)
{
// Открыть лист в Excel
ExcelInit("");
if(App.IsEmpty()) return;

App.OlePropertySet("Visible",true);

// записать в него данные строчечка за строчечкой
int Bounds[] = {0, sg->RowCount};
Variant ARow = VarArrayCreate(Bounds,1, varVariant);

for (int i(0); i < sg->RowCount; i++)
{  for (int j(0); j < sg->ColCount; j++)
       ARow.PutElement(sg->Cells[j][i],j);

   Variant Cell1 = Sh.OlePropertyGet("Cells", i+1, 1);
   Variant Cell2 = Sh.OlePropertyGet("Cells", i+1, sg->ColCount);
   Variant Range = Sh.OlePropertyGet("Range", Cell1, Cell2);
   Range.OlePropertySet("Value", ARow);
}

//- — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - -

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);
   else
    App.OlePropertyGet("WorkBooks").OleProcedure("add");
   Sh=App.OlePropertyGet("WorkSheets",1);
 } catch(...) {
   Application->MessageBox("Ошибка открытия книги Microsoft Excel!",
                                        "Ошибка",MB_OK+MB_ICONERROR);
 }
}
//---------------------------------------------------------------------------

Возможное дальнейшее развитие — загузка порциями строк и оптимизация по доступу к VarArray.
Make
Отправлено: 07.12.2006, 07:31


Ученик-кочегар

Группа: Участник
Сообщений: 13



Спасибо тебе AVC yahoo.gif,

вот так для понимания всегда не хватает кусочка кода

Отредактировано Make — 07.12.2006, 07:35

Вернуться в Вопросы программирования в C++Builder