OpenTBS生成ODT动态列失败求助:无法迭代生成多列
解决OpenTBS生成ODT动态列的报错与数据循环问题
问题根源
block=td报错的原因:ODT文档的表格单元格是XML元素<table:table-cell>,而非HTML的<td>,OpenTBS无法识别td作为块类型,必须使用对应ODT的tbs:cell。- 仅显示第一组数据的原因:模板未正确配置
parallel=tbs:table的作用范围,且用纯文本模拟的表格无法被OpenTBS识别为原生表格结构,导致横向循环失效。
正确解决方案
1. 重构ODT模板(必须用原生表格)
在LibreOffice/OpenOffice中插入4行2列的原生表格,然后在对应单元格中插入以下TBS标签:
| 单元格内容 | TBS标签 |
|---|---|
| Category | [b.date;block=tbs:cell;parallel=tbs:table] |
| Thin | [b.thin;block=tbs:cell] |
| Heavy | [b.heavy;block=tbs:cell] |
| Total | [b.total;block=tbs:cell] |
注意:
- 禁止用纯文本画竖线模拟表格,必须使用ODT的原生表格组件,否则OpenTBS无法解析表格结构。
parallel=tbs:table只需添加在第一个循环标签(即[b.date]所在单元格),它会触发整个表格的每行同步生成对应列,实现横向循环。
2. PHP代码无需修改
你的现有PHP代码逻辑正确,直接复用即可:
<?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); ?>
效果说明
修改模板后,生成的ODT文档会按照预期横向生成多列数据,每个数组项对应一列,最终效果与你期望的一致。
内容的提问来源于stack exchange,提问作者haruk1515
相关产品推荐
相关产品推荐

