Как записать формулу в двоичный файл Excel? - PullRequest
3 голосов
/ 06 января 2012

Я нашел один открытый исходный проект с основными функциями 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);
        }

Вы можете скачать исходный код по приведенной ссылке.Поэтому я хочу иметь метод WriteFromulaCell , который будет записывать формулу в Excel.Совсем безуспешно.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 06 января 2012

Формулы в BIFF представлены в виде двоичных потоков токенов. Если вы пытаетесь создать WriteFormulaCell (), который может принять строку типа «= SUM (A3: Q47)» и превратить ее в допустимую запись FORMULA, это пара месяцев работы или несколько лет работы, в зависимости. Кроме того, байт-коды, которые они использовали для токенов, менялись несколько раз - каждая версия BIFF имела НЕКОТОРЫЕ изменения или иное, как они кодировали этот материал.

Если вы пытаетесь вставить конкретную простую формулу в определенное место, запустите Excel, введите формулу в нужное место на пустой электронной таблице, сохраните как Excel 97 и посмотрите на BIFF файл Вы найдете запись FORMULA с правильно проанализированным потоком токенов, который вы можете скопировать и вставить в свой собственный файл. Я предполагаю, что вы знаете обо всей относительной / абсолютной ссылке. Ссылки на другие листы будут по индексу, а не по имени. Определенные имена не будут работать с этим трюком. Могут применяться и другие ограничения, пробег может отличаться, гарантия не предоставляется и т. Д.

0 голосов
/ 06 января 2012

Попробуйте использовать NPOI , у него есть возможность добавления формулы, он с открытым исходным кодом и бесплатный, или есть также другой проект с открытым исходным кодом xls: excellibrary .Оба проекта претендуют на полную реализацию BIFF.

0 голосов
/ 06 января 2012

IIRC, «двоичный» файл Excel на самом деле представляет собой ZIP-файл с XML-кодом (по крайней мере, это верно для более новых форматов Excel). Ранее я использовал библиотеку Microsoft для чтения этих файлов.

...