BIFF5 Excel - указание на записи XF и FONT из записи LABEL - PullRequest
0 голосов
/ 14 сентября 2010

Я использую API FireFox для записи в двоичный файл с моим расширением FireFox на основе JavaScript.

Пока я полностью могу записать информацию в файл в формате BIFF5 и изменить размерстолбцы успешно.

Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, что я пытаюсь, я не могу получить индекс XF (ixfe) в записи LABEL, чтобы указывать на запись XF.(Эта или моя XF-запись неверна)

В основном я пытаюсь изменить вес шрифта в нескольких ячейках на жирный.

Я знаю, что могу использовать операторы для очистки этого коданемного, но пока я устраняю неполадки, я делаю это по одной записи за раз, чтобы я мог легко видеть, что происходит.

Вот что я пишу для BOF:

excelData[excelData.length] = pack("vvvvvv", 0x809, 0x08, 0x0500, 0x10, 0x096C, 0x07C9); // BOF Worksheet

excelData[excelData.length] = pack("vvvvvvvvvvv", 0x003D, 0x0012, 0x0000, 0x0000, 0x25BC, 0x1572, 0x0038, 0x0000, 0x0000, 0x0001, 0x0258); // WINDOW1
excelData[excelData.length] = pack("vvv", 0x0022, 0x0002, 0x0000); // 1904

excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7);
excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x7FFF, 0x0190, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 normal - index 0
excelData[excelData.length] = "Calibri";
excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7);
excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x7FFF, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 1
excelData[excelData.length] = "Calibri";
excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7);
excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x7FFF, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 2
excelData[excelData.length] = "Calibri";
excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7);
excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x7FFF, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 3
excelData[excelData.length] = "Calibri";
excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7);
excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x7FFF, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 5
excelData[excelData.length] = "Calibri";
excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7);
excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x7FFF, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 6
excelData[excelData.length] = "Calibri";
excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7);
excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x7FFF, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 7
excelData[excelData.length] = "Calibri";


excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0x00,   0x2020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up?
excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0x00,   0x2020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? // User Defined

Вот что я пишу для LABEL:

    excelData[excelData.length] = pack("vvvvvv", 0x0204, Number(L)+8, Row, Col, 0x11, L);
excelData[excelData.length] = Value; // Cell Value

Так что, если я не ошибаюсь, 0x11 в LABEL указывает на ixfe 17, который является 16-й записью XF.

Запись XF указывает на ifnt (индекс шрифта) 0x0006, который равен ifnt 6, или на 6-ю запись FONT благодаря неиспользуемому индексу 4.

Что происходит, так это то, что ячейки все ещепросто используя шрифт по умолчанию (ifnt 0) независимо от того, что я изменил ixfe в записи LABEL или ifnt в записи XF на.

Я прочитал также каждую унцию документации, которую смог найтиas попытался перепроектировать несколько библиотек для PHP.

На данный момент, любые указания будут с благодарностью, потому что я полностью вне идей.

Большое спасибо, ребята!

РЕДАКТИРОВАТЬ

Я многому научился за последние пару часов, спасибо за вашу помощь.Я буду публиковать новый вопрос о новой проблеме, с которой я сталкиваюсь относительно потока рабочих книг.

Новый вопрос для всех, кто может отследить это и иметь подобные проблемы: BIFF5 - Excel - Проблемы потока рабочей книги(поврежденный файл)

1 Ответ

1 голос
/ 14 сентября 2010

Для полужирного шрифта записи Font требуется значение 0x02BC по смещению 6. Для справки на будущее, если впоследствии вы захотите добавить дальнейшую стилизацию шрифта, курсиву требуется битовая маска 0x0002 со смещением 2, тогда как для зачеркивания требуется битовая маска 0x0008. со смещением 2. Смещение 4 указывает на индекс цвета, если вы хотите изменить цвет шрифта, тогда как смещение 8 обозначает верхний индекс / нижний индекс, а смещение 10 обозначает тип подчеркивания. Смещения 11, 12 и 14 определяют семейство шрифтов, набор символов и размер имени шрифта, за которым следует само имя шрифта.

Вы можете найти полную информацию обо всех опциях на http://msdn.microsoft.com/en-us/library/cc313154(v=office.12).aspx

EDIT

Глядя на свою запись XF, вы пишете ее как запись BIFF5, а не как более позднюю версию BIFF8. Ссылка, на которую я ссылался в работающем примере, на самом деле является примером BIFF8.

BIFF8 будет: - заголовок = пакет ("vv", 0x00E0, 0x0014); data = pack ("vvvCCCCVVv", fontIndex, numberFormatIndex, 0xFFF5, выравнивание, вращение, идентификация + shrinkToFit + textDirection, атрибуты, border1, border2, fg_and_bg_colours);

BIFF5 - это: - заголовок = пакет ("vv", 0x00E0, 0x0010); data = pack ("vvvvvvvv", fontIndex, numberFormatIndex, 0xFFF5, выравнивание, fg_and_bg_colours, fillPattern, border1, border2);

Признаюсь, я более привык работать с форматом BIFF8; но, читая подробности о формате для BIFF5, я не вижу очевидных проблем с xf, который вы пишете. Я знаю, что в PHPExcel мы явно записываем 16 записей Font для предопределенных файлов перед записью новых записей пользовательских шрифтов, а затем всегда устанавливаем записи XF, указывающие на пользовательские шрифты.

...