c# - guardar - Cómo escribir la fórmula en el archivo binario de excel?
formato xlsx (3)
He encontrado un proyecto de código abierto con la funcionalidad básica de Excel, escribir celda, escribir en la celda, cambiar el color, fuente y demás. Falta una cosa, y agrega Fórmula, y no pude implementarla, así que si alguien sabe cómo hacerlo, sería genial.
Formatos BIFF:
internal sealed class BIFF
{
public const ushort DefaultColor = 0x7fff;
public const ushort BOFRecord = 0x0209;
public const ushort EOFRecord = 0x0A;
public const ushort FontRecord = 0x0231;
public const ushort FormatRecord = 0x001E;
public const ushort LabelRecord = 0x0204;
public const ushort WindowProtectRecord = 0x0019;
public const ushort XFRecord = 0x0243;
public const ushort HeaderRecord = 0x0014;
public const ushort FooterRecord = 0x0015;
public const ushort ExtendedRecord = 0x0243;
public const ushort StyleRecord = 0x0293;
public const ushort CodepageRecord = 0x0042;
public const ushort NumberRecord = 0x0203;
public const ushort ColumnInfoRecord = 0x007D;
}
método de ejemplo para escribir int y cadena
private void WriteStringCell(BinaryWriter writer, CellInfo cell)
{
string value;
if (cell.Value is string)
value = (string)cell.Value;
else
value = cell.Value.ToString();
if (value.Length > 255)
value = value.Substring(0, 255);
ushort[] clData = { BIFF.LabelRecord, 0, 0, 0, 0, 0 };
byte[] plainText = Encoding.GetEncoding(CodePage).GetBytes(value);
int iLen = plainText.Length;
clData[1] = (ushort)(8 + iLen);
clData[2] = (ushort)cell.Row;
clData[3] = (ushort)cell.Column;
clData[4] = (ushort)cell.FXIndex;
clData[5] = (ushort)iLen;
WriteUshortArray(writer, clData);
writer.Write(plainText);
}
private void WriteNumberCell(BinaryWriter writer, CellInfo cell)
{
double dValue = Convert.ToDouble(cell.Value);
ushort[] clData = { BIFF.NumberRecord, 14, (ushort)cell.Row, (ushort)cell.Column, (ushort)cell.FXIndex };
WriteUshortArray(writer, clData);
writer.Write(dValue);
}
puede descargar el código fuente desde el enlace proporcionado. Entonces, lo que quiero es tener un método WriteFromulaCell que escriba la fórmula en Excel. Sin éxito en absoluto.
Gracias por adelantado.
IIRC, un archivo "binario" de Excel es realmente un archivo ZIP con código XML (al menos esto es cierto para los formatos de Excel más nuevos). Anteriormente utilicé la biblioteca de Microsoft para leer esos archivos.
Intente usar NPOI , tiene la capacidad de agregar fórmula, es de código abierto y gratuito, o también hay otro proyecto de código abierto xls: excellibrary . Ambos proyectos reclaman la implementación completa de BIFF.
Las fórmulas en BIFF se representan como flujos binarios de tokens. Si lo que estás tratando de hacer es crear un WriteFormulaCell () que pueda tomar una cadena como "= SUMA (A3: Q47)" y convertirla en un registro de FORMULA válido, eso es un par de meses de trabajo, o algunos años de trabajo, dependiendo. Además, los códigos de bytes que usaron para los tokens cambiaron unas pocas veces: cada versión de BIFF tenía ALGUN cierto cambio u otro en la forma en que codificaban estas cosas.
Si lo que intenta hacer es insertar una fórmula específica y simple en un lugar específico, ejecute Excel, escriba la fórmula en el lugar correcto en una hoja de cálculo vacía, guárdelo como Excel 97 y eche un vistazo al archivo BIFF. Encontrará un registro FORMULA con la secuencia de token analizada correctamente, que puede copiar e insertar en su propio archivo. ASUMO que usted está al tanto de toda la referencia relativa / referencia absoluta. Las referencias a otras hojas serán por índice, no por nombre. Los nombres definidos no funcionarán en absoluto con este truco. Se pueden aplicar otras limitaciones, su millaje puede variar, no hay garantía implícita, etc.