Contenidos de celda

Figura
Figura. Contenidos de celda en WXTABLE

En este tema se exponen los contenidos de celda, que pueden ser valores o fórmulas. Los valores pueden ser números o cadenas (strings). Las cadenas pueden ser también texto enriquecido (rich text). En la Figura se observa un ejemplo en WXTABLE con algunas muestras de contenidos con las que trabajaremos exportándolas para explicarlo en este tema.

Puede importar la tabla WXTABLE usando este código cell-contents.txt en el Gestor de tablas. O bien puede descargar la hoja de cálculo con el enlace cell-contents.xlsx.

Figura
Figura. Contenidos de celda en EXCEL Web

En general el exportador XLSX consigue una traducción aceptable desde el formato WXTABLE. Recuerde que WXTABLE no es otra cosa que una tabla en HTML+CSS.

En la Figura puede ver la tabla anterior en una hoja de cálculo EXCEL Web. La única cosa que no me fue posible trasladar completamente a Google Sheet o Excel Web son los elementos subíndice y superíndice (subscript y superscript), que en HTML se consigue con los elementos <sub> y <sup>.

Figura
Figura. Contenidos de celda en EXCEL 2010 (versión 14)

He podido probar algunos ejemplos en EXCEL 2010 de escritorio, versión 14. Como se observa en Figura, esta versión si soporta la traducción del subíndice y superíndice. Estas pruebas en versiones de escritorio se limitaron a una revisión visual, pues he desechado la posibilidad de verificar la corrección en todas las versiones de escritorio dada su complejidad, limitándome a verificarlo en GoogleSheet y EXCEL web.

Las seis primeras celdas son cadenas a excepción de la segunda que es un número. La última celda contiene una fórmula. Observe en el área de texto de la parte superior dicha fórmula =[R2C1]*2 en WXTABLE, mientras que en XLSX es =$A$2*2. Se trata de multiplicar por dos el número 123 de la segunda celda. En los siguientes apartados explicaremos cada uno de estos contenidos.

El código fuente para exportar el ejemplo a XLSX es el siguiente:

{
    "sheets": {
        "Tab1": {
            "attributes": {
                "7,1": {
                    "data-formula": "=[R2C1]*2"
                }
            },
            "styles": {
                "1,0:7,0": "height:36px;",
                "1,1:7,1;0,1": "width:600px;"
            },
            "values": [
                ["1"],
                ["ABC"],
                ["123"],
                ["normal <font face=\"Courier\" color=\"#FF0000\">courier-red</font> normal"],
                ["normal <b>bold</b> <i>italic</i> <u>underline</u> <s>strike</s> normal"],
                ["<b>bold <i>bold-italic <u>bold-italic-underline</u></i></b>"],
                ["normal <small>small</small> <big>big</big> <sub>sub</sub> <sup>sup</sup>"],
                ["246"]
            ]
        }
    },
    "images": []
}

Tipos de contenidos de celda

ABC

Empezamos a ver los contenidos de las celdas de nuestro ejemplo. A la izquierda incluiremos un contenedor con el contenido en HTML, que debe representarse tal como lo hace WXTABLE. La primera celda contiene la cadena ABC. El archivo xl/worksheets/sheet1.xml contiene las celdas en el elemento <sheetData>, como se observa en esta parte del código donde abreviamos contenido que no viene al caso con puntos suspensivos:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    ...
    <sheetData>
        <row r="1" hidden="0" customHeight="1" ht="27">
            <c r="A1" t="s" s="0">
                <v>0</v>
            </c>
        </row>
        ...
    </sheetData>
</worksheet>

Se disponen las celdas en elementos <c> y a su vez dentro de elementos fila <row>. Su atributo r="1" nos dice que es la fila uno. A su vez el atributo r="A1" en la celda nos dice que es la primera celda superior izquierda. En XLSX las referencias a celdas se escriben como LN, donde L es una o más letras desde la "A" hasta la "XFD", en total 16384 columnas, y la N es un número de fila.

No nos detendremos en otros atributos como ht="27" que define la altura de la fila o s="0" para el estilo de la celda. Esto lo veremos en otros temas. El tipo de contenido se declara con t="s" que se corresponde con el tipo String en cadenas compartidas. Los tipos de contenido disponibles se encuentran en OOX, apartado 18.18.11 ST_CellType (Cell Type), página 2451:

  • b: Boolean. La celda contiene un booleano.
  • d: Date. La celda contiene una fecha en formato ISO 8601.
  • e: Error. La celda contiene un error.
  • inlineStr: Inline String. La celda contiene texto plano o enriquecido que no está en la tabla de cadenas compartidas. Si se utiliza este tipo de celda, entonces el valor de la celda está en el elemento <is> en lugar del elemento <v> de la celda <c>.
  • n: Number. La celda contiene un número.
  • s: String. La celda contiene una cadena compartida, tanto texto plano como texto enriquecido.
  • str: String. La celda contiene una fórmula.

Las cadenas compartidas con todas las hojas de cálculo del libro se guardan en el archivo xl/sharedStrings.xml, en su elemento raíz <sst>. Observe que hay 5 cadenas compartidas y que la primera es "ABC". Se indexan desde cero, por eso en la celda <c> tenemos el elemento <v>0</v> con el contenido 0 que indexa con la cadena "ABC" en la lista de cadenas compartidas. En <sst> se ubican en un elemento <si> y dentro de un elemento <t> de texto plano.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
count="5" uniqueCount="5">
    <si>
        <t>ABC</t>
    </si>
    ...
</sst>

De los tipos disponibles sólo usamos s, n, str y inlineStr. Los otros no se usan por una diferencia de concepto en la forma de actuar WXTABLE y EXCEL frente a los tipos de valores de las celdas. En WXTABLE no se define tipos, o mejor dicho, todos los tipos son String. Los tipos resultantes se determinan cuando se ejecutan las fórmulas. Si tenemos una fórmula como =1+"abc" es porque se presupone que sus operandos son números. Si no fueran números la fórmula devolvería NAN, como en ese caso pues el operador "+" sólo puede sumar números. Si usarámos el operador "#" entonces =1#"abc" nos devolvería la cadena concatenada "1abc". Si se usan funciones como la función aritmética =sumar(1, "abc") se convierten las cadenas a 0 devolviendo un 1. E igual con las fechas. La fórmula =year("11/08/2021") devuelve 2021 pues espera una fecha válida en formato "d/m/aaaa" como argumento. Si no fuera una fecha válida devolvería Null, como con =year("abc").

En XLSX si se definen otros tipos. Por ejemplo, una celda con el texto TRUE o FALSE se le puede asignar un tipo booleano b. Y con una fecha el tipo sería d. Aparte de s, str, inlineStr el único tipo que traducimos es n para números. El resultado de una fórmula se adjudica a número si son funciones matemáticas o aritméticas. Si es un valor chequeamos con JavaScript if(isNaN(value) || !Number.isFinite(+value)) para saber si no es un número o bien es Infinity, puesto que XLSX no admite este valor.

Valores numéricos en contenido de celda

123

Seguimos con con el ejemplo de la segunda fila con la cadena "123". Como acabo de comentar, en el exportador XLSX se comprueba si es un número, en cuyo caso se le adjudica el tipo t="n" de tipo número:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    ...
    <sheetData>
        ...
        <row r="2" hidden="0" customHeight="1" ht="27">
            <c r="A2" t="n" s="0">
                <v>123</v>
            </c>
        </row>
        ...
    </sheetData>
</worksheet>

Los números no se guardan en cadenas compartidas y se ponen directamente en el elemento <v>.

Texto enriquecido (Rich text)

Figura
Figura. Contenidos HTML en WXTABLE

Como ya hemos dicho WXTABLE no es otra cosa que una tabla HTML+CSS. Sus contenidos se editan usando el atributo contenteditable="true". Al editar una celda podemos incluir texto plano y también HTML con limitaciones. No se permite pegar HTML y el número de elementos, atributos y estilos está limitado a los siguientes que se exponen aquí.

En cualquier caso WXTABLE permite más contenido enriquecido en las celdas que XLSX. Por ejemplo, la Figura contiene celdas con elementos <div> con bordes redondeados. Esto es fácil de hacer con el estilo CSS style="border: black solid 1px; border-radius: 0.5em; padding: 0.1em". Pero no es posible en una celda XLSX (al menos en lo que yo conozco sobre el tema).

Los elementos HTML permitidos en WXTABLE son los siguientes:

const elementosHtml = [
    //Elementos HTML de uso general
    "abbr", "b", "big", "br", "code", "del", "div", "em", "hr", "i", "mark", "pre", "small", "span", "sub", "sup", "var",
    //Elementos HTML obsoletos pero que el navegador utiliza con execCommand
    "font", "s", "strike", "u",
    //Elementos SVG
    "circle", "ellipse", "g", "line", "path", "polygon", "polyline", "rect", "svg", "text", "textPath"
];

De ellos sólo podemos exportar a XLSX de forma directa b, i, font, s, strike, u. Los elementos s y strike referencian el mismo para texto tachado. De forma indirecta, es decir, traduciendo con algún otro recurso XLSX, podemos exportar br, hr, em, var, abbr, mark, del, small, big, code, pre, sub, sup. Los elementos br, hr se exportan como un salto de línea de texto (\n). El resto div, span y los elementos SVG no son exportables y serán ignorados, exportándose sólo su contenido de texto plano.

Los atributos de elementos HTML permitidos en WXTABLE son los siguientes:

const atributosHtml = [
    //Atributos HTML de uso general
    "style", "title",
    //Atributos HTML obsoletos originados por execCommand y que pueden ponerse en el elemento obsoleto font
    "face", "size", "color",
    //Atributos SVG
    "viewBox", "fill", "d", "points", "x", "y", "x1", "y1", "x2", "y2", "cx", "cy", "r", "rx", "ry", "width", "height",
    "transform", "rotate", "font-family", "font-size", "font-weight", "stroke", "stroke-width", "stroke-dasharray",
    "text-anchor", "textLength", "lengthAdjust", "path", "id", "href"
];

Sólo serán exportables los atributos style, que se explica a continuación y face, size, color que se usan con el elemento font. El atributo face nos permite aplicar una fuente de texto, con tamaño size. Los estilos CSS a incluir en el atributo style que se permiten en WXTABLE son los siguientes.

const cssHtml = [
    "background-color", "border", "border-radius", "border-color", "border-style", "border-width", "box-shadow", "box-sizing", "display",
    "color", "font-family", "font", "font-size", "font-style", "font-weight", "font-variant", "font-variant-caps", 
    "height", "line-height", "padding", "margin", "text-align", "text-decoration", "text-transform", "transform", "width", "vertical-align"
];

De ellos sólo los siguientes estilos son exportables a XLSX:

CSS WXTABLEValor CSSElemento XLSX
colorcolor
font-familyrFont
font-sizesz
font-weight≠ "normal"b
font-style≠ "normal"i
text-decoration= "underline"u
text-decoration= "line-through"strike
vertical-align= "sub"vertAlign val="subscript"
vertical-align= "super"vertAlign val="superscript"

Valores de texto enriquecido en contenido de celda

normal courier-red normal

El HTML contenido es normal <font face="Courier" color="#FF0000">courier-red</font> normal. Observe como el contenido HTML adjunto insertado en esta página es exactamente el mismo que el que se reproducen en WXTABLE. No podía ser de otra forma, pues como ya hemos dicho, WXTABLE no es otra cosa que HTML+CSS.

En este caso se trata de texto enriquecido. El elemento <font> y los atributos face, color y size están declarados obsoletos en HTML y es posible que los navegadores dejen de usarlo. En estos momentos (agosto 2021) la mayor parte de los navegadores aún lo soportan.

El texto enriquecido también se guarda como cadena compartida. En el elemento <c>, dentro de <v>, se guarda el índice donde podemos localizarlo en el archivo de cadenas compartidas:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    ...
    <sheetData>
        ...
        <row r="3" hidden="0" customHeight="1" ht="27">
            <c r="A3" t="s" s="0">
                <v>1</v>
            </c>
        </row>
        ...
    </sheetData>
</worksheet>

Aquí vemos el elemento <sst> de cadenas compartidas. Cuando es texto enriquecido usamos el elemento <r>. La cadena de texto se divide en trozos según el estilo de texto enriquecido que proceda, obteniéndose normal , courier-red y  normal, donde hemos resaltado los espacios entre palabras. El texto plano se inserta en un elemento <t>. Con la primera parte normal  y aunque en GoogleSheet no hay problemas con el tratamiento de espacios, en Excel serán eliminados si no se le adjudica el atributo xml:space = "preserve" para preservar espacios al elemento <t>.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
count="5" uniqueCount="5">
    ...
    <si>
        <r>
            <t xml:space="preserve">normal </t>
        </r>
        <r>
            <rPr>
                <rFont val="Courier"/>
                <color rgb="FFFF0000"/>
            </rPr>
            <t>courier-red</t>
        </r>
        <r>
            <t xml:space="preserve"> normal</t>
        </r>
    </si>
    ...
</sst>

Con la segunda parte courier-red se adjudica ese texto en <t>, mientras que el elemento <font> pasa a ser <rFont val="Courier"/> y el atributo color pasa a ser <color rgb="FFFF0000"/>. Vease que el número hexadecimal de color contiene un "FF" adicional al inicio. Es lo que se conoce como formato ARGB, donde ese primer grupo FF inidicará la transparencia en base 256. Sin embargo no he podido comprobar que esto funcione en GoogleSheet o Excel.

El último elemento con el texto  normal es similar al primero, incluyéndose también xml:space="preserve".

normal bold italic underline strike normal

En la cuarta fila de nuestro ejemplo encontramos el HTML normal <b>bold</b> <i>italic</i> <u>underline</u> <s>strike</s> normal. el El elemento <b> produce texto negrita, el elemento <i> produce texto itálica, el elemento <u> produce texto subrayado y el elemento <s> produce texto tachado. Estos elementos siguen vigentes pero deben usarse para un cometido diferente en lugar de sólo para aplicar estilo. En cualquier caso los navegadores los siguen renderizando como siempre.

La frase es una cadena compartida que se ubica en el índice 2 que incluimos dentro del elemento <v>:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    ...
    <sheetData>
        ...
        <row r="4" hidden="0" customHeight="1" ht="27">
            <c r="A4" t="s" s="0">
                <v>2</v>
            </c>
        </row>
    </sheetData>
</worksheet>

Observe en el archivo de cadenas compartidas que los elementos <b>, <i> y <u> se insertan en elementos <rPr> con esos mismos tags pero como elementos vacíos. En cambio el elemento <s> se inserta como <strike/>. Como antes, hay que preservar los espacios para que EXCEL no los elimine.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
count="5" uniqueCount="5">
    ...
    <si>
        <r>
            <t xml:space="preserve">normal </t>
        </r>
        <r>
            <rPr>
                <b/>
            </rPr>
            <t>bold</t>
        </r>
        <r>
            <t xml:space="preserve"> </t>
        </r>
        <r>
            <rPr>
                <i/>
            </rPr>
            <t>italic</t>
        </r>
        <r>
            <t xml:space="preserve"> </t>
        </r>
        <r>
            <rPr>
                <u/>
            </rPr>
            <t>underline</t>
        </r>
        <r>
            <t xml:space="preserve"> </t>
        </r>
        <r>
            <rPr>
                <strike/>
            </rPr>
            <t>strike</t>
        </r>
        <r>
            <t xml:space="preserve"> normal</t>
        </r>
    </si>
    ...
</sst>
bold bold-italic bold-italic-underline

El HTML de la quinta fila tiene el contenido <b>bold <i>bold-italic <u>bold-italic-underline</u></i></b>. Vease que son elementos anidados. El exterior es un <b> por lo que será texto negrita. En su interior hay un hijo <i> por lo que será texto negrita e itálica. Y en su interior hay un <u> por lo que su texto será negrita, itálica y subrayado. En el archivo de cadenas compartidas es la cadena con índice 3:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    ...
    <sheetData>
        ...
        <row r="5" hidden="0" customHeight="1" ht="27">
            <c r="A5" t="s" s="0">
                <v>3</v>
            </c>
        </row>
        ...
    </sheetData>
</worksheet>

Aunque en HTML los elementos están anidados, en los <rPr> no se pueden anidar. Para ello cuando hacemos la traducción desde HTML a XLSX se fuerza a que los hijos hereden de los padres sus estilos. Dará lugar a un primer elemento con texto negrita, un segundo con texto negrita e itálica y un tercero con texto negrita, itálica y subrayado:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
count="5" uniqueCount="5">
    ...
    <si>
        <r>
            <rPr>
                <b/>
            </rPr>
            <t xml:space="preserve">bold </t>
        </r>
        <r>
            <rPr>
                <b/>
                <i/>
            </rPr>
            <t xml:space="preserve">bold-italic </t>
        </r>
        <r>
            <rPr>
                <b/>
                <i/>
                <u/>
            </rPr>
            <t>bold-italic-underline</t>
        </r>
    </si>
    ...
</sst>
normal small big sub sup

Este ejemplo pone en evidencia que no siempre se consigue traducir correctamente el HTML de WXTABLE a XLSX. En la sexta fila el HTML es normal <small>small</small> <big>big</big> <sub>sub</sub> <sup>sup</sup>. En el archivo de cadenas compartidas se almacena con el índice 4:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    ...
    <sheetData>
        ...
        <row r="6" hidden="0" customHeight="1" ht="27">
            <c r="A6" t="s" s="0">
                <v>4</v>
            </c>
        </row>
        ...
    </sheetData>
</worksheet>

Los elementos de HTML <big> y <small> no tienen una traducción directa en XLSX. Para lograr algo similar actuamos con el elemento <sz> que fija el tamaño de la fuente. Esto funciona en parte, pues suponiendo que el tamaño inicial de la fuente son 16px, que equivale a 12pt, se trata de hacerla más pequeña con 10pt y más grande con 16pt. Si no fuera así la presentación no sería adecuada. En cuanto al subíndice y superíndice que se implementan en HTML con los elementos <sub> y <sup>, uso el elemento XLSX <vertAlign>, pero no consigo los resultados esperados en GoogleSheet y EXCEL Web, aunque si se consigue en EXCEL 2010 (ver capturas de pantalla en el primer apartado).

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
count="5" uniqueCount="5">
    ...
    <si>
        <r>
            <t xml:space="preserve">normal </t>
        </r>
        <r>
            <rPr>
                <sz val="10"/>
            </rPr>
            <t>small</t>
        </r>
        <r>
            <t xml:space="preserve"> </t>
        </r>
        <r>
            <rPr>
                <sz val="16"/>
            </rPr>
            <t>big</t>
        </r>
        <r>
            <t xml:space="preserve"> </t>
        </r>
        <r>
            <rPr>
                <vertAlign val="subscript"/>
            </rPr>
            <t>sub</t>
        </r>
        <r>
            <t xml:space="preserve"> </t>
        </r>
        <r>
            <rPr>
                <vertAlign val="superscript"/>
            </rPr>
            <t>sup</t>
        </r>
    </si>
</sst>

Fórmulas en contenidos de celda

Aparte de cadenas y números, también podemos encontrar fórmulas en los contenidos de celda. La séptima celda de nuestro ejemplo contiene el valor 246, resultado de su fórmula =[R2C1]*2 en WXTABLE, fórmula que se almacena en un atributo data-formula. En otro tema nos extenderemos más sobre las referencias y fórmulas. Ahora sólo vamos a presentar el ejemplo desde la perspectiva del elemento <sheetData>:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    ...
    <sheetData>
        ...
        <row r="7" hidden="0" customHeight="1" ht="27">
            <c r="A7" t="str" s="0">
                <f>$A$2*2</f>
                <v>246</v>
            </c>
        </row>
    </sheetData>
</worksheet>

Se observa que el tipo es t="str" que indica que su contenido es un cadena de fórmula, la que se introduce en un elemento <f>$A$2*2</f> tras traducir la referencia [R2C1] por $A$2. El resultado de la fórmula se añade en un elemento <v>246</v>. Vease que nada se pone en el archivo de cadenas compartidas.

Funciones no soportadas, errores y el elemento inlineStr

Figura
Figura. Contenidos de celda en WXTABLE

El otro tipo que traducimos es inlineStr usándolo sólo para mostrar casos de error. Se trata de una cadena no compartida que se introduce directamente en <sheetData>. Para ver esto en acción preparamos una tabla WXTABLE de ejemplo que se traduce en el XLSX de este enlace errores.xlsx. El código fuente del WXTABLE es el siguiente:

{
    "sheets":{
        "Tab1":{

            "attributes":{
                "1,1":{
                    "data-formula":"=icon()"
                },
                "2,1":{
                    "data-formula":"=x()",
                    "data-error":"",
                    "title":"Error@R2C1: La expresión \"x()\" contiene caracteres no permitidos."
                }
            },
            "styles":{},
            "values":[
                ["1","2"],
                ["",""],
                ["",""],
                ["",""]
            ]
        }
    },
    "images":[]
}

La primera celda contiene un icono SVG resultado de la fórmula =icon(). En WXTABLE podemos insertar iconos SVG desde los disponibles en este sitio. Puede verlos en Web Tools online: SVG Edit o en el tema Iconos SVG. En el argumento de esa función se pasa la clave del icono. Por ejemplo con =icon("print") se vuelca el icono . Sin argumento o si no se reconoce en la lista de iconos se vuelca el icono logo de este sitio Wextensible .

No he podido traducir estos iconos a XLSX pues parece no soportar SVG. En ese caso acusamos el error #ERROR translating to XLSX: Function icon() not supported, mensaje que insertamos con el tipo t="inlineStr" usando el elemento <is>:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    ...
    <sheetData>
        <row r="1" hidden="0">
            <c r="A1" t="inlineStr" s="0">
                <is>
                    <t>#ERROR translating to XLSX: Function icon() not supported.</t>
                </is>
            </c>
            <c r="B1"/>
        </row>
        <row r="2" hidden="0">
            <c r="A2" t="inlineStr" s="0">
                <is>
                    <t>#ERROR translating to XLSX: La expresión "x()" contiene caracteres no permitidos.</t>
                </is>
            </c>
        </row>
    </sheetData>
</worksheet>

En total en este momento WXTABLE contiene 147 operadores y funciones de las cuáles no he podido traducir 10 funciones, entre las que se encuentra icon(). En el siguiente tema veremos más sobre esto.

También usamos ese recurso para presentar los mensajes de error en las propias fórmulas de WXTABLE. En el ejemplo tenemos la función =x() inexistente en WXTABLE, que acusa el error #ERROR translating to XLSX: La expresión "x()" contiene caracteres no permitidos, mensaje que también ponemos en un inlineStr. Aunque XLSX dispone del tipo de error t="e", he preferido no utilizarlo para evitar contratiempos en el momento de abrirse el XLSX.