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.

La propiedad wrapText de exceljs no funciona en celdas combinadas.

<code>
workSheet.getCell(`B7`).alignment = {
    vertical: 'middle', horizontal: 'left',
    wrapText: true // autoHeight
  };
</code>
solo funciona en la celda <strong>B7</strong>

si intento fusionar las celdas <strong>B7 y F7</strong>
el texto no se ajustará.

he intentado una lógica con obtener la altura después de wrapText, luego fusionar las celdas y luego establecer la altura, pero en la primera condición nunca establezco la altura, por lo que el valor sería undefined, donde la documentación indica que la altura predeterminada es 15 y siempre será undefined si no la establecimos/iniciamos al principio.

<code>
  const rowHeight = workSheet.getRow(7).height;
  console.log(`altura antes de la fusión ${rowHeight}`); // sé que esto es undefined 
  workSheet.mergeCells(`B7`, `D7`);
  const rowAfterMerge = workSheet.getRow(7).height;
  console.log(`altura después de la fusión ${rowAfterMerge}`);
</code>

intenté inicializar antes de ejecutar el código anterior con
<code>workSheet.getRow(7).height = 15;</code>

pero el valor siempre es 15 al obtener la altura después de wrapText.

alguien tiene solución para wrapText en una celda que es una celda fusionada (<code>B7 - F7</code>). siempre obtengo un texto en blanco recortado.
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, parece que la implementación actual de la biblioteca exceljs no proporciona una solución directa para ajustar el texto en celdas fusionadas en Excel. Como has mencionado, es necesario establecer la altura de la celda fusionada antes de ajustar el texto, pero establecerla antes de fusionar resultará en que la altura de la celda fusionada se restablezca a su valor predeterminado.

    Una posible solución alternativa es calcular manualmente la altura de la celda fusionada y establecerla después de ajustar el texto. Esto se puede hacer utilizando el método measureText de la API de canvas, que estima el ancho y la altura de una cadena de texto específica en función de una fuente y tamaño especificados.

    Aquí tienes un ejemplo de implementación:

    const fila = workSheet.getRow(7);
    const rango = workSheet.getCell(`B7:F7`);
    
    // Ajustar el texto en la primera celda del rango fusionado
    rango.alignment = {
      vertical: 'middle',
      horizontal: 'left',
      wrapText: true
    };
    
    // Calcular la altura requerida para el rango fusionado
    const texto = rango.text;
    const fuente = `${fila.font.bold ? 'bold ' : ''}${fila.font.italic ? 'italic ' : ''}${fila.font.size}px ${fila.font.name}`;
    const lienzo = document.createElement('canvas');
    const ctx = lienzo.getContext('2d');
    ctx.font = fuente;
    const anchoTexto = ctx.measureText(texto).width;
    const altoTexto = ctx.measureText('M').width * 1.2 * (texto.length / (anchoTexto / rango.width));
    // La línea anterior estima la altura en función del número de caracteres en el texto y el ancho de la celda
    
    // Establecer la altura del rango fusionado al valor calculado
    const alturaNoFusionada = fila.height; // Guardar la altura de la celda sin fusionar
    rango.merge();
    fila.height = Math.ceil(altoTexto / alturaNoFusionada) * alturaNoFusionada; // Redondear hacia arriba al múltiplo más cercano de la altura de la celda sin fusionar para evitar cortes
    

    Ten en cuenta que esta implementación asume que la fuente y el tamaño del texto en la celda fusionada son los mismos que los de la primera celda del rango (B7). Si este no es el caso, la fuente y el tamaño deben establecerse explícitamente para todas las celdas del rango antes de calcular la altura. Además, esta implementación utiliza la API de canvas, que puede no estar disponible en todos los entornos o navegadores.

Comments are closed.