将 Blob 从 Navision 发送到 Javascript 加载项
Send a Blob From Navision to a Javascript Add In
我在 NAV 中有一个 Blob 对象,它代表一个 Excel 文档。我希望此文档显示在我的 JavaScript Control AddIn(Web 和 Windows-Client 中的 运行)中。但我不确定如何处理这个问题。稍后在 AddIn 中,我需要将 Blob 作为二进制字符串。
到目前为止,我尝试了两件事。
先试试
我用这个方法建立了一个接口
[ApplicationVisible]
void SetExcelDocument(ExcelDocument ExcelDocument);
和 ExcelDocument
- 对象看起来像这样
[Serializable]
public class ExcelDocument
{
//Constructor
public ExcelDocument()
{
CurrentExcelDocument = null;
}
//store Blob
public Stream CurrentExcelDocument { get; set; }
}
所以在 NAV 中,我将 Blob 转换为 .Net MemoryStream 变量,如下所示
MemStream DotNet System.IO.System.IO.MemoryStream.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
和这样的代码
TechnicalSpreadsheet.CALCFIELDS(Document); //Get Blob (Document is table column name)
TechnicalSpreadsheet.Document.CREATEINSTREAM(Lstr_BlobInstream);
MemStream := MemStream.MemoryStream();
COPYSTREAM(MemStream,Lstr_BlobInstream);
ExcelDocument := ExcelDocument.ExcelDocument; //Initialize Object
ExcelDocument.CurrentExcelDocument := MemStream; //set MemoryStream
CurrPage.spreadsheet.SetExcelDocument(ExcelDocument); //Call function in AddIn
当加载项准备就绪时执行代码。 Nav 变量 ExcelDocument
定义为 this
ExcelDocument DotNet <Reference to Object here>, Version=8.0.0.0, Culture=neutral, PublicKeyToken=d02dbb9bbac93844'
所以这里的问题是,当 属性 "RunOnClient" 设置为 yes 时,我只能在 NAV 中设置 ExcelDocument
的实例。但这不适用于 WebClient (Source)。但是,即使将 属性 设置为 yes,也不会将数据发送到 AddIn。
第二次尝试
第二次尝试时,我更改了数据类型。所以我使用 byte[]
而不是流。所以我把界面改成了这个
[ApplicationVisible]
void SetExcelDocument(byte[] ExcelDocument);
并且刚刚将 NAV 中的 AddIn 函数调用更改为此
CurrPage.spreadsheet.SetExcelDocument(MemStream.ToArray); //Call function in AddIn
并删除了 ExcelDocument
变量。
这有效,但数据看起来不像二进制数据。在 web 控制台中显示时,我会期待一些不可读的东西,但我得到的是可读的字母和数字。而且我不确定如何将其转换为二进制字符串。
Vjeko 有一些不错的 input,但这对我也不起作用。
我有这段代码可以将二进制节点添加到 XML 文件。通过这个我能够将文件作为二进制数据发送到 Web 服务。尝试使用它也许会有所帮助。它使用 ActiveX,因为它是为 Nav 5 编写的。您可以将其替换为 .net。
pNodeName@1210000 : Text[50];VAR pXMLDoc@1210001 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{88D96A05-F192-11D4-A65F-0040963251E5}:'Microsoft XML, v6.0'.DOMDocument60";pPath@1210002 : Text[1024]);
Att@1210009 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMElement";
parent@1210008 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMElement";
AdoStream@1210003 : Automation "{B691E011-1797-432E-907A-4D8C69339129} 6.1:{00000566-0000-0010-8000-00AA006D2EA4}:'Microsoft ActiveX Data Objects 6.1 Library'.Stream";
Att := pXMLDoc.createElement(pNodeName);
CREATE(AdoStream, TRUE);
AdoStream.Type := 1; //Binary
AdoStream.Open();
AdoStream.LoadFromFile(pPath);
Att.dataType('bin.hex');
Att.nodeTypedValue := AdoStream.Read;
AdoStream.Close();
parent := pXMLDoc.documentElement;
parent.appendChild(Att);
我找到了将 blob 发送到 JavaScript Control AddIn 的解决方案。这是我所做的。
在控件AddIn的界面中我定义了方法
[ApplicationVisible]
void SetExcelDocument(ExcelDocument exceldoc);
其中 ExcelDocument
- 对象看起来像这样
[Serializable]
public class ExcelDocument
{
public string ExcelJson; //Excel Content stored in JSON format
public byte[] Excel
{
get
{
return null; //Not needed in the AddIn
}
set
{
IConverter converter = new Converter();
ExcelJson = converter.ArrayBufferOfExcelDocToJson(value);
}
}
}
魔术现在正在新 Converter
- class 中发生。不久我将字节数组转换为流,然后在 EPPlus 的帮助下读取流(分别为 Excel 文档),最后将带有 Newtonsoft.JSON 的文档内容转换为 Json 字符串(变量 ExcelJson
).
在 NAV 中它看起来像这样。
//Get Blob (Document is table column name)
TechnicalSpreadsheet.Document.CREATEINSTREAM(Lstr_BlobInstream);
//init Memory Stream
MemStream := MemStream.MemoryStream();
COPYSTREAM(MemStream,Lstr_BlobInstream);
//Init DotNet Variable
ExcelDocument := ExcelDocument.ExcelDocument;
//Set byte[]
ExcelDocument.Excel := MemStream.GetBuffer;
//Call function in AddIn
CurrPage.spreadsheet.SetExcelDocument(ExcelDocument);
这对我有用。
我在 NAV 中有一个 Blob 对象,它代表一个 Excel 文档。我希望此文档显示在我的 JavaScript Control AddIn(Web 和 Windows-Client 中的 运行)中。但我不确定如何处理这个问题。稍后在 AddIn 中,我需要将 Blob 作为二进制字符串。
到目前为止,我尝试了两件事。
先试试
我用这个方法建立了一个接口
[ApplicationVisible]
void SetExcelDocument(ExcelDocument ExcelDocument);
和 ExcelDocument
- 对象看起来像这样
[Serializable]
public class ExcelDocument
{
//Constructor
public ExcelDocument()
{
CurrentExcelDocument = null;
}
//store Blob
public Stream CurrentExcelDocument { get; set; }
}
所以在 NAV 中,我将 Blob 转换为 .Net MemoryStream 变量,如下所示
MemStream DotNet System.IO.System.IO.MemoryStream.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
和这样的代码
TechnicalSpreadsheet.CALCFIELDS(Document); //Get Blob (Document is table column name)
TechnicalSpreadsheet.Document.CREATEINSTREAM(Lstr_BlobInstream);
MemStream := MemStream.MemoryStream();
COPYSTREAM(MemStream,Lstr_BlobInstream);
ExcelDocument := ExcelDocument.ExcelDocument; //Initialize Object
ExcelDocument.CurrentExcelDocument := MemStream; //set MemoryStream
CurrPage.spreadsheet.SetExcelDocument(ExcelDocument); //Call function in AddIn
当加载项准备就绪时执行代码。 Nav 变量 ExcelDocument
定义为 this
ExcelDocument DotNet <Reference to Object here>, Version=8.0.0.0, Culture=neutral, PublicKeyToken=d02dbb9bbac93844'
所以这里的问题是,当 属性 "RunOnClient" 设置为 yes 时,我只能在 NAV 中设置 ExcelDocument
的实例。但这不适用于 WebClient (Source)。但是,即使将 属性 设置为 yes,也不会将数据发送到 AddIn。
第二次尝试
第二次尝试时,我更改了数据类型。所以我使用 byte[]
而不是流。所以我把界面改成了这个
[ApplicationVisible]
void SetExcelDocument(byte[] ExcelDocument);
并且刚刚将 NAV 中的 AddIn 函数调用更改为此
CurrPage.spreadsheet.SetExcelDocument(MemStream.ToArray); //Call function in AddIn
并删除了 ExcelDocument
变量。
这有效,但数据看起来不像二进制数据。在 web 控制台中显示时,我会期待一些不可读的东西,但我得到的是可读的字母和数字。而且我不确定如何将其转换为二进制字符串。
Vjeko 有一些不错的 input,但这对我也不起作用。
我有这段代码可以将二进制节点添加到 XML 文件。通过这个我能够将文件作为二进制数据发送到 Web 服务。尝试使用它也许会有所帮助。它使用 ActiveX,因为它是为 Nav 5 编写的。您可以将其替换为 .net。
pNodeName@1210000 : Text[50];VAR pXMLDoc@1210001 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{88D96A05-F192-11D4-A65F-0040963251E5}:'Microsoft XML, v6.0'.DOMDocument60";pPath@1210002 : Text[1024]);
Att@1210009 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMElement";
parent@1210008 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMElement";
AdoStream@1210003 : Automation "{B691E011-1797-432E-907A-4D8C69339129} 6.1:{00000566-0000-0010-8000-00AA006D2EA4}:'Microsoft ActiveX Data Objects 6.1 Library'.Stream";
Att := pXMLDoc.createElement(pNodeName);
CREATE(AdoStream, TRUE);
AdoStream.Type := 1; //Binary
AdoStream.Open();
AdoStream.LoadFromFile(pPath);
Att.dataType('bin.hex');
Att.nodeTypedValue := AdoStream.Read;
AdoStream.Close();
parent := pXMLDoc.documentElement;
parent.appendChild(Att);
我找到了将 blob 发送到 JavaScript Control AddIn 的解决方案。这是我所做的。
在控件AddIn的界面中我定义了方法
[ApplicationVisible]
void SetExcelDocument(ExcelDocument exceldoc);
其中 ExcelDocument
- 对象看起来像这样
[Serializable]
public class ExcelDocument
{
public string ExcelJson; //Excel Content stored in JSON format
public byte[] Excel
{
get
{
return null; //Not needed in the AddIn
}
set
{
IConverter converter = new Converter();
ExcelJson = converter.ArrayBufferOfExcelDocToJson(value);
}
}
}
魔术现在正在新 Converter
- class 中发生。不久我将字节数组转换为流,然后在 EPPlus 的帮助下读取流(分别为 Excel 文档),最后将带有 Newtonsoft.JSON 的文档内容转换为 Json 字符串(变量 ExcelJson
).
在 NAV 中它看起来像这样。
//Get Blob (Document is table column name)
TechnicalSpreadsheet.Document.CREATEINSTREAM(Lstr_BlobInstream);
//init Memory Stream
MemStream := MemStream.MemoryStream();
COPYSTREAM(MemStream,Lstr_BlobInstream);
//Init DotNet Variable
ExcelDocument := ExcelDocument.ExcelDocument;
//Set byte[]
ExcelDocument.Excel := MemStream.GetBuffer;
//Call function in AddIn
CurrPage.spreadsheet.SetExcelDocument(ExcelDocument);
这对我有用。