Control y validación lista desplegable en WXTABLE y XLSX

Figura
Figura. Control lista en WXTABLE

Hemos denominado este tema con el título Controles y Validaciones puesto que en WXTABLE sólo encontramos controles y en XLSX validaciones. Una validación en XLSX es una regla que impone restricciones a la hora de introducir valores en una celda. XLSX permite muchas clases de validaciones, entre las que se encuentra la limitación de valores a introducir a partir de una lista desplegable. La aplicación GoogleSheet también permite usar una casilla de verificación, aunque no la importa desde XLSX y la exporta a XLSX con un valor booleano TRUE o FALSE según su estado.

WXTABLE no contempla las validaciones, pero los controles pueden actuar como validaciones, disponiéndose de los controles lista desplegable, casilla de verificación y casillas de opciones. Estos dos últimos se conocen con los nombres checkbox y botones de radio, pues en HTML existen controles similares que se insertan con el elemento <input> de los tipos checkbox y radio. Mientras el elemento HTML similar a la lista desplegable es el <select>.

Aunque WXTABLE es realmente una tabla HTML, se impide insertar esos elementos en las celdas. La lista desplegable del ejemplo de la Figura, así como los controles checkbox y radio, son generados por el Gestor WXTABLE usando gráficos SVG, controlándose su comportamiento con el módulo JavaScript de WXTABLE. En el ejemplo de la imagen se observa una lista con los valores "a", "b", "c", "d" obligándose a que sólo se incluya un valor de esa lista.

Al exportar ese ejemplo con formato WXTABLE obtenemos este JSON:

"sheets": {
    "Tab1": {
        "attributes": {
            "1,1": {
                "data-control": "list;5,;1;a,b,c,d"
            }
        },
        "styles": {},
        "values": [
            ["1", "2"],
            ["b", ""],
            ["", ""],
            ["", ""]
        ]
    }
}
Figura
Figura. Editar un control lista en WXTABLE

A la celda se le dota de un atributo data-control con el valor "list;5,;1;a,b,c,d" que se genera con un editor de control tal como se muestra en la Figura.

El valor "list;5,;1;a,b,c,d" es una estructura de campos separados por punto y coma. El primer campo define el tipo de control, "list" en este caso. El segundo campo es "5," tiene dos subcampos separados por coma. El primero define el número de elementos a mostrar en la lista desplegable, cinco en este caso. El segundo subcampo se usa para un efecto que denominamos separador de items. Aparece vacío en este ejemplo y lo explicaremos en otro apartado, pues no pude exportar su efecto a XLSX.

El tercer campo define el índice de la lista seleccionado, indexando desde cero. El índice es el uno, con lo que figura seleccionado el segundo item de la lista. El último campo es la propia lista "a,b,c,d" de cadenas separada por comas. Esto quiere decir que no puede usuarse la coma ni el punto y coma dentro de las cadenas de la lista. La lista puede ser una explícita de valores separados por comas, tal como se ve en la Figura. Pero también puede ser una referencia a una celda o un rango o, incluso, una fórmula que devuelva una lista de valores. Las listas de valores o un rango son exportables a XLSX, pero no cuando es una fórmula.

Figura
Figura. Control lista en EXCEL

En la Figura se observa el resultado de la exportación XLSX en EXCEL web.

La validación se incluye en el archivo XML xl/worksheets/sheet1.xml usando el elemento <dataValidations> que agrupa todos los elementos <dataValidation> de esa hoja.

El atributo sqref="A1" referencia la celda donde aplicar la validación. El tipo es "list". Dentro de un elemento <formula1> se incluye la lista literal "a,b,c,d" encerrada entre comillas. Ahí también podría ir un rango que veremos en el siguiente apartado.

<dataValidations count="1">
    <dataValidation sqref="A1" allowBlank="0" type="list">
        <formula1>"a,b,c,d"</formula1>
    </dataValidation>
</dataValidations>

Lista a partir de un rango o intervalo en XLSX

Figura
Figura. Control lista con rango en WXTABLE

Exportar a XLSX una lista desplegable de valores es muy fácil tal como acabamos de ver en el apartado anterior. Pero si la lista proviene de un rango la cosa se complica. La Figura es un ejemplo en WXTABLE de una lista que se obtiene del rango =[R1C1]:[R4C1], fórmula que devuelve la lista "a,b,c,d".

La complicación surge de la forma en que trabaja GoogleSheet y EXCEL web. En ambas aplicaciones la fórmula se configura como =$A$1:$A$4 que es la traducción de la fórmula =[R1C1]:[R4C1] en WXTABLE. Sin embargo cuando se importa XLSX, EXCEL web requiere que el rango venga con eltipo R1C1, como =R1C1:R4C1, formato similar al de WXTABLE.

Sin embargo ambos permite poner un nombre en el rango, que se define en el elemento <definedName> que ya vimos en un tema anterior en el apartado Celdas identificadas XLSX. Las celdas o rangos identificados se almacenan en el archivo xl/workbook.xml disponibles para todo el libro. El del ejemplo es el siguiente:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    <sheets>
        <sheet state="visible" name="Tab1" sheetId="1" r:id="rId4"/>
    </sheets>
    <definedNames>
        <definedName name="_CT_Tab1A1A4">'Tab1'!$A$1:$A$4</definedName>
    </definedNames>
</workbook>

En la hoja de datos xl/worksheets/sheet1.xml encontraremos el elemento <dataValidation> con la fórmula:

<dataValidations count="1">
    <dataValidation sqref="B1" allowBlank="0" type="list">
        <formula1>_CT_Tab1A1A4</formula1>
    </dataValidation>
</dataValidations>
Figura
Figura. Control lista con rango en EXCEL

Observe que construimos el nombre _CT_Tab1A1A4 agregando un prefijo "_CT_" con objeto de identificarlo como exportado a XLSX. Hay que incluir el nombre de la hoja pues estos indentificadores estarán disponibles para todas las hojas del libro, como hemos dicho.

En la Figura se observa el resultado en EXCEL web, que también funciona en GoogleSheet. Pero hay varias limitaciones cuando exportamos desde WXTABLE.

En WXTABLE es posible identificar las cuatro celdas del rango [R1C1]:[R4C1] con los identificadores r1, r2, r3, r4 y usar la fórmula =[id=r1],[id=r2],[id=r3],[id=r4]. Pero no es posible exportarlo a XLSX. Ni siquiera usando un rango literal con {'Tab1'!r1,'Tab1'!r2,'Tab1'!r3,'Tab1'!r4}.

Tampoco es posible definir un rango con nombre usando un rango literal. Por lo tanto la única alternativa es obtener el rango y convertirlo en un rango definido con nombre.

Lista con separador de items en WXTABLE

Figura
Figura. Control lista con separador de items en WXTABLE

En el control de lista podemos incluir el separador de items, como se observa en la Figura. No me ha sido posible aún exportar este efecto a XLSX. Esta característica se utiliza cuando tenemos unos datos configurados en dos columnas. La primera contiene los identificadores, números en este caso del 1 al 4. En la segunda columna tenemos unas palabras que se asocian con esos identificadores. Piense por ejemplo en cuenta de clientes, con el identificador y el nombre del cliente. En la tercera columna usamos el operador "#" que concatena ambas columnas quedando por ejemplo 1: abc.

Podemos hacer que la lista referencie por el rango [R1C3]:[R4C3] con los identificadores y palabras concatenadas. Y configuramos el separador de items con ": ". Cuando se selecciona un item, el Gestor de Tablas separa el número del resto usando ese separador y lo que realmente selecciona es el identificador.

Un comportamiento similar es de uso extendido en otras tecnologías. Por ejemplo, el elemento HTML <select> permite poner un valor que se presenta y un valor que se selecciona. Si tuviéramos que traducir la lista anterior a HTML sería así:

<select>
    <option value="1">1: abc</option>
    <option value="2" selected>2: def</option>
    <option value="3">3: ghi</option>
    <option value="4">4: jkl</option>
</select>
Figura
Figura. Control lista con separador de items no exportable a EXCEL

Aplicaciones de bases de datos como MS Access también permite construir listas así. Es un pena que esto no sea posible en XLSX. O al menos yo no lo he conseguido.

Si se intenta exportar ese ejemplo se eliminarán de los items de la lista el separador y el texto que le sigue, quedando la lista con solo los identificadores, como se observa en la Figura, resultado de la exportación a XLSX.

Control casilla verificación (checkbox) en WXTABLE y XLSX

Figura
Figura. Control checkbox en WXTABLE

El control casilla de verificación o checkbox es el más simple en WXTABLE. Funciona de forma similar al que encontramos en HTML con el elemento <input type="checkbox">. Pero en WXTABLE usamos SVG para el aspecto gráfico y es el propio módulo el que se encarga del comportamiento.

En la Figura hemos insertado dos checkbox, el primero está marcado como verificado y el segundo no lo está. En las celdas de la segunda columna hay una fórmula que apunta a la de la primera columna, observándose que el valor de un checkbox es 1 si está verificado y 0 en otro caso. Esto es en esencia una restricción de validación forzando a que esa celda tome esos valores, que son equivalentes a los booleanos TRUE y FALSE.

Las celdas con un checkbox tiene un atributo data-control con el valor "check;;1;0,1". Como vimos para la lista desplegable, es una estructura de 4 campos. El primero es el tipo de control check. El segundo no se utiliza en este caso. El tercero contiene el valor 1 si está verificado y 0 en otro caso. El último campo es esa lista de valores "0,1". Utilizar una estructura como esta en los controles nos permite convertir un checkbox en una lista desplegable, como veremos después.

Figura
Figura. Control checkbox en GoogleSheet, no exportable a XLSX

Este control no es exportable directamente a XLSX. GoogleSheet tiene la posibilidad de insertar un checkbox o casilla de verifición, como se observa en Figura, pero no es exportable a XLSX.

Para exportar este control usamos una conversión del mismo en una lista desplegable, en caracteres gráficos o sus valores. En la configuración del exportador XLSX que vimos en el primer tema de esta serie podemos elegir la vista del checkbox como list, graphic o value. El valor por defecto es lista, quedando los dos elementos <dataValidation> del ejemplo de la siguiente forma:

<dataValidations count="2">
    <dataValidation sqref="A1" allowBlank="0" type="list">
        <formula1>"0,1"</formula1>
    </dataValidation>
    <dataValidation sqref="A2" allowBlank="0" type="list">
        <formula1>"0,1"</formula1>
    </dataValidation>
</dataValidations>
Figura
Figura. Control checkbox como lista en GoogleSheet

Se traduce el checkbox como una lista desplegable con los valores "0,1", como se observa en la Figura, resultado de este ejemplo en GoogleSheet, donde aparece desplegada la lista traducida del checkbox de la celda en la segunda fila.

La otra posibilidad es traducirlo como graphic. En este caso se usan los caracteres UNICODE "☐" y "☑" para la presentación del no verificado y verificado. Esto quiere decir que el control deja de ser un elemento de validación y pasa a ser un simple contenido de texto, almacenándose esos caracteres en el archivo de cadenas compartidas xl/sharedStrings.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
count="2" uniqueCount="2">
    <si>
        <t>☑</t>
    </si>
    <si>
        <t>☐</t>
    </si>
</sst>
Figura
Figura. Control checkbox en modo gráfico en GoogleSheet

En la Figura se observa el aspecto en GoogleSheet. Ahora las referencias en la segunda columna son a caracteres, replicándose los mismos.

La tercera posibilidad es traducir los checkbox como valores (value). Simplemente se usarán el valor 1 si estuviera verificado y el valor 0 en otro caso. También en este caso el control deja de se un elemento de validación pasando a ser un simple contenido de texto.

Control botones de radio en WXTABLE y XLSX

Figura
Figura. Control botones de radio en WXTABLE

El control botones de radio (radio buttons) en WXTABLE funciona de forma similar al que encontramos en HTML con el elemento <input type="radio">. Pero en WXTABLE usamos SVG para el aspecto gráfico y es el propio módulo el que se encarga del comportamiento.

En la Figura tenemos cuatro botones de radio pertenecientes al mismo grupo con título "x". Puede seleccionarse una opción de las cuatro o ninguna, pero en ningún caso más de una opción. Los botones de cada grupo son independientes de los otros grupos. En la segunda columna insertamos en cada celda la fórmula =[r0c-1] obteniéndose el valor del botón de radio adyacente en esa fila. Es tal que si está seleccionado devuelve su valor. Y si no lo está devuelve una cadena vacía.

En el archivo WXTABLE que se exporta vemos la declaración de atributos. Cada celda con un botón de readio tiene un atributo data-control. Por ejemplo el primero tiene el valor "radio;x;0;,a".

"attributes": {
    "1,1": {
        "data-control": "radio;x;0;,a"
    },
    "1,2:4,2": {
        "data-formula": "=[r0c-1]"
    },
    "2,1": {
        "data-control": "radio;x;1;,b"
    },
    "3,1": {
        "data-control": "radio;x;0;,c"
    },
    "4,1": {
        "data-control": "radio;x;0;,d"
    }
}

Esa estructura es la de cuatro campos de los controles. El primero es el tipo "radio". El segundo es el nombre del grupo de botones de radio "x". El tercero tendrá un 0 si no está seleccionado y un 1 en otro caso. El último es una lista con dos items como ",a", donde la primera posición es una cadena vacía para cuando está desactivado y la segunda es el valor del botón para cuando esté activado.

XLSX no soporta botones de radio como validaciones. Así que hemos de traducirlo a una lista desplegable, una vista gráfica o una vista de valores, de forma similar a como hicimos con el control de verificación. Esta es la traducción a lista:

<dataValidations count="1">
    <dataValidation sqref="A1" allowBlank="0" type="list">
        <formula1>"-,a,b,c,d"</formula1>
    </dataValidation>
</dataValidations>
Figura
Figura. Control botones de radio traducido como una lista desplegable en GoogleSheet

Se agrega un item "-" al inicio de la lista para contemplar el caso cuando ningún botón esté seleccionado. En la Figura puede ver el resultado en GoogleSheet y como se inserta como una validación de lista de valores.

Figura
Figura. Control botones de radio traducido gráficamente en EXCEL

Existe la posibilidad de realizar una traducción gráfica usando los caracteres UNICODE "⦾" y "⦿" para los botones desactivado y activado respectivamente. En la Figura se observa el resultado en EXCEL. Como el caso de los checkbox gráficos, ahora son simplemente valores de texto y dejar de ser un control de validación. Observe que la segunda columna tiene fórmulas que replican la primera, reflejando el mismo contenido. También existe la posibilidad de traducir como valores, en cuyo caso se pondría una cadena vacía si estuviera desactivado o el contenido de la segunda posición de cada lista si estuviera activado.