2017-02-19 1 views
2

Ich versuche, Anwendungsdaten als XLS-Diagramm zu exportieren.Wie man xls Diagramme macht?

Ich mache es mit SimpleXlsxWriter.
Aber ich habe ein paar Probleme mit dieser lib.


Hier ist, was ich diese lib bekam mit

#include <Xlsx/Workbook.h> 

int main() 
{ 
    using namespace SimpleXlsx; 

    CWorkbook book; 
    CWorksheet &data = book.AddSheet("Data"); 

    std::vector<CellDataDbl> header = { 1, 3, 5, 6, 8 }; 
    std::vector<CellDataDbl> data1 = { 2, 6, 4, 8, 5 }; 
    std::vector<CellDataDbl> data2 = { 5, 3, 5, 2, 4 }; 

    data.AddRow(header); 
    data.AddRow(data1); 
    data.AddRow(data2); 

    CChartsheet &chart = book.AddChart("Chart", CHART_BAR); 
    chart.SetBarDirection(CChartsheet::BAR_DIR_VERTICAL); 
    chart.SetBarGrouping(CChartsheet::BAR_GROUP_STACKED); 
    chart.SetTableDataState(CChartsheet::TBL_DATA); 
    chart.SetLegendPos(CChartsheet::EPosition::POS_TOP); 

    CChartsheet::Series ser1; 
    ser1.valAxisFrom = CellCoord(1, 0); 
    ser1.valAxisTo = CellCoord(1, data1.size() - 1); 
    ser1.valSheet = &data; 
    ser1.title  = "Ser1"; 

    CChartsheet::Series ser2; 
    ser2.valAxisFrom = CellCoord(2, 0); 
    ser2.valAxisTo = CellCoord(2, data2.size() - 1); 
    ser2.valSheet = &data; 
    ser2.title  = "Ser2"; 

    chart.AddSeries(ser1); 
    chart.AddSeries(ser2); 

    book.Save("test.xls"); 
} 

Test.png

ich nicht die Art und Weise gefunden, wie y-Achsen zu zeigen, zeigen, horizontale Linien, Set x-Achsen-Werte, Fügen Sie das Diagramm in das Datenblatt usw. ein.


Folgendes möchte ich als ErgebnisbekommenTest1.png


Was für eine Bibliothek kann mir helfen, oder wie kann ich ein gewünschtes Ergebnis zu bekommen? Vielleicht SimpleXlsxWriter kann das tun?

+0

Werfen Sie einen Blick auf [** 'this' **] (http://xlsxwriter.readthedocs.io/chart.html#chart-set- y-Achse). – ManishChristian

Antwort

1

Sie können bekommen, was Sie wollen, von der SimpleXlsxWriter, nur mit ein paar Änderungen Ihres Codes. Kurz:

  • speichern mit SimpleXlsxWriter das Format .xlsx nicht .xls
  • eine Kategorie Achse zu einem Ihrer Serie hinzufügen und es zu ersten Datenreihe gesetzt
  • Verwendung BAR_GROUP_PERCENT_STACKED, da Sie die y-Achse ist auf% -Skala wollen
  • Sie die Reihenfolge steuern, können Sie die Serie, die das Diagramm hinzufügen, die Reihenfolge Sie in der unteren Tabelle den Code

Betrachten Sie wollen zu bekommen, sugges ted Modifikationen sind in den Kommentaren angegeben:

int main() 
{ 
    using namespace SimpleXlsx; 

    CWorkbook book; 
    CWorksheet &data = book.AddSheet("Data"); 

    std::vector<CellDataDbl> header = { 1, 3, 5, 6, 8 }; 
    std::vector<CellDataDbl> data1 = { 2, 6, 4, 8, 5 }; 
    std::vector<CellDataDbl> data2 = { 5, 3, 5, 2, 4 }; 

    data.AddRow(header); 
    data.AddRow(data1); 
    data.AddRow(data2); 

    CChartsheet &chart = book.AddChart("Chart", CHART_BAR); 
    chart.SetBarDirection(CChartsheet::BAR_DIR_VERTICAL); 
    chart.SetBarGrouping(CChartsheet::BAR_GROUP_PERCENT_STACKED); // <-- seems you want this format? 
    chart.SetTableDataState(CChartsheet::TBL_DATA); 
    chart.SetLegendPos(CChartsheet::EPosition::POS_TOP); 

    chart.SetYAxisGrid(CChartsheet::EGridLines::GRID_MAJOR); // <-- to draw the horizontal lines 

    CChartsheet::Series ser1; 
    ser1.valSheet = &data; 
    ser1.valAxisFrom = CellCoord(1, 0); 
    ser1.valAxisTo = CellCoord(1, data1.size() - 1); 
    ser1.title  = "Ser1"; 

    // Now add a category axis from your the first row of the data sheet 
    ser1.catAxisFrom = CellCoord(0, 0); 
    ser1.catAxisTo = CellCoord(0, data1.size() - 1); 
    ser1.catSheet = &data; 

    CChartsheet::Series ser2; 
    ser2.valSheet = &data; 
    ser2.valAxisFrom = CellCoord(2, 0); 
    ser2.valAxisTo = CellCoord(2, data2.size() - 1); 
    ser2.title  = "Ser2"; 

    // insert the series in the order you want from the bottom up in the chart's table 
    chart.AddSeries(ser2); 
    chart.AddSeries(ser1); 

    book.Save("c:\\so\\test.xlsx"); // <-- Save as xlsx, not xls 
} 

Resulting Chart

+0

Das Hinzufügen einer Kategorieachse funktioniert gut. Was ist mit den y-Werten auf der linken Seite und den horizontalen Linien? – Ufx

+0

Die horizontalen Linien können gezeichnet werden mit 'chart.SetYAxisGrid (GRID_MAJOR);' (Ich fügte das dem Code hinzu. Verwenden Sie GRID_MINOR für ein dichteres Gitter). Für die Y-Achse tut mir leid, dass ich nicht genau das bekommen habe, was du machen willst, hast du überhaupt eine Achse? oder meinst du, dass du die Etiketten kontrollieren willst? weil es scheint, dass die Kontrolle darüber irgendwie begrenzt ist. –

+0

Ich meine Y-Werte und horizontale Linien wie diese https://i.stack.imgur.com/MMy7i.png. Jetzt bekomme ich https://i.stack.imgur.com/ZLBVk.png und ich fürchte, dass deine letzte Bearbeitung es nicht gelöst hat. – Ufx