Highcharts CSV экспорт, неправильная дата - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть API, который возвращает данные в формате JSON, например:

[  
   {  
      "name":"Something",
      "data":[  
         {  
            "x":1541096421,
            "y":2
         },{  
            "x":1541436378,
            "y":4
         },{  
            "x":1553621371,
            "y":2
         }
       ]
   },{  
      "name":"Something else",
      "data":[  
         {  
            "x":1541096421,
            "y":2
         },{  
            "x":1541436378,
            "y":4
         },{  
            "x":1553621371,
            "y":2
         }
       ]
   }
]

Ось x представляет дату / время, а ось y - оценку.Он нанесен на диаграмму, подобную этой, с использованием некоторого форматирования для преобразования даты из метки времени в миллисекунды в читаемый формат даты:

        function renderChart(data) {
            $('#chartContainer').highcharts({
                chart: {
                    type: 'scatter',
                    zoomType: 'xy'
                },
                title: {
                    text: chartTitle()
                },
                xAxis: {
                    allowDecimals: false,
                    title: {
                        text: 'Date completed',
                        scalable: false
                    },
                    type: 'datetime',
                    labels: {
                        formatter: function () {
                            if (true) {
                                return Highcharts.dateFormat('%d-%b-%y', moment.unix(this.value));
                            }
                            else {
                                if (this.value > 0 && this.value < 24) {
                                    return this.value;
                                }
                                else
                                    return 0;

                            }
                        }
                    },
                    tickPixelInterval: 100
                },
                yAxis: {
                    title: {
                        text: 'Score'
                    }
                },
                plotOptions: {
                    scatter: {
                        marker: {
                            radius: 5
                        }
                    }
                },
                series: data,
                exporting: {
                    buttons: {
                        contextButton: {
                            menuItems: Highcharts.getOptions().exporting.buttons.contextButton.menuItems.filter(item => item !== 'openInCloud')
                        }
                    }
                    // Tried adding this but it doesn't make any difference:
                    /*,
                    csv: {
                        dateFormat: '%d/%m/%Y'
                    }*/
                },
                tooltip: {
                    formatter: function () {
                        return 'Score of <b>' + this.y + '</b> posted on <b>' + Highcharts.dateFormat('%d-%b-%y', moment.unix(this.x)) + '</b>';
                    }
                }
            });
        }

Это прекрасно работает.Однако, когда я нажимаю «экспортировать в CSV» на графике Highchart во внешнем интерфейсе, он выводит файл CSV, где дата всегда отображается как «18/01/1970».Очевидно, это как-то связано с тем, что API возвращает значение метки времени, но я не понимаю, как я могу изменить формат в CSV, подобно тому, как это делается в коде рендеринга диаграммы.

МожетКто-нибудь посоветует, как (желательно без изменения данных, возвращаемых API), чтобы CSV вывел правильную дату в формате день / месяц / год?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Это можно легко сделать, обернув метод Highcharts.Chart.prototype.getDataRows и отобразив массив данных, который используется для экспорта. Проверьте демо и код, размещенный ниже.

Код:

(function(H) {
  H.wrap(H.Chart.prototype, 'getDataRows', function(proceed, multiLevelHeaders) {

    var rows = proceed.call(this, multiLevelHeaders);

    rows = rows.map(row => {
      if (row.x) {
        row[0] = Highcharts.dateFormat('%d-%b-%y', row.x * 1000);
      }
      return row;
    });

    return rows;
  });
}(Highcharts));

Демо-версия:

Docs:

0 голосов
/ 05 апреля 2019

Согласно комментарию @ Core972, проблема здесь связана с меткой времени в API, возвращающей дату в виде секунд, а не миллисекунд. Я не верю, что в экспорте CSV существует способ манипулирования форматом даты, поэтому потребуется изменение API, который возвращает данные.

Ответ Войцеха Чмеля показывает, как переопределить вывод Highchart для переформатирования даты из неидеального источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...