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
|
спасибо |
|
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) | массив массивов — быстрее. |
Это бесспорно, но я хотел подчеркнуть что человек уже и так знал один из способов |
|
Make |
Отправлено: 05.12.2006, 10:26 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Блин а что делать если табличка с изменяющимся числом строк и столбцов |
|
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
|
так кусочка кода нам никто и не дал хотябы для двух ячеек , а есть хелп на русском как управлять 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 |
Я могу заполнять ячейки по одной, но чтоб полностью стринг грид перевести в эксель я не знаю как.
|
Ну, например, в цикле ячеечку за ячеечкой. |
Ну покажи |
|
AVC |
Отправлено: 05.12.2006, 15:40 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (dreo @ 05.12.2006, 13:47) | Ну покажи |
Что вам показать?
Как обойти все ячейки сетки? Для этого есть свойства RowCount, ColCount, Cells или Rows/Cols
Или как создать текстовый файл?
Или как этот файл открыть в Excel'е?
Кстати, поиском не пытались воспользоваться?
|
|
dreo |
Отправлено: 05.12.2006, 17:35 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 9
|
поиском пользовался. вопрос я изложил выше. как мне из стринггрида любого размера записать данные в эксель? |
|
Make |
Отправлено: 06.12.2006, 05:46 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
И в правду дайте пример для трех, четырех столбцов и изменяющеся кол-во строк, а то как-то не врублюсь совсем
|
|
Gedeon |
Отправлено: 06.12.2006, 09:41 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (AVC @ 05.12.2006, 15:40) | QUOTE (dreo @ 05.12.2006, 13:47) | Ну покажи |
Что вам показать?
Как обойти все ячейки сетки? Для этого есть свойства RowCount, ColCount, Cells или Rows/Cols
Или как создать текстовый файл?
Или как этот файл открыть в Excel'е?
|
Не я хотел увидеть
QUOTE |
2. Создать вариантный массив вариантных массивов
3. Пихнуть в диапазон Excel |
|
|
AVC |
Отправлено: 06.12.2006, 10:34 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (Make @ 06.12.2006, 04:46) | И в правду дайте пример для трех, четырех столбцов и изменяющеся кол-во строк, а то как-то не врублюсь совсем |
Ну народ ..... А подумать? Вот работающий пример просто на коде уроков.
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
Вариантный массив впереди. Надо делать, если руки дойдут . Как писал — я работаю с 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 ,
вот так для понимания всегда не хватает кусочка кода
Отредактировано Make — 07.12.2006, 07:35 |
|