Apache POI usa eventmodel para leer archivos grandes Excel (3) Suplemento de contenido en formato Xlsx

Parte del contenido de este artículo proviene de ECMA-376
http://www.ecma-international.org/publications/standards/Ecma-376.htm

En la sección anterior, ya entendí la mayor parte de la composición de OOXML. Sin embargo, en la operación real, Goose encontró t="shared"una fórmula compartida de este tipo, que no apareció en el artículo anterior. Se encontró en stackOverflow que es una fórmula compartida, pero el contenido más detallado se ha ido.

En las descripciones buscadas en Baidu, Google y stackOverflow, había muy poca información que explicara OOXML, así que finalmente tuve que volver a la raíz y mirarlo en la wiki, y descubrí que OOXML fue formulado por ECMA-376.

El momento en que apareció el formato .xlsx fue 2007, y cumplía con este estándar, el momento en el que nació este estándar debe ser en 2007 o antes. Después de buscar, se encontró que la primera edición de ECMA-376 1st fue lanzada en 2006, así que descárgalo. Baja y mira el contenido.

Después de la consulta, se encuentra que las definiciones de campo en la celda del XML de .xlsx están definidas en SpreadsheetML. El siguiente es el contenido original de ECMA:

8.4 SpreadsheetML
Esta subcláusula presenta la forma general de un paquete SpreadsheetML e identifica algunos de sus principales tipos de elementos.
(Consulte la Parte 3 para obtener una introducción más detallada). Un paquete SpreadsheetML
tiene una relación de tipo officeDocument, que especifica la
ubicación de la parte principal en el paquete. Para un
documento SpreadsheetML , esa parte contiene la definición del libro de trabajo.

Aquí dice que el contenido detallado está en la tercera parte, por lo que encontré la tercera parte y descubrí que efectivamente existe:
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Después de buscar, agregué una parte del contenido que se debe usar. Estos son todos de ECMA-376 1st part3:

3.2.9.2.1 Fórmulas compartidas

<row r="7" spans="4:8">
  <c r="H7" s="1">
    <f t="shared" ref="H7:H11" ce="1" si="0">SUM(E7:G7)</f>
    <v>1.0246225028914113</v>
  </c>
</row>
<row r="8" spans="4:8">
  <c r="H8" s="1">
    <f t="shared" ce="1" si="0">SUM(E8:G8)</f>
    <v>0.9063376048733931</v>
  </c>
</row>

Así como las cadenas en las celdas pueden ser extremadamente omnipresentes y redundantes en una hoja (y, por lo tanto, deben optimizarse), las fórmulas también son extremadamente omnipresentes en una hoja y, a menudo, pueden optimizarse.

Considere la tabla del ejemplo anterior, donde la columna H contiene una fórmula que suma los números de las columnas E a G, para cada fila.

La única diferencia entre las fórmulas de H6: H12 es que la referencia aumenta en 1 fila de una fila a la siguiente.

Por lo tanto, se crea una optimización en la que solo se debe escribir la fórmula en H6, con alguna información adicional que indique hasta dónde propagar la fórmula una vez cargada.

Esto permite que la aplicación de carga cargue y analice solo la primera de las fórmulas compartidas y luego aplique más rápidamente las transformaciones necesarias para producir las fórmulas relacionadas adicionales en las celdas posteriores.

Tenga en cuenta que si bien las fórmulas se pueden compartir, es conveniente permitir un fácil acceso al contenido de una celda.

Por lo tanto, se permite que se escriban todas las fórmulas, pero solo es necesario cargar y analizar la fórmula principal de una fórmula compartida.

3.2.9 Celda

<c r="B3">
  <f>B2+1</f>
  <v>2</v>
</c>

La propia celda es expresada por la ccolección.

Cada celda indica su ubicación en la cuadrícula utilizando una notación de referencia de estilo A1.

Una celda también puede indicar un identificador de estilo (atributo s) y un tipo de datos (atributo t).

Los tipos de celda incluyen cadena, número y booleano.

Para optimizar las operaciones de carga / guardado, los valores de datos predeterminados no se escriben.

3.2.9.1 Valores de celda

Las celdas contienen valores, ya sea que los valores se hayan escrito directamente (por ejemplo, la celda A2 en nuestro ejemplo tiene el valor Enlace externo :) o son el resultado de un cálculo (por ejemplo, la celda B3 en nuestro ejemplo tiene la fórmula B2 + 1).

Los valores de cadena de una celda no se almacenan en la tabla de celdas a menos que sean el resultado de un cálculo.

Por lo tanto, en lugar de ver Enlace externo: como el contenido del vnodo de la celda , verá un índice de base cero en la tabla de cadenas compartidas donde esa cadena se almacena de forma única.

Esto se hace para optimizar el rendimiento de carga / ahorro y para reducir la duplicación de información.

Para determinar si el 0 en ves un número o un índice de una cadena, se debe examinar el tipo de datos de la celda.

Cuando el tipo de datos indica cadena, entonces es un índice y no un valor numérico.

En ECMA part4, finalmente encontré la definición de la fórmula

Inserte la descripción de la imagen aquí

También hay definiciones de tipos comunes.
Inserte la descripción de la imagen aquí

Lo agregaré aquí en este momento, y volveré para agregarlo si es necesario en el futuro

Siguiente: Apache POI usa eventmodel para leer archivos grandes de código de muestra de Excel (4)

Supongo que te gusta

Origin blog.csdn.net/weixin_42072754/article/details/110849603
Recomendado
Clasificación