lfiweb / jsonstat-phpviz
使用 PHP 将 JSON-stat 数据渲染为多维 HTML 表格
Requires
- ext-dom: *
- ext-json: *
Requires (Dev)
- phpoffice/phpspreadsheet: 2.*
- phpunit/phpunit: 10.*
Suggests
- phpoffice/phpspreadsheet: 2.*; Install if you want to render/export JSON-stat as an Excel file
README
使用 PHP 将 JSON-stat v2.0 数据 以任意数量的维度作为 HTML 表格进行渲染。
特性
- 将任意数量和尺寸的维度渲染为 HTML 表格(例如,理论上仅限于内存)。
- 使用任意数量的维度来分组行和列。
- 沿两个或更多轴转换维度
- 使用
<thead>
和<tbody>
元素结构表格 - 自动从 JSON-stat 创建表格
<caption>
- 使用
scope
、colspan
和rowspan
属性渲染列和行标题,为视觉障碍用户提供屏幕阅读器支持 - 设置 CSS 类(
first
和last
)以标识行组的开始和结束(例如,行总计) - 在需要时从渲染中排除尺寸为 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();
示例 2
使用相同 JSON-stat 数据渲染表格,但使用三个维度用于行分组
$reader = new Reader($jsonstat); $table = new TableHtml($reader, 3); $html = $table->render();
示例 3
通过交换维度 A 和维度 D 转置表格
$reader = new Reader($jsonstat); $axes = [3, 1, 2, 0]; $reader->transpose($axes); $table = new TableHtml($reader); $html = $table->render();
有关如何使用轴数组的说明,请参阅 NumPy 转置。
示例 4
包含标题、列单位和行总计以及两个尺寸为 1 的维度的瑞士 NFI 数据的实际示例,这些维度已从渲染中排除
$reader = new Reader($jsonstat); $table = new TableHtml($reader); $table->excludeOneDim = true; $table->noLabelLastDim = true; $html = $table->render();
示例 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,则需要重写以下类:TableHtml
和CellHtml
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
作者
许可证
GNU通用公共许可证v3.0或更高版本
有关完整内容,请参阅COPYING。