使用 opentbs 生成 odt 时出现问题,同一键的值显示在同一行而不是列中

Problem when generating an odt with opentbs, values of the same key displayed on the same row and not in column

提问人:haruk1515 提问时间:10/26/2022 最后编辑:haruk1515 更新时间:10/28/2022 访问量:45

问:

我正在使用一个名为 OpenTbs 的库来使用 PHP 创建 odt,我使用它是因为动态生成列和行。

我知道如何创建行和列,我不知道如何组织它们。

让我补充一个例子:

所以首先我会在我的 odt 上添加这个,

+-- ---------------------------------------------------+
|    Thin              |    Heavy   |      Total       |
+------------------------------------------------------+
| [b.date]             |            |                  |
+------------------------------------------------------+
| [b.thin;             |            |                  |
| block=tbs:cell;      |            |                  |
|  parallel=tbs:table] |            |                  |
|                      |            |                  |
+------------------------------------------------------+
| [b.heavy]            |            |                  |
+------------------------------------------------------+
| [b.total]            |            |                  |
+------------------------------------------------------+

然后在代码中,我将使用:

<?php
include_once('tbs_class.php');
include_once('plugins/tbs_plugin_opentbs.php');

$TBS = new clsTinyButStrong;
$TBS->Plugin(TBS_INSTALL, OPENTBS_PLUGIN);

$TBS->LoadTemplate('template.odt',OPENTBS_ALREADY_UTF8);
$data = array(
    array('date' => '2013-10-13', 'thin' => 156, 'heavy' => 128, 'total' => 284),
    array('date' => '2013-10-14', 'thin' => 233, 'heavy' =>  25, 'total' => 284),
    array('date' => '2013-10-15', 'thin' => 110, 'heavy' => 412, 'total' => 130),
);
$TBS->MergeBlock('b', $data);



// $TBS->Plugin(OPENTBS_DEBUG_INFO, true); 

$output_file_name ="test_download.odt";
$TBS->Show(OPENTBS_DOWNLOAD, $output_file_name); 
?>

输出:

+ --------------------------------------+
|    Thin    |    Heavy   |   Total     |
+---------------------------------------+
| 156        | 233        | 110         |
+---------------------------------------+
| 128        | 25         | 412         |
+---------------------------------------+
|  284       | 284        | 130         |
+---------------------------------------+

所有接缝都很好,但是如果我们将其与阵列进行比较$data

$data = array(
    array('thin' => 156, 'heavy' => 128, 'total' => 284),
    array('thin' => 233, 'heavy' =>  25, 'total' => 284),
    array('thin' => 110, 'heavy' => 412, 'total' => 130),
);

您将看到它在第一行中仅显示thin

| 156 | 233 | 110 |

在第二行中仅显示heavy

| 128 | 25 | 412 |

在第三行只显示total

| 284 | 284 | 130 |

当在现实中应该显示这样的东西时:

+ --------------------------------------+
|    Thin    |    Heavy   |    Total    |
+---------------------------------------+
|    156     |    128     |    284      |
+---------------------------------------+
|    233     |    25      |    284      |
+---------------------------------------+
|    110     |    412     |    130      |
+---------------------------------------+

然后我意识到,也许将它们彼此放在一起是问题所在。 因此,与其在 ODT 上使用它,不如在 ODT 上使用它

+-- ----------------------------------------------+
|           Thin           |  Heavy   |  Total    |
+-------------------------------------------------+
| [b.thin;                 |          |           |
| block=tbs:cell;          |          |           |
| parallel=tbs:table]      |          |           |
+-------------------------------------------------+
| [b.heavy]                |          |           |
+-------------------------------------------------+
|  [b.total]               |          |           |
+-------------------------------------------------+

我正在用这个

+-- -------------------------------------------+
|    Thin             |    Heavy   |  Total    |
+----------------------------------------------+
|  [b.thin;           |  [b.heavy] | [b.total] |
|  block=tbs:cell;    |            |           |
|  parallel=tbs:table]|            |           |
|                     |            |           |
+----------------------------------------------+

输出:

+----------------------------------------------+
|          |         |         |       |       |
+----------------------------------------------+
|   128    |   25    |   412   |  522  |       |
+----------------------------------------------+

正如你所看到的,它不能很好地遍历数组,并生成空白列,而且显示的数据是随机的

因此,如果有人知道这有什么问题,请告诉我

谢谢!

更新

我意识到,在我使用而不是[r.thin;block=tbs:cell;parallel=tbs:table]cellrow

所以我试着改变它-> ,[r.thin;tbs:row;parallel=tbs:table]

它没有用,但是第一次迭代是正确的:

+ --------------------------------------+
|    Thin    |    Heavy   |   Total     |
+---------------------------------------+
| 156        | 128        | 284         |
+---------------------------------------+
php odt opentbs

评论


答:

1赞 Skrol29 10/28/2022 #1

你得到的结果是关于并行的是正确的。 并行执行一种按列合并,而不是按行合并。featurefeature

对于按行合并,您的模板可能如下所示:

+---------------------------------------------------------------+
| Row number | Thin                     |  Heavy    |  Total    |
+---------------------------------------------------------------+
| [b.#]      | [b.thin;block=tbs:row]   | [b.heavy] | [b.total] |
+---------------------------------------------------------------+

对于按列合并,您的模板可能如下所示:

+-- -----------------------+
|  Row number [b.#]        |
+--------------------------+
| [b.thin;                 |
| block=tbs:cell;          |
| parallel=tbs:table]      |
+--------------------------+
| [b.heavy]                |
+--------------------------+
|  [b.total]               |
+--------------------------+

评论

0赞 haruk1515 10/28/2022
它奏效了!,现在我可以遍历数组并生成行。多谢!!
0赞 haruk1515 10/28/2022
如果您不介意,我还有一个问题,我决定删除列名称(瘦,重,总)并使它们也动态化,所以我正在考虑使用 block=tbs:cell,因为我想只生成一次名称,但它不起作用
0赞 haruk1515 10/28/2022
你知道有什么方法可以做到吗?
0赞 Skrol29 10/30/2022
您可以使用参数删除某些列。请参阅 tinybutstrong.com/opentbs.php?doc#col 最好先删除列,然后再合并行。ope=delcol
0赞 haruk1515 11/8/2022
不,我不想删除列 我想使列的标题动态化(我找到了一个解决方案^^),解决方案是使用两个数组(一个用于值,另一个用于列的名称),用于我使用您的解决方案的列的值,以及我使用的列的名称 [a.headername;block=tbs:单元;]如果有人想知道,“headername”是数组的键 -> $TBS->MergeBlock('a', $col_name);