用于将 DOORS Object 信息导出到 Microsoft Word 的 DXL 脚本 - 随机删除信息
DXL Script to Export DOORS Object Information to Microsoft Word - Randomly Dropping Information
我有一个 DXL 脚本,它应该遍历所选模块中的每个 object,并根据 object 数据将各种 object 信息导出到 Microsoft Word 文件。它通常有效,但我遇到了一个问题,即模块中的随机点数据没有粘贴到 Word 文档中。
有几个函数可以执行数据导出,它们的调用取决于 DOORS object:
- put_heading_in_word( string s ) - 以更大的字体放置标题编号和标题文本
- put_plain_text_in_word( string s ) - 将纯文本放入 Word 文档
- put_new_line_in_word() - 在 Word
中放置一个回车 return
- put_object_text_in_word( Object ob ) - 将传入的 DOORS object 中的文本复制到 Word
函数如下:
/****************************************************************************************
* put_new_line_in_word
*****************************************************************************************/
void put_new_line_in_word()
{
clear oleAutoArgs
put(oleAutoArgs, 1) // 0=wdCollapseEnd, 1=wdCollapseStart
oleMethod(objSel, "Collapse", oleAutoArgs)
setRichClip(richText "\n" )
oleMethod(objSel, "Paste")
}//put_new_line_in_word
/****************************************************************************************
* put_plain_text_in_word
*****************************************************************************************/
void put_plain_text_in_word(string s)
{
clear oleAutoArgs
put(oleAutoArgs, 1) // 0=wdCollapseEnd, 1=wdCollapseStart
oleMethod(objSel, "Collapse", oleAutoArgs)
copyToClipboard( s )
oleGet(objSel, "Font", oleFont)
olePut(oleFont, "Size", 11)
oleMethod(objSel, "Paste")
}//put_plain_text_in_word
/****************************************************************************************
* put_heading_in_word
*****************************************************************************************/
void put_heading_in_word( string s )
{
clear oleAutoArgs
put(oleAutoArgs, 1) // 0=wdCollapseEnd, 1=wdCollapseStart
oleMethod(objSel, "Collapse", oleAutoArgs)
copyToClipboard( s )
oleGet(objSel, "Font", oleFont)
olePut(oleFont, "Size", 18)
oleMethod(objSel, "Paste")
}//put_heading_in_word
/****************************************************************************************
* put_object_text_in_word
*****************************************************************************************/
void put_object_text_in_word(Object ob)
{
clear oleAutoArgs
put(oleAutoArgs, 1) // 0=wdCollapseEnd, 1=wdCollapseStart
oleMethod(objSel, "Collapse", oleAutoArgs)
// setRichClip(richText richText(ob."Object Text"))
setRichClip(richText(ob."Object Text"))
oleMethod(objSel, "Paste")
}//put_object_text_in_word
这是一个如何使用它们的例子:
/****************************************************************************************
* Export_object
* This is called for each object
*****************************************************************************************/
void Export_object (Module m, Object obj)
{
// allows the the use of attribute exists
current = m
if ( isValidObject(obj))
{
temp_str = obj."Object Heading"
if(!null temp_str)
{
put_plian_text_in_word("ID: ")
put_plian_text_in_word(identifier(obj))
put_new_line_in_word
temp_str = number(obj)
put_heading_in_word(temp_str)
put_heading_in_word(" ")
temp_str = obj."Object Heading"
put_heading_in_word(temp_str)
put_new_line_in_word
}
else
{
put_plian_text_in_word("ID: ")
put_plian_text_in_word(identifier(obj))
put_new_line_in_word
temp_str = obj."Requirement"
put_plian_text_in_word("Requirement: " temp_str)
put_new_line_in_word
temp_str = obj."Derived"
put_plian_text_in_word("Derived: " temp_str)
put_new_line_in_word
temp_str = obj."DO-178 Level"
put_plian_text_in_word("DO-178 Level: " temp_str)
put_new_line_in_word
temp_str = obj."Safety"
put_plian_text_in_word("Safety: " temp_str)
put_new_line_in_word
put_plian_text_in_word("Object Text: ")
put_new_line_in_word
put_object_text_in_word(obj)
if(oleCopy(obj))
{
oleMethod(objSel, "Paste")
put_new_line_in_word
}
temp_str = obj."Justify"
put_plian_text_in_word("Justify: " temp_str)
put_new_line_in_word
}
}
}
我最初的想法是对 OLE 接口的访问太多,并且东西被丢弃了,所以我创建了使用缓冲区变量的函数,我将单个字符串放入缓冲区并停止使用“put_new_line_in_word" 函数并将 '\n' 放入缓冲区。现在我只是丢失了更大的数据块,而且它似乎并没有减少丢失数据的频率。
有什么想法吗?
据我所知,这是 DOORS 和 Windows10 的一个未解决的问题。导出到 Word 文档的常用方法是使用 Windows 剪贴板。内存管理似乎在 Windows 10 中发生了变化,这引发了 OLE-Errors / OLE 问题。这也是为什么问题始终无法重现的原因。
我没有适合您的实际解决方案。作为解决方法,如果您有可能使用 Windows 7,我建议您使用它,直到 IBM 或 Microsoft 解决此问题为止,(在 IBM DOORS 发行说明中,我还没有看到关于此的修复问题,直到当前版本 9.7.2.1)。
我有一个 DXL 脚本,它应该遍历所选模块中的每个 object,并根据 object 数据将各种 object 信息导出到 Microsoft Word 文件。它通常有效,但我遇到了一个问题,即模块中的随机点数据没有粘贴到 Word 文档中。
有几个函数可以执行数据导出,它们的调用取决于 DOORS object:
- put_heading_in_word( string s ) - 以更大的字体放置标题编号和标题文本
- put_plain_text_in_word( string s ) - 将纯文本放入 Word 文档
- put_new_line_in_word() - 在 Word 中放置一个回车 return
- put_object_text_in_word( Object ob ) - 将传入的 DOORS object 中的文本复制到 Word
函数如下:
/****************************************************************************************
* put_new_line_in_word
*****************************************************************************************/
void put_new_line_in_word()
{
clear oleAutoArgs
put(oleAutoArgs, 1) // 0=wdCollapseEnd, 1=wdCollapseStart
oleMethod(objSel, "Collapse", oleAutoArgs)
setRichClip(richText "\n" )
oleMethod(objSel, "Paste")
}//put_new_line_in_word
/****************************************************************************************
* put_plain_text_in_word
*****************************************************************************************/
void put_plain_text_in_word(string s)
{
clear oleAutoArgs
put(oleAutoArgs, 1) // 0=wdCollapseEnd, 1=wdCollapseStart
oleMethod(objSel, "Collapse", oleAutoArgs)
copyToClipboard( s )
oleGet(objSel, "Font", oleFont)
olePut(oleFont, "Size", 11)
oleMethod(objSel, "Paste")
}//put_plain_text_in_word
/****************************************************************************************
* put_heading_in_word
*****************************************************************************************/
void put_heading_in_word( string s )
{
clear oleAutoArgs
put(oleAutoArgs, 1) // 0=wdCollapseEnd, 1=wdCollapseStart
oleMethod(objSel, "Collapse", oleAutoArgs)
copyToClipboard( s )
oleGet(objSel, "Font", oleFont)
olePut(oleFont, "Size", 18)
oleMethod(objSel, "Paste")
}//put_heading_in_word
/****************************************************************************************
* put_object_text_in_word
*****************************************************************************************/
void put_object_text_in_word(Object ob)
{
clear oleAutoArgs
put(oleAutoArgs, 1) // 0=wdCollapseEnd, 1=wdCollapseStart
oleMethod(objSel, "Collapse", oleAutoArgs)
// setRichClip(richText richText(ob."Object Text"))
setRichClip(richText(ob."Object Text"))
oleMethod(objSel, "Paste")
}//put_object_text_in_word
这是一个如何使用它们的例子:
/****************************************************************************************
* Export_object
* This is called for each object
*****************************************************************************************/
void Export_object (Module m, Object obj)
{
// allows the the use of attribute exists
current = m
if ( isValidObject(obj))
{
temp_str = obj."Object Heading"
if(!null temp_str)
{
put_plian_text_in_word("ID: ")
put_plian_text_in_word(identifier(obj))
put_new_line_in_word
temp_str = number(obj)
put_heading_in_word(temp_str)
put_heading_in_word(" ")
temp_str = obj."Object Heading"
put_heading_in_word(temp_str)
put_new_line_in_word
}
else
{
put_plian_text_in_word("ID: ")
put_plian_text_in_word(identifier(obj))
put_new_line_in_word
temp_str = obj."Requirement"
put_plian_text_in_word("Requirement: " temp_str)
put_new_line_in_word
temp_str = obj."Derived"
put_plian_text_in_word("Derived: " temp_str)
put_new_line_in_word
temp_str = obj."DO-178 Level"
put_plian_text_in_word("DO-178 Level: " temp_str)
put_new_line_in_word
temp_str = obj."Safety"
put_plian_text_in_word("Safety: " temp_str)
put_new_line_in_word
put_plian_text_in_word("Object Text: ")
put_new_line_in_word
put_object_text_in_word(obj)
if(oleCopy(obj))
{
oleMethod(objSel, "Paste")
put_new_line_in_word
}
temp_str = obj."Justify"
put_plian_text_in_word("Justify: " temp_str)
put_new_line_in_word
}
}
}
我最初的想法是对 OLE 接口的访问太多,并且东西被丢弃了,所以我创建了使用缓冲区变量的函数,我将单个字符串放入缓冲区并停止使用“put_new_line_in_word" 函数并将 '\n' 放入缓冲区。现在我只是丢失了更大的数据块,而且它似乎并没有减少丢失数据的频率。
有什么想法吗?
据我所知,这是 DOORS 和 Windows10 的一个未解决的问题。导出到 Word 文档的常用方法是使用 Windows 剪贴板。内存管理似乎在 Windows 10 中发生了变化,这引发了 OLE-Errors / OLE 问题。这也是为什么问题始终无法重现的原因。
我没有适合您的实际解决方案。作为解决方法,如果您有可能使用 Windows 7,我建议您使用它,直到 IBM 或 Microsoft 解决此问题为止,(在 IBM DOORS 发行说明中,我还没有看到关于此的修复问题,直到当前版本 9.7.2.1)。