0

我有一个需要进行邮件合并的项目,我正在使用 VSTO 执行此操作。我需要检查所有记录MailMerge.DataSource.DataFields是否正常。我正在使用此代码执行此操作。

    public void verificarPersonas(Word.Document Doc)
    {
        ThisAddIn ThisAddIn = Globals.ThisAddIn;
        List<Personas> miListaPersonas = new List<Personas>();
        decimal nRecords = Doc.MailMerge.DataSource.RecordCount;
        if (nRecords == 0)
        {
            cambiarEstado("Empty db  or documento does'n prepared for mail merge", false);
        }
        else
        {
            string fieldIdentificacion = persParm("Identificacion");
            string fieldNombre = persParm("Nombres");
            string fieldApellido = persParm("Apellidos");
            string fieldEmail = persParm("Email");
            string fieldDireccion = persParm("Direccion");
            string fieldTelefono = persParm("Telefono");

            if (String.IsNullOrEmpty(fieldIdentificacion) || String.IsNullOrEmpty(fieldNombre))
            {
                cambiarEstado("", false);
                return;
            }
            else
            {
                for (int i = 1; i <= nRecords; i++)
                {
                    Doc.MailMerge.DataSource.FirstRecord = i;
                    Doc.MailMerge.DataSource.LastRecord = i;

                    //   Here Allways get the first record
                    dynamic fields = Doc.MailMerge.DataSource.DataFields;
                    //    ________________________________
                    Personas personaActual = new Personas();
                    personaActual.IdPersona = 0;
                    try
                    {
                        personaActual.Identificacion = fields(fieldIdentificacion).value;
                        personaActual.Nombres = fields(fieldNombre).value;
                        personaActual.Apellidos = (String.IsNullOrEmpty(fieldApellido) ? "" : fields(fieldApellido).value);
                        personaActual.Email = (String.IsNullOrEmpty(fieldEmail) ? "" : fields(fieldEmail).value);
                        personaActual.Direccion = (String.IsNullOrEmpty(fieldDireccion) ? "" : fields(fieldDireccion).value);
                        personaActual.Telefono = (String.IsNullOrEmpty(fieldTelefono) ? "" : fields(fieldTelefono).value);

                        miListaPersonas.Add(personaActual);
                    }
                    catch (Exception e)
                    {
                        cambiarEstado(""+e.Message, false);
                        return;
                    }
                }

                string listaPersonasJson = JsonConvert.SerializeObject(miListaPersonas);
                string respuesta = wt.getWebData("Personas", "verificarPersonasVSTO", new { personas = listaPersonasJson });

            }
        }
    }

我的问题是dynamic fields = Doc.MailMerge.DataSource.DataFields;总是获得第一条记录。

如何获取datafields活动记录?

4

1 回答 1

1

经过几个小时的研究和一些尝试。当你设置FirstRecord和Lastrecord时,数据源的字段集合不会移动指针,它必须使用activerecords移动,使用WdMailMergeActiveRecord枚举,像这样:

int nRecords = Doc.MailMerge.DataSource.RecordCount;

for (int i = 1; i <= nRecords; i++)
{
    Doc.MailMerge.DataSource.FirstRecord = i; //It doesn't work 
    Doc.MailMerge.DataSource.LastRecord = i; // it doesn't work
    Doc.MailMerge.DataSource.ActiveRecord = (i == 1 ?   
    Word.WdMailMergeActiveRecord.wdFirstDataSourceRecord :Word.WdMailMergeActiveRecord.wdNextDataSourceRecord);
    Doc.MailMerge.DataSource.ActiveRecord = (i == nRecords ? Word.WdMailMergeActiveRecord.wdLastDataSourceRecord : Doc.MailMerge.DataSource.ActiveRecord);
    dynamic fields = Doc.MailMerge.DataSource.DataFields;
}
于 2013-02-25T17:53:47.260 回答