xv1t/opendocument-template

将多维数据渲染到报告中

0.2 2016-10-24 13:32 UTC

This package is not auto-updated.

Last update: 2024-09-18 20:17:43 UTC


README

##快速生成 OpenDocument 报告 支持文件: ODSODT

创建模板的推荐软件

  • LibreOffice
  • OpenOffice

您的报告文件已正确打开在

  • LibreOffice
  • OpenOffice
  • MS Office >=2010

快速手动(ods)

  1. 创建模板 ods 文件
  2. 放置元素
  3. 标记范围
  4. 从数据库加载数据
  5. 通过模板文件将数据渲染到新的 ods 文件
  6. 在 LibreOffice Calc 或其他软件中打开并享受

需求

PHP 扩展

  • zip
  • xml

PHP 版本 >=5.3

推荐模板软件:LibreOffice 5

安装

将文件 OpenDocumentTemplate.php 放入您的项目,并使用它

<?php
include_once "OpenDocumentTemplate.php";

//create object

$template = new OpenDocumentTemplate();

第一个简单报告

准备您的数据

数据 - 是 PHP 中的数组。建议所有对象字段按对象名称分组。

<?php
$data = array(
    'Report' => array(
        'name' => 'Test Report',
        'date' => '2016-09-25',
        'author' => 'Me'
    )
);

所有字段都分组在 Report 父数组中。这种命名方法提供了一种强大的多维数据技术。

设计模板文件

打开 LibreOffice Calc。创建新的电子表格;

为以下内容添加 3 个单元格

保存为 sample_report.ods

使用数据渲染模板

<?php
$template->open('sample_report.ods', 'sample_report-out.ods', $data)

然后打开新文件 sample_report-out.ods,您会在表格中看到

添加第二个维度

为对象列表添加键 Cities

<?php
$data = array(
    'Report' => array(/* main Report data */),
    'Cities' => array(
        array(/* city data */),
        array(/* city data */),
        array(/* city data */),
        array(/* city data */),
    )
);

所有 Cities 对象必须具有相同字段的列表。在我们的例子中: namestreetspopulation

<?php

//Sample of one City object
array(
    'City' => array(
        'name' => 'Albatros',
        'streets' => 165,
        'population' => 1300000
    )
);

和所有数据

$data = array(
    'Report' => array(
        'name' => 'Test Report',
        'date' => '2016-09-25',
        'author' => 'Me'
    ),
    'Cities' => array(
        array( //first object
            'City' => array(
                'name' => 'Albatros',
                'streets' => 165,
                'population' => 1300000
            )
        ),
        array( //next object
            'City' => array(
                'name' => 'Turtuga',
                'streets' => 132,
                'population' => 750000
            )
        ),
        array( //next object
            'City' => array(
                'name' => 'Palmtown',
                'streets' => 18,
                'population' => 10000
            )
        ),
    )
);

添加其他对象作为线性维度

在兄弟键 Mayor 中添加每个城市的市长信息

<?php

$data = array(
    'Report' => array(/*...*/),
    'Cities' => array(
        array(
            'City' => array(/*...*/),
            'Mayor' => array(
                'name' => 'John Do',
                'old' => 47
            ),
        ),
        array(
            'City' => array(/*...*/),
            'Mayor' => array(
                'name' => 'Mary Ann',
                'old' => 32
            ),
        ),
        array(
            'City' => array(/*...*/),
            'Mayor' => array(
                'name' => 'Mike Tee',
                'old' => 29
            ),
        ),
    )
);

添加第三个维度

为每个城市中的广场列表添加键 Squares

<?php
$data = array(
    'Report' => array(/*...*/),
    'Cities' => array(
        array(
            'City'  => array(/*...*/),
            'Mayor' => array(/*...*/),
            'Squares' => array(
                array(/*...*/),
                array(/*...*/),
                array(/*...*/),
            )
        ),
        array(
            'City'  => array(/*...*/),
            'Mayor' => array(/*...*/),
            'Squares' => array(
                array(/*...*/),
                array(/*...*/),
                array(/*...*/),
                array(/*...*/),
                array(/*...*/),
            )
        ),
        array(
            'City'  => array(/*...*/),
            'Mayor' => array(/*...*/),
            'Squares' => array(
                array(/*...*/),
                array(/*...*/),
            )
        ),
       
    )
);

广场对象示例

<?php
array(
    'Sqaure' => array(
        'name' => 'Trafalgaar',
        'length' => 23,
        'width' => 45
    )
)

和数据 $data 的最终版本

<?php

$data = array(
    //level1
    'Report' => array(
        'name'   => 'Test Report',
        'date'   => '2016-09-25',
        'author' => 'Me'
    ),
    'Cities' => array(
        array(
            //level 2
            'City' => array(
                'name'       => 'Albatros',
                'streets'    => 165,
                'population' => 1300000
            )
            'Mayor' => array(
                'name' => 'John Do',
                'old'  => 47
            ),
            'Squares' => array(
                array(
                    //level 3
                    'Sqaure' => array(
                        'name'   => 'Trafalgaar',
                        'length' => 23,
                        'width'  => 45
                    )
                ),
                array(
                    'Sqaure' => array(
                        'name'   => 'Square #2',
                        'length' => 23,
                        'width'  => 45
                    )
                ),
                array(
                    'Sqaure' => array(
                        'name'   => 'Square #3',
                        'length' => 23,
                        'width'  => 45
                    )
                ),
            )
        ),
        array(
            'City' => array(
                'name'       => 'Turtuga',
                'streets'    => 132,
                'population' => 750000
            )
            'Mayor' => array(
                'name' => 'Mary Ann',
                'old'  => 32
            ),
            'Squares' => array(
                array(
                    'Sqaure' => array(
                        'name'   => 'Square #4',
                        'length' => 23,
                        'width'  => 45
                    )
                ),
                array(
                    'Sqaure' => array(
                        'name'   => 'Square #5',
                        'length' => 23,
                        'width'  => 45
                    )
                ),
            )
        ),
        array(
            'City' => array(
                'name'       => 'Palmtown',
                'streets'    => 18,
                'population' => 10000            
            ),
            'Mayor' => array(
                'name' => 'Mike Tee',
                'old'  => 29
            ),
            'Squares' => array(
                array(
                    'Sqaure' => array(
                        'name'   => 'Square #6',
                        'length' => 23,
                        'width'  => 45
                    )
                ),
                array(
                    'Sqaure' => array(
                        'name'   => 'Square #7',
                        'length' => 23,
                        'width'  => 45
                    )
                ),
                array(
                    'Sqaure' => array(
                        'name'   => 'Square #8',
                        'length' => 23,
                        'width'  => 45
                    )
                ),
            )
        ),
    )
);

设计电子表格

好吧,我们有一个 3 级维度的对象数组

在 LibreOffice Calc 中它们被称为 范围名称

插入 -> 名称 -> 管理

示例