c++ - 如何制作xls图表?

标签 c++ excel xls

我正在尝试将应用程序数据导出为 xls 图表。

我正在使用 SimpleXlsxWriter 来做这件事.
但是我对这个库有一些问题。


这是我使用这个库得到的

#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

我没有找到如何显示 y 轴、显示水平线、设置 x 轴值、将图表插入数据表等的方法。


这是我想要得到的结果 Test1.png


什么图书馆可以帮助我或我怎样才能得到所需的结果?也许 SimpleXlsxWriter 可以做到这一点?

最佳答案

您可以从 SimpleXlsxWriter 中获得您想要的,只需对您的代码进行一些修改。简而言之:

  • 用SimpleXlsxWriter的格式保存.xlsx而不是.xls
  • 将类别轴添加到您的一个系列并将其设置为第一个数据行
  • 使用 BAR_GROUP_PERCENT_STACKED 因为您希望 y 轴在百分比范围内
  • 您可以控制在图表中添加系列的顺序,以便在底部表格中获得您想要的顺序

考虑这段代码,建议的修改在注释中指出:

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

关于c++ - 如何制作xls图表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42329269/

相关文章:

c++ - 如何从C++中长时间运行的子进程获取输出

vba - Excel VBA抓取Web数据,将输入输入AJAX自动完成不会触发列表

vba - 基于值的慢速宏隐藏行

javascript - 使用 FireFox 下载时无法打开导出为 .xls 的 HTML 表格

java - 如何在java中打开xls文件,保存它,然后将其全部关闭?

c++ - 为什么 chrono::system_clock 返回微秒而 clock_gettime 返回纳秒

c++ - IP 别名与 QWebView (Qt/C++)

c++ - "temporary of type ' A ' has protected destructor", 但它的类型是 B

java - 为什么我使用 JAVA 得到的 Excel 工作表中的行数为 0?

php 导出 xls : the file format and extension of don't match