Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++ & COM]Построить график в Excel


Автор: Predictor 16.9.2008, 14:40
Доброго всем времени суток!
Столкнулся с проблемой и погряз в огромном количестве документации по COM. помогите пожалуйста решить одну задачку.Пусть есть двумерный массив n[k][i]. Нужно что бы обычный Win32 Console Application (VS++2005) построило график в Excel...Заранее спасибо  smile 

Автор: Annihilator 18.9.2008, 09:14
Тебе именно через com надо? Я с excel работал через CreateOleObject

Автор: Predictor 18.9.2008, 10:10
Нет, не  обязательно COM. Если честно, я себе не очень хорошо представляю, чем COM от OLE отличается.Мне просто нужно, чтобы по записанному в ходе работы программы массиву как-нибудь сам  smile  построился график в Excel smile

Автор: Evjeny 18.9.2008, 10:39
Посмотри http://forum.shelek.ru/index.php/topic,12662.0.html. А еще лучше воспользуйся http://www.google.ru/.

Автор: Predictor 18.9.2008, 10:56
Спасибо, но в Гугле я уже был

Автор: dizzy1984 18.9.2008, 11:36
Я тоже был - нашел http://www.google.ru/search?hl=ru&q=c%2B%2B+excel&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=&aq=f&oq= информации

Автор: Predictor 18.9.2008, 14:19
Поясню: эту вешь нужно сделать быстро, потому что нужна она для отладки большой программы, моделирующией поведения молекул в газе.Поэтому мне сейчас нужен готовый рецепт.Если это долго, так и скажите,что долго и геморройно.Тогда я откажусь от этой затеи и постараюсь придумать что-нибудь дргуое.И не буду тратить ваше время  smile 

P.S. http://forum.shelek.ru/index.php/topic,12662.0.html я и сам много раз находил.Только Винграду я больше доверяю smile

Автор: dizzy1984 19.9.2008, 11:18
По сслылке, немного переделанное....
Показывает график двумерных данных.
Код

//office.h
//#define USES_MSO97
#define USES_MSO2000
//#define USES_MSO2002
//#define USES_MSO2003

#ifdef USES_MSO97
#import "C:\Program Files\Microsoft Office\Office\Excel8.OLB" auto_search auto_rename
#endif
#ifdef USES_MSO2000
#import "C:\Program Files\Microsoft Office\Office\Excel9.OLB" auto_search auto_rename
#endif
#ifdef USES_MSO2002
#import "progid:Excel.Sheet.8" auto_search auto_rename rename_search_namespace("Office9") \
       rename("DialogBox","_DialogBox") \
        rename("RGB","_RGB") \
        exclude("IFont","IPicture")
#endif
#ifdef USES_MSO2003
#import "progid:Excel.Sheet.8" auto_search auto_rename rename_search_namespace("Office9") \
       rename("DialogBox","_DialogBox") \
        rename("RGB","_RGB") \
        exclude("IFont","IPicture")
#endif

// mycpp.cpp
// Иницилизация COM объекта
    ::CoInitialize(NULL);    
    try 
    {
        // Соединение с MS Excel
        Excel::_ApplicationPtr pXL;
        pXL.CreateInstance("Excel.Application");
        // Показать приложение VARIANT_TRUE или не показывать VARIANT_FALSE
        pXL->Visible[0] = VARIANT_TRUE;
        // Подключение книги
        Excel::WorkbooksPtr pBooks = pXL->Workbooks;
        // Создание новой книги
        Excel::_WorkbookPtr pBook  = pBooks->Add((long)Excel::xlWorksheet);  
        // Указатель на активную страницу
        Excel::_WorksheetPtr pSheet = pXL->ActiveSheet;
  
        // Изменение имени страницы
        pSheet->Name = "Market Share!";
        // Доступ ко всем ячейкам
        Excel::RangePtr pRange = pSheet->Cells;

        Excel::RangePtr pCell;

        pCell = pRange->Item[1][2]; // A2
        pCell->Value2 = 1.0;
        pCell = pRange->Item[2][2]; // B2
        pCell->Value2 = 2.0;
        pCell = pRange->Item[3][2]; // C2
        pCell->Value2 = 5.0;
        pCell = pRange->Item[4][2]; // D2
        pCell->Value2 = 8.0;
   
             pCell = pRange->Item[1][3]; // A3   
             pCell->Value2 = 5.0; 
             pCell = pRange->Item[2][3]; // B3
             pCell->Value2 = 14.0;
             pCell = pRange->Item[3][3]; // C3
             pCell->Value2 = 7.0;
             pCell = pRange->Item[4][3]; // D3
             pCell->Value2 = 7.0;

        // Создание диаграммы
        pRange  = pSheet->Range["B1:C4"];
        Excel::_ChartPtr  pChart  = pBook->Charts->Add(); 
        pChart->ChartWizard((Excel::Range*) pRange, (long) Excel::xlXYScatter, 6L, (long) Excel::xlColumns, 1L, 0L, 2L, "Market Share", "1", "2");
        pChart->ChartType = Excel::xlXYScatterLinesNoMarkers;
        pBook->Close();
        // Выход из Excel
        pXL->Quit();
    }
    catch (_com_error& er)
    {
        char buf[1024];
        sprintf(buf,"_com_error:\n"
                "Error       : %08lX\n"
                "ErrorMessage: %s\n"
                "Description : %s\n"
                "Source      : %s\n",
                er.Error(),
                (LPCTSTR)_bstr_t(er.ErrorMessage()),
                (LPCTSTR)_bstr_t(er.Description()),
                (LPCTSTR)_bstr_t(er.Source())
               );

        ::CharToOem(buf,buf);
        ::MessageBox(m_hWnd, buf, "COM Error", MB_OK | MB_ICONERROR);
   }
   // Закрытие COM 
   ::CoUninitialize(); 

Тут неясно так уж ли нужен excel для "отладки" и в чем его специфическая роль. По поводу времени - я бы оценил написание подобного кода в 1 день.

Автор: Predictor 19.9.2008, 11:50
Большое спасибоsmile Жалко репутацию поднять не могу.
Программист я без году неделя, и учту язык по  мере необходимости физических расчетов.
Отвечая на вопросы: собственно говоря никакой специфической роли нет. подошел бы редактор который умеет строить графики по-точками.Идея заключалась в том, с помошью этого кусочка (ну например поставив в проге ожидание нажатие каких-нибудь клавиш) сразу посмотреть как ведут себя интересующие нас участки кривой.Мне показалось, что моя идея не самый плохой вариант... smile 


Автор: dizzy1984 19.9.2008, 13:29
Тогда это из пушки по воробьям. Уж лучше выводить в контекст окна.

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