如何使用vba将sql中的数据导入Word自定义属性

如何使用vba将sql中的数据导入Word自定义属性,sql,vba,ms-word,Sql,Vba,Ms Word,我正在评估将字段数据从sql数据库导入Word的方法。每个字段中都有少量的公司名称、法律地位、地址行等文本。我可以将其拉入表中,但我不希望用户看到它。我真的希望将数据导入模板中的一组自定义属性中,然后使用代码在Word文档中引用这些属性。有人有任何链接或例子可以帮助我做到这一点吗 我在做自定义属性方面没有问题。我不确定如何将数据导入自定义属性 谢谢你的帮助 我还没有找到一个令人满意的解决方案,我需要将它全部保存在VBA中,因为客户有一些特定的限制 我现在知道源代码是MSSQLS2008服务器。我

我正在评估将字段数据从sql数据库导入Word的方法。每个字段中都有少量的公司名称、法律地位、地址行等文本。我可以将其拉入表中,但我不希望用户看到它。我真的希望将数据导入模板中的一组自定义属性中,然后使用代码在Word文档中引用这些属性。有人有任何链接或例子可以帮助我做到这一点吗

我在做自定义属性方面没有问题。我不确定如何将数据导入自定义属性

谢谢你的帮助

我还没有找到一个令人满意的解决方案,我需要将它全部保存在VBA中,因为客户有一些特定的限制


我现在知道源代码是MSSQLS2008服务器。我希望在表中找到公司地址和级别详细信息,但理想情况下,我希望将这些详细信息放入文档中的一组自定义属性中。然后,我可以将它们引用到文档中,并在需要时更新自定义属性。

您可以使用在例如C#中编写的外接程序来完成此操作。使用VSTO,您可以轻松可靠地从大多数数据库下载事实并将其放入自定义属性中。另一种方法是使用Invantive Composition,它允许您通过在模板的模型中指定它来实现此目的,请参阅此模型定义:。请注意,我在制造它的公司工作,所以我有偏见

如果您想继续使用C#,请使用类似于您的项目的ApplicationUtility.cs中的代码(代码取自Invantive Control,但为了方便起见,请在此处公开):

获取属性值 或者改变它
听起来像是一个术语sql数据库是模糊的。很多数据库引擎都使用sql。你用哪一个?好问题。我现在不太清楚。此请求是我正在评估的提案文件的一部分,因此在下一阶段之前,信息有点模糊。我已经建立了一个MySQL数据库来使用,因为我至少需要知道一般问题是什么。这是一个非常大的列表中的一小部分,我对所有这些都很熟悉。考虑到文档中其他地方的一些模糊引用,它很可能是Microsoft SQL Server。忘记说了,但原则上使用哪个数据库平台并不重要。对于入侵合成,我们使用一个Web服务,该服务已经在大多数常见平台和一些XML方面进行了测试;它总是很好用。所以,如果你创建一个数据抽象,它可以是最小的,你可以使用几乎任何数据源。这是非常有趣的东西。我更愿意将其全部保存在VBA中,因为这样可以降低复杂性。我们不要太多的语言。规范中有足够的内容。您好,是的,您也可以从VBA调用类似的构造,或者将其作为扩展(插件)添加到Invantive控件中。请注意,VBA中可能也需要类似于InvokeMember的东西来修复Word访问属性中奇怪的并发性问题(在极端条件下,我们在Microsoft Excel中也有类似的问题……有时Microsoft技术会花费您数年的时间)。@Boyplunder这个答案有助于解决您的问题吗?如果没有,请在您的问题中添加不成功的内容。当答案对您有帮助时,您能否通过单击旁边的空心绿色复选标记来接受它?
private object GetWordBuiltInProperty(_Word.Document wordDocument, _Word.WdBuiltInProperty property)
{
    try
    {
        if (wordDocument != null)
        {
            return wordDocument.BuiltInDocumentProperties[property].Value;
        }
    }
private void CreateDocumentProperty(_Word.Document wordDocument, string name, MsoDocProperties type, object value)
{
    Debug.Assert(wordDocument != null, "Word document cannot be null!");
    Debug.Assert(!string.IsNullOrEmpty(name), "Name cannot be null!");

    object property = this.GetDocumentProperty(wordDocument, name);

    if (property == null)
    {
        Type t = wordDocument.CustomDocumentProperties.GetType();

        t.InvokeMember("Add", BindingFlags.InvokeMethod, null, wordDocument.CustomDocumentProperties, new object[] { name, false, type, value });
    }
}

private void CreateOrReplaceDocumentProperty(_Word.Document wordDocument, string name, MsoDocProperties type, object value)
{
    Debug.Assert(wordDocument != null, "Word document cannot be null!");
    Debug.Assert(!string.IsNullOrEmpty(name), "Name cannot be null!");

    object property = this.GetDocumentProperty(wordDocument, name);

    if (property == null)
    {
        //
        // Add property.
        //
        this.CreateDocumentProperty(wordDocument, name, type, value);
    }
    else
    {
        //
        // Set value.
        //
        this.SetDocumentPropertyValue(wordDocument, name, value);
    }
}
    private void SetDocumentPropertyValue(_Word.Document wordDocument, string name, object value)
    {
        object property = this.GetDocumentProperty(wordDocument, name);

        if (property != null)
        {
            Type t = property.GetType();

            t.InvokeMember("Value", BindingFlags.SetProperty, null, property, new object[] { value });
        }
    }