Saltar al contenido

Convertir HTML a texto en Power Query: Html.Table y manejo de nulos

Convertir HTML a texto en Power Query: Html.Table y manejo de nulos

Escrito por

en

,

Convertir HTML a texto en Power Query: Html.Table y manejo de nulos

TL;DR: Usá Html.Table([Columna], {{"texto", ":root"}}) para extraer el texto limpio de una columna con HTML. Si la columna tiene filas vacías o nulas, el paso falla con error de tipo. La solución es envolver la fórmula en try ... otherwise null o agregar una condición previa con if [Columna] = null.


No hemos podido validar tu suscripción.
Tu PDF va en camino — revisa tu correo

Tu guía de Power Query gratis

Cuando conectás Power Query a una lista de SharePoint, una base de datos externa o un sistema de tickets, es común encontrar columnas donde el contenido llega en formato HTML: etiquetas <p>, <div>, <b>, entidades como &#160; y todo el ruido visual que los editores de texto enriquecido generan automáticamente.

Lo que necesitás en el modelo es texto plano. El problema es llegar ahí sin perder las filas que no tienen contenido.

¿Qué hace Html.Table?

Html.Table es una función nativa de Power Query que interpreta una cadena de texto como HTML y extrae los nodos que le indicás usando selectores CSS. La firma básica es:

Html.Table(contenido, {{nombre_columna, selector_css}})

Para extraer todo el texto visible de un bloque HTML, el selector :root captura el nodo raíz y devuelve su contenido de texto sin etiquetas:

Html.Table([Comentarios], {{"texto", ":root"}})

El resultado es una tabla de una columna (texto) con el contenido limpio. Si el HTML original tenía varios párrafos, aparecen como filas separadas. Para obtener un solo valor, podés agregar {0}[texto] al final para tomar la primera fila:

Html.Table([Comentarios], {{"texto", ":root"}}){0}[texto]

El problema: filas nulas rompen el paso

Si la columna tiene filas donde el valor es null (campos vacíos en SharePoint son muy comunes), Html.Table lanza el error:

Expression.Error: El tipo Null no se puede convertir en tipo Text.

Esto ocurre porque Html.Table espera una cadena de texto y recibe null.

Solución 1: try…otherwise (recomendada)

La forma más limpia es usar el bloque try...otherwise que M ofrece para manejar errores en tiempo de evaluación. Devuelve null cuando la expresión falla en lugar de detener todo el paso:

try Html.Table([Comentarios], {{"texto", ":root"}}){0}[texto] otherwise null

Usada como columna personalizada:

= Table.AddColumn(
    #"Paso anterior",
    "Texto limpio",
    each try Html.Table([Comentarios], {{"texto", ":root"}}){0}[texto] otherwise null,
    type text
)

Ventajas de este enfoque: – Maneja nulos y cualquier otro error de parseo (HTML malformado, cadenas vacías). – El paso nunca explota por un valor inesperado. – Las filas sin comentario quedan con null, que podés filtrar o reemplazar después.

Solución 2: if-then-else (más explícita)

Si preferís hacer la comprobación antes de llamar la función, podés verificar que el valor no sea nulo:

if [Comentarios] = null
then null
else Html.Table([Comentarios], {{"texto", ":root"}}){0}[texto]

Esta versión es más legible para quienes leen el código, pero solo protege contra null. Si hay cadenas vacías "" o HTML malformado, igual puede fallar.

Solución 3: combinar ambas

Para máxima robustez, combinás ambas comprobaciones:

if [Comentarios] = null or [Comentarios] = ""
then null
else try Html.Table([Comentarios], {{"texto", ":root"}}){0}[texto] otherwise null

Alternativa sin Html.Table: Text.Remove

Si el HTML que recibís es simple (solo etiquetas como <p>, <br>, <b> sin anidamiento complejo), podés usar Text.Remove combinado con una lista de caracteres, aunque para HTML completo no es suficiente.

Una alternativa más robusta sin Html.Table es reemplazar etiquetas con expresiones regulares via Text.Replace iterado, pero ese enfoque es verboso y propenso a errores con HTML real. Para contenido de SharePoint, Html.Table es siempre la opción más confiable.

Paso a paso en la interfaz

  1. Ir al paso donde está la columna con HTML.
  2. Agregar columna → Columna personalizada.
  3. Escribir la fórmula con try...otherwise:
try Html.Table([TuColumna], {{"texto", ":root"}}){0}[texto] otherwise null
  1. Cambiar el tipo de la nueva columna a Texto.
  2. Eliminar la columna original si ya no la necesitás.

Caso real: lista de SharePoint con comentarios

Escenario: una lista de SharePoint tiene una columna Notas con contenido HTML generado por el editor de texto enriquecido. El objetivo es una columna Notas_texto con el contenido plano para reportes en Power BI.

let
    Origen = SharePoint.Tables("https://tuempresa.sharepoint.com/sites/tuSitio"),
    Lista = Origen{[Name="ProyectosTareas"]}[Data],
    TextoLimpio = Table.AddColumn(
        Lista,
        "Notas_texto",
        each try Html.Table([Notas], {{"texto", ":root"}}){0}[texto] otherwise null,
        type text
    ),
    SinColumnaOriginal = Table.RemoveColumns(TextoLimpio, {"Notas"})
in
    SinColumnaOriginal

El resultado es una tabla donde Notas_texto contiene el texto sin etiquetas, y las filas sin notas tienen null.

Relación con el visual HTML Content de Power BI

Si en lugar de limpiar HTML en Power Query necesitás mostrar contenido HTML directamente en un visual de Power BI, el camino es diferente: el visual HTML Content permite renderizar HTML como parte del reporte. Podés ver cómo usarlo para crear tarjetas animadas y KPIs con estilo en el artículo Creando cards visuales animados en Power BI con HTML Content.


Resumen rápido

Situación Fórmula
Columna HTML sin nulos Html.Table([Col], {{"texto", ":root"}}){0}[texto]
Con posibles nulos try Html.Table([Col], {{"texto", ":root"}}){0}[texto] otherwise null
Nulos + HTML malformado if [Col] = null then null else try Html.Table(...) otherwise null

El patrón try...otherwise null es el más seguro y el que recomiendo tener como plantilla para cualquier transformación que dependa del contenido de una celda.

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *