【问题标题】:How to Write Formula into excel Binary file?如何将公式写入excel二进制文件?
【发布时间】:2012-01-06 14:39:07
【问题描述】:

我找到了一个打开的source project,它具有基本的 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和string的示例方法

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

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

提前致谢。

【问题讨论】:

  • 为什么不使用 Excel 的自动化模型?
  • 由于 BIFF,我现在使用互操作,它的速度很慢,如果超过 3k 条记录就会中断,等等,我找到了这个库,它在不到 3 秒的时间内生成了 10k 条记录。跨度>
  • 好的。所以是性能(这种背景对Qs很重要)。通过使用 Excel 自动化从一次单元格变为整个范围,您已经看到了一个数量级的性能变化,您确定如果没有这种根本性的变化,您就无法提高性能吗?

标签: c# excel xls excel-formula


【解决方案1】:

BIFF 中的公式表示为令牌的二进制流。如果您要做的是创建一个 WriteFormulaCell() 可以接受像“=SUM(A3:Q47)”这样的字符串并将其转换为有效的 FORMULA 记录,那么这需要几个月的工作,或者几年工作,取决于。此外,他们用于标记的字节码也发生了几次变化——每个版本的 BIFF 都对他们编码这些内容的方式进行了一些更改。

如果您要在特定位置插入特定的简单公式,请启动 Excel,将公式输入到空电子表格的正确位置,另存为 Excel 97,然后查看BIFF 文件。您将找到具有正确解析的令牌流的 FORMULA 记录,您可以将其复制并插入到您自己的文件中。我假设您知道整个相对参考/绝对参考的事情。对其他工作表的引用将按索引,而不是按名称。定义的名称根本不适用于这个技巧。其他限制可能适用,您的里程可能会有所不同,不暗示任何保证等。

【讨论】:

  • 谢谢我已经开始使用 NPOI 库了 :)
【解决方案2】:

尝试使用NPOI,它具有添加公式的能力,它是开源免费的,或者还有另一个开源的xls项目:excellibrary。这两个项目都声称完全实现了 BIFF。

【讨论】:

  • 我都试过了,NPOI慢了,20分钟导出复杂的excel文件,我有967个。
  • 还有一件事,它们需要 3.5 .NET 框架,而在我需要实现它的服务器上是 .NET 2.0,暂时没有升级。
  • 好吧,至少你可以看看源代码,看看他们是如何编写公式的
  • 我会这样做,但我今天需要完成这些报告。 :)
【解决方案3】:

IIRC,一个 Excel“二进制”文件实际上是一个带有 XML 代码的 ZIP 文件(至少对于较新的 Excel 格式是这样)。我以前使用Microsoft's library 来读取这些文件。

【讨论】:

  • 我不需要读我需要写,它必须是.xls文件格式,即Excel 97-2003可读
猜你喜欢
  • 2012-12-25
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多