如何将公式写入excel二进制文件

本文关键字:excel 二进制文件 | 更新日期: 2023-09-27 18:19:33

我找到了一个开源项目,该项目具有excel的基本功能,可以编写单元格、将int写入单元格、更改颜色、字体等。缺少一件事,以及它的附加公式,我无法实现它,所以如果有人知道如何做到这一点,那就太好了。

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;       
    }

写入int和字符串的示例方法

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);
        }

您可以从提供的链接下载源代码。因此,我想要的是有一个将公式写入excel的方法WriteFromulaCell。根本没有成功。

提前谢谢。

如何将公式写入excel二进制文件

BIFF中的公式表示为令牌的二进制流。如果你想创建一个WriteFormulaCell(),它可以接受像"=SUM(A3:Q47)"这样的字符串,并将其转换为有效的FORMULA记录,这需要几个月的工作,或者几年的工作,具体取决于情况。此外,他们用于令牌的字节码也发生了几次变化——每个版本的BIFF对编码这些东西的方式都有一些变化。

如果你想做的是在特定的地方插入一个特定的、简单的公式,启动Excel,在空的电子表格上的正确位置键入公式,保存为Excel 97,然后查看BIFF文件。您将找到一个具有正确解析的令牌流的FORMULA记录,您可以将其复制并插入到自己的文件中。我假设你知道整个相对参考/绝对参考的事情。对其他图纸的引用将按索引,而不是按名称。使用这个技巧,定义的名称根本不起作用。其他限制可能适用,您的里程可能会有所不同,没有隐含的保修等。

试试NPOI,它有添加公式的能力,它是开源的,免费的,或者还有另一个开源的xls项目:excellibrary。两个项目都声称全面实施BIFF。

IIRC,Excel"二进制"文件实际上是一个带有XML代码的ZIP文件(至少对于较新的Excel格式是这样)。我以前使用过微软的库来读取这些文件。