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


Автор: Ярослав 25.7.2010, 21:25
Доброе время суток помогите пожалуйста.Мне необходимо поместить донные с таблицы StringGrid в Excel.По форуму есть пару тем но конкретного кода не нашол.Буду благодарин за помощь.

Автор: Данкинг 25.7.2010, 22:24
Глянь http://forum.vingrad.ru/index.php?showtopic=302606&view=findpost&p=2165627

Автор: Ярослав 26.7.2010, 12:40
Та чёт туговато там,я видел.Может кто то с этим работал и есть исходник,А

Автор: NightElf 26.7.2010, 13:18
Вариант 1. Вставлять сразу диапазонами, а не в каждую ячейку:

Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TDateTime tm1, tm2;
    String Range;
    Variant A(OPENARRAY(int, (0, StringGrid1->ColCount)), varVariant);
    Variant XL, v0, v1;

    tm1 = Time();
    XL = CreateOleObject("Excel.Application");
    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));
}


Вариант 2. Сформировать строковый массив, слова в строках д.б. разделены символом табуляции и все это вставить через Clipboard.

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList* data = new TStringList();
    String line;
    TDateTime tm1, tm2;
    Variant XL, v0, v1;

    tm1 = Time();
    //вставим в Excel...
    XL = CreateOleObject("Excel.Application");
    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;
}


Взято с http://forum.codenet.ru

Автор: NightElf 26.7.2010, 13:38
Если будет нужно, то вот этот эпизод
Цитата

Range.printf("A%d:J%d", i+1, i+1);
v1.OlePropertyGet("Range", Range.c_str()).OlePropertySet("Value", A);

Можно заменить на этот
Цитата

Sheet.OlePropertyGet("Range",Sheet.OlePropertyGet("Cells", i+1, 1), Sheet.OlePropertyGet("Cells", i+1, 14)).OlePropertySet("Value", A);

Удачи smile 

Автор: Ярослав 26.7.2010, 13:41
Спосибо,но ошибку выдаёт этот код

Автор: Данкинг 26.7.2010, 13:53
Цитата(Ярослав @  26.7.2010,  13:40 Найти цитируемый пост)
Та чёт туговато там,я видел.

Что там туговатого? Вроде нормальный пример.

Автор: Ярослав 26.7.2010, 14:18
XL пишет ошибку,что может быть(в первом варианте) smile 

Автор: Данкинг 26.7.2010, 14:21
Цитата(Ярослав @  26.7.2010,  15:18 Найти цитируемый пост)
XL пишет ошибку

Текст ошибка - тайна великая есть?

Автор: Ярослав 26.7.2010, 14:25
[C++ Error] Unit1.cpp(25): E2451 Undefined symbol 'XL'
[C++ Error] Unit1.cpp(25): E2268 Call to undefined function 'CreateOleObject'
[C++ Error] Unit1.cpp(26): E2451 Undefined symbol 'CheckBox1'
[C++ Error] Unit1.cpp(27): E2451 Undefined symbol 'v0'
[C++ Error] Unit1.cpp(29): E2451 Undefined symbol 'v1'

Автор: Данкинг 26.7.2010, 15:25
Цитата(Ярослав @  26.7.2010,  15:25 Найти цитируемый пост)
[C++ Error] Unit1.cpp(25): E2451 Undefined symbol 'XL'

Ну и? Переменная XL объявлена?
Цитата(Ярослав @  26.7.2010,  15:25 Найти цитируемый пост)
[C++ Error] Unit1.cpp(25): E2268 Call to undefined function 'CreateOleObject'

Не уверен насчёт Билдера, но в дельфи эта функция объявлена в модуле ComObj. Попробуй его подключить.
Цитата(Ярослав @  26.7.2010,  15:25 Найти цитируемый пост)
[C++ Error] Unit1.cpp(26): E2451 Undefined symbol 'CheckBox1'
[C++ Error] Unit1.cpp(27): E2451 Undefined symbol 'v0'
[C++ Error] Unit1.cpp(29): E2451 Undefined symbol 'v1' 

Ну, сам догадайся, что сиё есть.

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