You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Navision 2013读取流报错:重复循环中UTF8编码下无法读取

问题分析与解决方案

问题根源

你遇到的问题核心是流状态未被正确重置:第一次循环读取完流后,流的指针停留在末尾(EOS状态),第二次循环时如果没有重新创建流对象,即使重新调用CALCFIELDS,原流对象的EOS状态依然保持,导致READTEXT触发“流已结束”错误。而移除TEXTENCODING::UTF8时,系统默认的流处理可能隐式重置了状态,但这会导致编码乱码,不符合需求。

解决方案

方案1:一次性读取流内容到Text变量(推荐)

逐字符读取流不仅效率低,还容易引发流状态问题。可以直接将流的全部内容读取到Text变量中,再一次性插入到Word表格,同时保留UTF8编码:

JobDescriptionL.CALCFIELDS("Minor Description");

// 一次性读取UTF8编码的流内容到Text变量
MinorDescText := '';
JobDescriptionL."MinorDescription".CREATEINSTREAM(MinorDescStream, TEXTENCODING::UTF8);
MinorDescStream.READTEXT(MinorDescText);

// 直接插入全部内容到Word单元格
wdTable.Cell(J,2).Range.Collapse(0);
wdTable.Cell(J,2).Range.InsertAfter(MinorDescText);

方案2:每次循环重新初始化流

如果必须逐字符处理,确保在Repeat循环的每次迭代中重新创建流对象,而不是复用之前的实例。检查MinorDescStream的声明位置:如果是在Repeat循环外部声明的,每次迭代前需要先释放流(若支持),再重新调用CREATEINSTREAM:

REPEAT
    JobDescriptionL.CALCFIELDS("Minor Description");
    
    // 每次循环都重新创建流,确保状态重置
    JobDescriptionL."MinorDescription".CREATEINSTREAM(MinorDescStream, TEXTENCODING::UTF8);
    WHILE NOT MinorDescStream.EOS DO BEGIN
        CollapseParameter := 0;
        CellData := '';
        wdTable.Cell(J,2).Range.Collapse(CollapseParameter);
        MinorDescStream.READTEXT(CellData,1);
        wdTable.Cell(J, 2).Range.InsertAfter(CellData);
    END;
UNTIL {你的终止条件}

关于BigText的说明

BigText确实不支持通过CREATEINSTREAM指定编码,因此无法直接用它解决编码问题。上述两种方案中,方案1既解决了编码需求,又避免了流状态的困扰,是更优选择。

内容的提问来源于stack exchange,提问作者Coupe de Grace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:13:12