本阶段聚焦 同文稿复制/删除幻灯片、保留格式的表格填值、矩形合并。这些操作全部由 fsys.openXml 原生完成,无需 Office/WPS/.NET。复制已有原生图表时可独立复制图表与内嵌工作簿;创建图表、改图表数据、跨文稿母版导入、近似预览不属于本阶段。
完整示例:~/examples/File/OpenXML/pptx-data.aardio。先生成模板,复制第二页并填入另一组数据,删除临时页,再合并表格单元格。数据是虚构演示值。
import fsys.openXml.pptx.builder;
import fsys.openXml.pptx.editor;
var source,err=fsys.openXml.pptx.builder.write("/data-template.pptx",[
{notes="原始模板";shapes=[{
kind="table";name="Sales";x=60;y=120;width=720;height=180;
fontSize=20;header={fill="17324D";color="FFFFFF"};
rows=[["季度数据","",""],["项目","实际","启用"],["A",0,false]];
merges=[{row=1;column=1;colSpan=3}];
}]},
{shapes=[{text="临时页,将被删除"}]}
]);
if(!source)return null,err;
var doc,err=fsys.openXml.pptx.editor.open(source);
if(!doc)return null,err;
var copy,err=doc.copySlide(1); // 副本现在位于第2页
if(!copy){doc.close();return null,err;}
var count,err=doc.setTableCells(2,"Sales",[["B",120,true]],{row=3;column=1});
if(count===null){doc.close();return null,err;}
var count,err=doc.deleteSlide(3); // 页号总是按当前顺序
if(count===null){doc.close();return null,err;}
var output,err=doc.save("/data-filled.pptx");
doc.close();
return output,err;
默认不覆盖源件或已有输出。需要覆盖测试输出时可显式传 overwrite=true;无论如何都不能覆盖编辑会话的源文档/可识别硬链接别名。
doc.copySlide(page,insertAt) 返回 {index,id,partName,relationshipId,copiedParts}。
page 是复制前的当前页号,insertAt 是复制后的位置,均从1开始;默认紧接原页。最多1000页。doc.deleteSlides([1,3],options) 原子删除指定页,返回删除数;deleteSlide(page,options) 是单页便捷方法。数组的页号都指 调用开始时 的当前页序;重复、越界和空洞拒绝。空数组返回0;普通演示允许删到零页。
{links="remove"} 才移除支持的 hlinkClick/hlinkMouseOver,文字与形状本身保留。links="remove" 也拒绝。getTable(page,target):target 为表格形状ID或唯一名称。返回 id,name,rows,merges,rowCount,columnCount,columnWidths,rowHeights,宽高单位point。rows 是矩形物理网格文字,合并覆盖格不缩掉。
setTableCells(page,target,values,{row=1;column=1}) 填矩形区域;setTableCell(page,target,row,column,value) 填一格。
0、false、空串各自保留。null 是跳过,"" 是清空。返回被写入的逻辑格数(0合法),失败 null,err。null/"" 占位并跳过,非空值拒绝。不把对覆盖格的写入偷偷重定向到锚点。'\v'),TAB和首尾空格保留。生成阶段:kind="table" 的 merges=[{row,column,rowSpan,colSpan}]。行列从1开始,跨度默认1,至少覆盖两格;保持完整 rows 网格,被覆盖格必须为空。越界/重叠/隐藏非空数据拒绝。
编辑阶段:mergeTableCells(page,target,{row=1;column=1;rowSpan=2;colSpan=2},options)。
content="error",覆盖格非空就失败,避免丢失数据。content="append" 时把各格段落按行优先追加到左上格,保留段落/运行格式,再清空覆盖格。空锚点不会额外制造开头空段。仅支持合法 DrawingML 原生矩形表格,不把图片、SmartArt或图表冒充表格。已有不一致的合并标记拒绝。
原生生成样本、编辑往返、未改部件字节、失败原子性及关键 Office 属性均有自动测试。Office 产生的复杂图表可能带旧版 SDK 不识别的扩展;复制应保留原字节并比较源件诊断,不能删除扩展来伪造零错误。WPS/其他 Office 版本仍需用实际交付样本验收。