2012-01-06 2 views
3

Я нашел один открытый source project с базовой функциональностью excel, записываю ячейку, записываю int в ячейку, меняю цвет, шрифт и прочее. Одна вещь отсутствует, и ее добавление Формулы, и я не смог ее реализовать, поэтому, если кто-нибудь знает, как это сделать, было бы здорово.Как написать формулу в двоичный файл excel?

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;  

    } 

пример метод для написания междунара и строк

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. Никаких успехов.

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

+0

Почему бы не использовать модель автоматизации Excel? – Richard

+0

из-за BIFF, и теперь я использую interop и его медленный, ломается, если более 3-х записей и т. Д., Я нашел эту библиотеку и генерирует 10k записей менее чем за 3 секунды. –

+0

OK. Таким образом, это * производительность * (этот вид фона важен для Qs). Поняв, что на самом деле изменилось перфоманс, перейдя от ячейки за один раз до целых диапазонов с помощью автоматизации Excel, вы уверены, что не можете улучшить свою производительность без таких радикальных изменений? – Richard

ответ

0

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

+0

Я пробовал их все, NPOI медленный, 20 минут для экспорта сложного файла excel, и у меня есть 967 из них. –

+0

и еще одна вещь, для них требуется 3.5 .NET framework, а на сервере, где мне нужно реализовать это, .NET 2.0, без обновления. –

+0

ну, по крайней мере, вы можете посмотреть на источник и посмотреть, как они пишут формулу –

0

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

+0

Мне не нужно читать Мне нужно писать, и это должен быть формат файла .xls, что означает читаемый Excel 97-2003 –

+1

BIFF - это двоичный формат, используемый с версиями старше 2007 года –

1

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

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

+0

Thanx Я начал использовать библиотеку NPOI :) –

Смежные вопросы