Search code examples
excelqtchartsactivexole

Generating embedded charts via qt activex


I've found a code for inserting a chart type worksheet (not embedded charts) in excel using Qt Activex as below:

The code works fine. I'm wondering where can if find the standards APIs/some examples for dealing with charts specially with embedded charts. Where can I find some example or APIs for dealing with embedded charts in excel via qt Activex.

I'll be very appreciated if anyone can guide me through generating embedded excel charts with QActivex

    QAxObject *excel = new QAxObject("Excel.Application", 0);
QAxObject *workbook = excel->querySubObject("Workbooks")->querySubObject("Add");
QAxObject *worksheet = workbook->querySubObject("Worksheets(1)");
worksheet->setProperty("Name", "Dati applicazione");
worksheet->querySubObject("Cells(1,1)")->dynamicCall("SetValue", "Serie");
worksheet->querySubObject("Cells(1,2)")->dynamicCall("SetValue", "Dati");

QAxObject *cell;
double dval;
for (int i = 2; i < 10; ++i) {
    dval = qrand();
    cell = worksheet->querySubObject("Cells(int,int)", i, 1);
    cell->dynamicCall("SetValue(int)", i-1);
    cell = worksheet->querySubObject("Cells(int,int)", i, 2);
    cell->dynamicCall("SetValue(double)", dval);
    cell = worksheet->querySubObject("Cells(int,int)",i,3);
    cell->dynamicCall("SetValue(double)", dval/2.0);
    cell = worksheet->querySubObject("Cells(int,int)", i, 4);
    cell->dynamicCall("SetValue(double)", dval/3.0);
}

QAxObject *range = worksheet->querySubObject("Range(A2:C9)");
range->dynamicCall("Select(void)");

QAxObject *chart = workbook->querySubObject("Charts")->querySubObject("Add");
chart->setProperty("Name", "Report Grafico dei dati");
chart->setProperty("Chart Type", 73);

QAxObject *series = chart->querySubObject("SeriesCollection");

QAxObject *serie = series->querySubObject("Item (int)", 1);
QAxObject *xvalues = worksheet->querySubObject("Range(A2:A9)");
QAxObject *yvalues = worksheet->querySubObject("Range(B2:B9)");
serie->setProperty("XValues", xvalues->asVariant());
serie->setProperty("Values", yvalues->asVariant());

serie = series->querySubObject("Item (int)", 2);
yvalues = worksheet->querySubObject("Range(C2:C9)");
serie->setProperty("XValues", xvalues->asVariant());
serie->setProperty("Values", yvalues->asVariant());

serie = series->querySubObject("Item (int)",3);
yvalues = worksheet->querySubObject("Range(D2:D9)");
serie->setProperty("XValues", xvalues->asVariant());
serie->setProperty("Values", yvalues->asVariant());

workbook->dynamicCall("SaveAs(const QString&)", "E:\\test\\test.xls");
workbook->dynamicCall("Close (Bollean)", false);
excel->dynamicCall("Quit (void)");

Solution

  • I've Hope to this code works:

    QAxObject* test = workbook->querySubObject("ActiveSheet");
    QAxObject* charts = test->querySubObject("ChartObjects");
    QList<QVariant> f; f << 200 << 400 << 200 << 200;
    QVariant ch = charts->dynamicCall("Add(int, int, int, int)", f );
    

    But unfortunately it gives this error and I have no idea why

    QAxBase: Error calling IDispatch member ChartObjects: Member not found
    

    Edit: I've changed the second line to below and it worked test->querySubObject("ChartObjects()");