lfiweb/jsonstat-phpviz

使用 PHP 将 JSON-stat 数据渲染为多维 HTML 表格

3.1 2024-09-11 14:53 UTC

This package is auto-updated.

Last update: 2024-09-12 09:44:17 UTC


README

使用 PHP 将 JSON-stat v2.0 数据 以任意数量的维度作为 HTML 表格进行渲染。

特性

  • 将任意数量和尺寸的维度渲染为 HTML 表格(例如,理论上仅限于内存)。
  • 使用任意数量的维度来分组行和列。
  • 沿两个或更多轴转换维度
  • 使用 <thead><tbody> 元素结构表格
  • 自动从 JSON-stat 创建表格 <caption>
  • 使用 scopecolspanrowspan 属性渲染列和行标题,为视觉障碍用户提供屏幕阅读器支持
  • 设置 CSS 类(firstlast)以标识行组的开始和结束(例如,行总计)
  • 在需要时从渲染中排除尺寸为 1 的维度(当从索引 0 连续排序时)
  • 将表格导出(渲染)为制表符分隔值(tsv)或您选择的任何字符(csv)。
  • 以 LibreOffice Calc(ods)或 MS Excel 格式(xlsx)下载(渲染)表格。

未实现

  • child 属性,例如,不同类别之间的层次关系

用法

示例 1

从具有大小 [3,2,4,2](= 形状)的四个维度 JSON-stat 数据渲染一个表格。两个维度自动用于分组行

<?php

use jsonstatPhpViz\Reader;
use jsonstatPhpViz\Renderer\TableHtml;

require_once __DIR__.'/../vendor/autoload.php';

$filename = 'integer.json';
$json = file_get_contents($filename);
$jsonstat = json_decode($json);

$reader = new Reader($jsonstat);
$table = new TableHtml($reader);
$html = $table->render();

screenshot-01

示例 2

使用相同 JSON-stat 数据渲染表格,但使用三个维度用于行分组

$reader = new Reader($jsonstat);
$table = new TableHtml($reader, 3);
$html = $table->render();

screenshot-02

示例 3

通过交换维度 A 和维度 D 转置表格

$reader = new Reader($jsonstat);
$axes = [3, 1, 2, 0];
$reader->transpose($axes);
$table = new TableHtml($reader);
$html = $table->render();

有关如何使用轴数组的说明,请参阅 NumPy 转置screenshot-03

示例 4

包含标题、列单位和行总计以及两个尺寸为 1 的维度的瑞士 NFI 数据的实际示例,这些维度已从渲染中排除

$reader = new Reader($jsonstat);
$table = new TableHtml($reader);
$table->excludeOneDim = true;
$table->noLabelLastDim = true;
$html = $table->render();

screenshot-04

示例 5

将表格渲染为逗号分隔值(csv)

$reader = new Reader($jsonstat);
$table = new \jsonstatPhpViz\Renderer\TableTsv($reader);
$table->separatorCol = ",";
$html = $table->render();

安装

使用 composer require lfiweb/jsonstat-phpviz 安装或将其添加到您的 composer.json 中

依赖项

无。但如果您想以 ODF 电子表格(ods)或 MS Excel 格式(xlsx)导出表格,则需要 PhpSpreadsheet。您可以使用 composer require phpoffice/phpspreadsheet 安装它。

JSON-stat 渲染规则

在生成 HTML 表格时,渲染器应用以下规则

  • 从左到右读取维度的尺寸,并按该顺序渲染
  • 维度 1、...、n-2 用于分组行(可以手动设置为任何小于等于 n 的数字)
  • 最后一个倒数第二个维度 n-1 用作第一个、外层列
  • 最后一个维度用作最内层列
  • 使用 label 属性作为标题(可以手动设置为 null 或任何字符串)

JSON-stat 中的 HTML

注意:仅在您信任 JSON-stat 的来源时才执行此操作。

渲染器(或者说DOMDocument)在将JSON-stat中的所有HTML内容插入DOM时都会进行转义。如果您想在表格单元格中允许HTML,则需要重写以下类:TableHtmlCellHtml

class MyRendererTable extends TableHtml
{
    /**
     * Override with the new html cell renderer.
     * @return void
     */
    protected function newCellRenderer(): CellInterface
    {
        $formatter = new FormatterCell($this->reader);
        return new MyCellHtml($formatter, $this->reader, $this);
    }
}

class MyCellHtml extends CellHtml
{
    // render html inside label (header) cells
    public function addCellHeader(DOMElement $row, ?string $str = null, ?string $scope = null, ?string $colspan = null, ?string $rowspan = null): DOMElement
    {
        $cell = parent::headerCell($row, $str, $scope, $colspan, $rowspan);
        $cell->textContent = '';
        UtilHtml::append($cell, $str);

        return $cell;
    }
}

注意

注意1:当渲染具有rowspan的表格(useRowSpans属性为true)时,由于每行的单元格数量不规则,应用CSS可能会变得复杂。

注意2:最初,此代码直接从其JavaScript对应版本jsonstat-viz翻译而来,但后来已经独立开发。@see https://github.com/speich/jsonstat-viz

作者

Simon Speich瑞士国家森林调查

许可证

GNU通用公共许可证v3.0或更高版本
有关完整内容,请参阅COPYING