es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Reemplace el texto en la API de JS del complemento de MS Word.

Estoy intentando construir un complemento en el que tendré algunos campos de entrada y los valores de esos campos de entrada se agregarán a una plantilla de MS Word al hacer clic en un botón.

La plantilla se ve así:

Lorem ipsum dolor sit amet, consectetur adipiscing #value_no_1# elit. Integer placerat leo eget tortor malesuada, eu ultrices mauris #value_no_2# rutrum. Vestibulum vel mattis tellus #valuen_no_3#. 
Vivamus sit amet ante sit amet lacus #valuen_no_4# ullamcorper placerat. 
Donec pretium tincidunt orci, eget vestibulum eros #value_no_5# sollicitudin quis. 
Morbi euismod sed eros nec ultrices. Vestibulum nec ipsum at ipsum dictum sagittis et vel felis #valuen_no_6#. 
Aenean a varius erat. 
Vestibulum euismod eget lectus eu #value_no_7# scelerisque. 
Etiam vel bibendum est. Sed venenatis tortor non ex tempor hendrerit #value_no_8#. Cras auctor leo malesuada tortor tempor, at pharetra orci sollicitudin #value_no_9#.

La función para reemplazar el texto es la siguiente:

function fillIn() {
  Word.run(function (context) {
    // Queue a command to search the document with a wildcard
    // for any string of characters that starts with 'to' and ends with 'n'.
    var searchResults = context.document.body.search("#*#", { matchWildcards: true });

    // Queue a command to load the search results and get the font property values.
    context.load(searchResults, "text");

    // Synchronize the document state by executing the queued commands,
    // and return a promise to indicate task completion.
    return context.sync().then(function () {
      console.log("Found count: " + searchResults.items.length);

      // Queue a set of commands to change the font for each found item.
      for (var i = 0; i < searchResults.items.length; i++) {
        console.log(searchResults.items[i].text);
        searchResults.items[i].insertText("Hello", "Replace");
        return context.sync();
      }
      // Synchronize the document state by executing the queued commands,
      // and return a promise to indicate task completion.
      return context.sync();
    });
  }).catch(function (error) {
      console.log("Error: " + JSON.stringify(error));
      if (error instanceof OfficeExtension.Error) {
        console.log("Debug info: " + JSON.stringify(error.debugInfo));
      }
    });
}

Durante los primeros 3 o 4 valores, el texto se reemplaza correctamente. En lugar de #value_no_1#, obtendré hello, pero en valores posteriores como #value_no_8#, obtendré algo como hello_no_8#. Supongo que esto sucede porque el número de caracteres dentro de los rangos está cambiando debido al nuevo valor ingresado. También me gustaría señalar que searchResults.items[i].text devuelve el valor correcto #value_no_8#. Pero al llamar a replaceText, obtengo como resultado hello_no_8# en lugar de hello.

He investigado la documentación y no tengo ningún buen ejemplo sobre cómo abordar la escritura en bloque en el documento. ¿Alguien tiene una idea de cómo solucionarlo o alguna otra idea sobre cómo puedo abordar el reemplazo masivo de texto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema aquí está relacionado con la longitud del texto de reemplazo. Como has mencionado, cuando se inserta un texto más largo, afecta la posición de los otros marcadores de posición en el documento, causando reemplazos incorrectos.

    Una posible solución a esto es reemplazar los marcadores de posición uno por uno en un ciclo, buscando cada marcador de posición individualmente y reemplazándolo con su valor correspondiente de los campos de entrada. De esta manera, la posición de los otros marcadores de posición no se verá afectada y los reemplazos serán precisos.

    Aquí hay un ejemplo de código que podrías usar como punto de partida:

    function fillIn() {
      Word.run(function (context) {
        var placeholders = [
          { placeholder: "#value_no_1#", value: $('#input1').val() },
          { placeholder: "#value_no_2#", value: $('#input2').val() },
          { placeholder: "#value_no_3#", value: $('#input3').val() },
          { placeholder: "#value_no_4#", value: $('#input4').val() },
          { placeholder: "#value_no_5#", value: $('#input5').val() },
          { placeholder: "#value_no_6#", value: $('#input6').val() },
          { placeholder: "#value_no_7#", value: $('#input7').val() },
          { placeholder: "#value_no_8#", value: $('#input8').val() },
          { placeholder: "#value_no_9#", value: $('#input9').val() }
        ];
    
        // Recorrer los marcadores de posición y reemplazarlos uno por uno
        for (var i = 0; i < placeholders.length; i++) {
          var searchResults = context.document.body.search(placeholders[i].placeholder, { matchWildcards: true });
          context.load(searchResults, "text");
    
          // Reemplazar cada marcador de posición con su valor correspondiente
          searchResults.items[0].insertText(placeholders[i].value, "Replace");
        }
    
        // Sincronizar el estado del documento ejecutando los comandos en cola,
        // y devolver una promesa para indicar la finalización de la tarea.
        return context.sync();
      }).catch(function (error) {
        console.log("Error: " + JSON.stringify(error));
        if (error instanceof OfficeExtension.Error) {
          console.log("Debug info: " + JSON.stringify(error.debugInfo));
        }
      });
    }
    

    Este código recorre un arreglo de marcadores de posición y sus valores correspondientes de entrada, y reemplaza cada marcador de posición con su valor en el documento. Ten en cuenta que esto presupone que solo hay una ocurrencia de cada marcador de posición en el documento. Si hay varias ocurrencias de un marcador de posición, es posible que debas modificar el código para manejar ese caso.

    ¡Espero que esto sea de ayuda! Hazme saber si tienes más preguntas.

Comments are closed.