提问人:haruk1515 提问时间:10/26/2022 最后编辑:haruk1515 更新时间:10/28/2022 访问量:45
使用 opentbs 生成 odt 时出现问题,同一键的值显示在同一行而不是列中
Problem when generating an odt with opentbs, values of the same key displayed on the same row and not in column
问:
我正在使用一个名为 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]
cell
row
所以我试着改变它-> ,[r.thin;tbs:row;parallel=tbs:table]
它没有用,但是第一次迭代是正确的:
+ --------------------------------------+
| Thin | Heavy | Total |
+---------------------------------------+
| 156 | 128 | 284 |
+---------------------------------------+
答:
1赞
Skrol29
10/28/2022
#1
你得到的结果是关于并行的是正确的。
并行执行一种按列合并,而不是按行合并。feature
feature
对于按行合并,您的模板可能如下所示:
+---------------------------------------------------------------+
| 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);
评论