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

 
Как правильно записать StringGrid в файл?
westpine
  Отправлено: 26.07.2004, 20:48


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

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



Всем привет. Весь вопрос в сабже. Единственный путь который я знаю, это доставать поячеечно текст из таблицы и sprintfom писать на диск. Но скорее всего есть более современный метод smile.gif И желательно сразу в Excel документ

Отредактировано westpine — 26/07/2004, 21:51
PeroManiak
Отправлено: 26.07.2004, 22:54


Дежурный стрелочник

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



westpine, у тебя какие-то вопросы странные... smile.gif
Если в Excell, не парься, читай доку про ексель, это лежит на каждом шагу. Ищущий, да найдет smile.gif

Отредактировано PeroManiak — 26/07/2004, 23:56
Gedeon
Отправлено: 27.07.2004, 08:07


Ветеран

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



Еще посмотри TAdvStrGrid
MDM
Отправлено: 27.07.2004, 14:08


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

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



QUOTE (westpine @ 26/07/2004, 21:50)
Всем привет. Весь вопрос в сабже. Единственный путь который я знаю, это доставать поячеечно текст из таблицы и sprintfom писать на диск. Но скорее всего есть более современный метод smile.gif И желательно сразу в Excel документ

Можешь читать и потом писать в файл построчно:
StringGrid1->Rows[i]->Text;

А вот в Excel:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList* data = new TStringList();
String line;
TDateTime tm1, tm2;

tm1 = Time();
//вставим в Excel...
XL = CreateOleObject("Excel.Application.8");
XL.OlePropertySet("Visible", CheckBox1->Checked);
v0 = XL.OlePropertyGet("Workbooks");
v0.OleProcedure("Add");
v1 = v0.OlePropertyGet("Item", 1).OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);

//добавляем строки в которых слова разделены Tab-ом, Excel — поймет...
for (int i = 0; i < StringGrid1->RowCount; i++) {
line = StringGrid1->Cells[0][i];
for (int j = 1; j < StringGrid1->ColCount; j++) {
line = line + "\t" + StringGrid1->Cells[j][i];
}
data->Add(line);
}
//в Clipboard...
Clipboard()->AsText = data->Text;

v1.OlePropertyGet("Range", "A1:A1").OleProcedure("Select"); //например начиная с этой ячейки...
v1.OleProcedure("Paste");

Clipboard()->Clear();

XL.OlePropertySet("DisplayAlerts",false);
XL.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", ChangeFileExt(Application->ExeName, ".xls"));
XL.OleProcedure("Quit");

tm2 = Time();
ShowMessage("done with " + TimeToStr(tm2 — tm1));

delete data;
}
или так:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TDateTime tm1, tm2;
String Range;
Variant A(OPENARRAY(int, (0, StringGrid1->ColCount)), varVariant);

tm1 = Time();
XL = CreateOleObject("Excel.Application.8");
XL.OlePropertySet("Visible", CheckBox1->Checked);
v0 = XL.OlePropertyGet("Workbooks");
v0.OleProcedure("Add");
v1 = v0.OlePropertyGet("Item", 1).OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);

for (int i = 0; i < StringGrid1->RowCount; i++) {
for (int j = 0; j < StringGrid1->ColCount; j++) {
A.PutElement(StringGrid1->Cells[j][i],j);
}
Range.printf("A%d:J%d", i+1, i+1);
v1.OlePropertyGet("Range", Range.c_str()).OlePropertySet("Value", A);
}

XL.OlePropertySet("DisplayAlerts",false);
XL.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", ChangeFileExt(Application->ExeName, ".xls"));
XL.OleProcedure("Quit");

tm2 = Time();
ShowMessage("done with " + TimeToStr(tm2 — tm1));
}

Project1 здесь:


User Attached Image Скачать файл
FastPasteIntoExcel.rar


westpine
  Отправлено: 28.07.2004, 00:31


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

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



И снова всем спасибо! ЗАРАБОТАЛО! До чего же путевая вещь — форум biggrin.gif

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