.. | ||
comment.slk | ||
README.md | ||
shared_formula.slk |
Symbolic Link format
Files start with ID
(0x49 0x44
). Files are interpreted as plaintext in the
system ANSI codepage.
This is a native file format of Multiplan and has been supported in all versions of Excel for Windows (to date). It is also used in the game "Warcraft III" and various mods including "Defense of the Ancients".
Basics
Records
The file consists of a series of plaintext records. Records are separated by
newline characters (both \r\n
and \n
newlines are accepted by newer versions
of Excel, but generated files should prefer CRLF).
As stated in the Multiplan manual, "parsers must be prepared to ignore records and fields that they do not understand". Loosely speaking, software can report error messages on each unsupported record but should read valid records.
Fields
A record consists of a record type and a series of fields. Each part of the
record is separated by a single ;
character.
The literal semicolon is encoded as two consecutive semicolons ;;
. Example:
C;Y1;X1;K"abc;;def"
Global State
The Y
and X
fields set the current row / column before processing records.
Parsing is stateful. Records that apply to a specific cell but do not have X
or Y
fields will use the global state:
F;M4;Y1;X1 <-- set current cell to A1
// current cell is A1
C;K"A1" <-- set cell value to "A1"
F;M5;X2 <-- set current column to B (no Y -> row is unchanged)
// current cell is B1
C;K"C1";X3 <-- set current column to C, then assign value "C1"
// current cell is C1
C;K"C2";Y2 <-- set current row to 2, then assign value "C2"
// current cell is C2
F;M4 <-- set current cell style
This also means that records must be processed in order.
Encoding
In addition to the escaped semicolon, Excel understand two types of Encodings. They are not covered in the Multiplan documentation.
Raw Byte Trigrams
Trigrams matching the pattern \x1B[\x20-\x2F][\x30-\x3F]
are decoded into a
single byte whose high bits are taken from the second character and whose low
bits are taken from the third character.
For example. "\x1B :" == "\x1B\x20\x3A
encodes the byte "\x0A"
(newline)
"\x1B#;
encodes a literal semicolon.
Special Escapes
Excel also understands a set of special escapes that start with \x1BN
. For
clarity, the \x1BN
part is not included in the table:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0_ |
||||||||||||||||
1_ |
||||||||||||||||
2_ |
* |
& |
) |
P |
||||||||||||
3_ |
||||||||||||||||
4_ |
||||||||||||||||
5_ |
||||||||||||||||
6_ |
||||||||||||||||
7_ |
||||||||||||||||
8_ |
j |
|||||||||||||||
9_ |
z |
|||||||||||||||
A_ |
! |
" |
# |
( |
% |
' |
H |
S |
c |
+ |
R |
|||||
B_ |
J |
1 |
2 |
3 |
B |
5 |
6 |
7 |
Q |
k |
; |
< |
= |
> |
? |
|
C_ |
AA |
BA |
CA |
DA |
HA |
JA |
a |
KC |
AE |
BE |
CE |
HE |
AI |
BI |
CI |
HI |
D_ |
b |
DN |
AO |
BO |
CO |
DO |
HO |
i |
AU |
BU |
CU |
HU |
l |
{ |
||
E_ |
Aa |
Ba |
Ca |
Da |
Ha |
Ja |
q |
Kc |
Ae |
Be |
Ce |
He |
Ai |
Bi |
Ci |
Hi |
F_ |
s |
Dn |
Ao |
Bo |
Co |
Do |
Ho |
y |
Au |
Bu |
Cu |
Hu |
` | ` |
For example, \x1BNj
encodes byte 0x8C
- Both
\x1BN0
and\x1BNJ
appear to encode0xB0
- Both
\x1BN9
and\x1BN)
appear to encode0x27
- Bytes
0xA8
,0xB0
and0xB4
have space characters (0xA8
is encoded as\x1BNH\x20
Record Types
The following table lists the known record types.
Type | Description | Vintage |
---|---|---|
ID |
Header | Multiplan |
P |
Style | Excel |
F |
Format | Multiplan |
B |
Dimensions | Multiplan |
O |
Options | Excel |
NN |
Defined Name | Multiplan |
C |
Cell | Multiplan |
E |
EOF | Multiplan |
W |
Window Layout | Multiplan |
NE |
External Link | Multiplan |
NU |
Filename Substitution | Multiplan |
NL |
Chart External Link | Excel |
The supported fields for each type are listed in the relevant subsections. Excel supports every field that Multiplan supports.
Header (ID)
Files must start with the ID
record.
Multiplan
The P
field specifies the name of the program that generated the file. This
record is not validated, although the typical value WXL
is used in Excel.
Style (P)
Undocumented
The P
record encodes data for multiple style tables, based on the fields. Each
table is zero-indexed.
ID;PWXL;N;E
P;PGeneral
P;P0
P;P0.00
P;P#,##0
The 4 P
records above are number format records. In the number format table,
index 0 will be General
, index 1 will be 0
, etc.
Number Format Table
The P
field indicates that the record specifies a number format. The value is
an escaped number format similar to XLS encoding. ;;
encodes a semicolon as
used in a multi-part number format. For example:
P;P#,##0.00_);;[Red]\(#,##0.00\)
corresponds to the XLSX number format #,##0.00_);[Red]\(#,##0.00\)
Font Table
The four default fonts (normal, bold, italic, bold+italic) are specified with
the F
field. Other fonts are specified with the E
field. It appears that
Excel treats the fields as interchangeable, so either field type can be used.
Other supported fields are listed below:
Field | Interpretation |
---|---|
F/E |
Font name |
M |
Font size in twips |
L |
Indexed color (from 1 to 64) |
S |
Font Attributes (see table below) |
The S
field value is a list of attribute characters:
Value | Interpretation |
---|---|
B |
Bold |
I |
Italic |
U |
Underline |
S |
Strikeout |
Format (F)
This record includes worksheet-level and cell-level formatting properties. The fields and interpretations vary based on position in the file.
Common Value Types
Multiplan "Cell Type" format codes:
Value | Interpretation | Multiplan name |
---|---|---|
D |
Default | Def |
C |
"Continuous" | Cont |
E |
Exponential | Exp |
F |
Fixed Point | Fix |
G |
General | Gen |
$ |
Currency | Dollar |
* |
Data Bar Cond Fmt | Bar Graph |
% |
Percentage | Percent |
Note that there is an error in the sylksum.doc
documentation: C
is a normal
format (the spec claims it is "currency")
Multiplan "Horizontal Alignment" format codes:
Value | Interpretation | XLS HorizAlign |
---|---|---|
D |
Default | |
G |
General (text left, numbers right) | 0x00 ALCGEN |
L |
Left | 0x01 ALCLEFT |
C |
Center | 0x02 ALCCTR |
R |
Right | 0x03 ALCRIGHT |
X |
Fill | 0x04 ALCFILL |
- |
Unspecified | 0xFF ALCNIL |
Default Styling (immediately after P records)
The records in this area typically define high-level properties including the default format and column widths.
Field | Interpretation |
---|---|
P# |
Default number format (index into table) |
M# |
Default row height in twips |
D_#_# |
Default cell type, decimals, horizontal alignment, column width |
For example, the following record sets the default number format to index 0, the default cell type to "General", the left cell alignment to left, the default column width to 8 characters, and the default row height to 32 pt:
F;P0;DG0L8;M640
Column Widths (immediately after O record)
The W
field specifies widths for multiple columns and takes the form:
F;W# # # <-- 1-indexed start col, 1-indexed end col, width in characters
The first two parameters are the starting and ending column (1-indexed numbers) and the last parameter is the width as measured in characters. When specifying a single column width, the start and end should be equal:
F;W1 1 11 <-- column "A" is 11 characters wide
F;W2 3 6 <-- columns "B" and "C" are 6 characters wide
Cell Styling (interspersed with cell records)
Cell level styling is distinguished by the absence of the W
, R
, D
and C
fields or the presence of the X
or Y
fields.
X
and Y
fields modify the global state before applying formatting.
Field | Interpretation |
---|---|
F_#_ |
Simple format: cell type, decimals, horizontal alignment |
S... |
Style string (see below) |
P# |
Number format (index into format table) |
The style string can include the following attributes:
Value | Interpretation |
---|---|
D |
Bold |
I |
Italic |
M# |
Font index |
L |
Left Border |
R |
Right Border |
T |
Top Border |
B |
Bottom Border |
S |
Fill "gray125" |
Row Heights and Styling (after column widths, before first cell of row)
The R
field indicates that a format record applies to the specified row. In
addition to the cell styling properties, the row height can be specified with
the M
field.
For example, the following record sets the height of row 5 to 19 pt and sets the font to index 78 of the font table:
F;R5;SM78;M380 <-- use index 78 of font table and set height to 19 pt for row 5
Column Styling (after column widths, before first cell of column)
The C
field indicates that a format record applies to the specified column. As
column widths are handled separately, the supported fields are identical to the
cell-level styling fields:
F;C1;SM78 <-- use index 78 of font table for column 1
Dimensions (B)
The bounds are not authoritative, and cells can exist outside of the range. As with XLSX/XLSB/XLS, Excel ignores this field and uses the actual cell records to determine the dimensions.
Multiplan
The Y
and X
fields specify the number of rows and columns respectively.
Undocumented
The D
field specifies the worksheet dimensions, in the order r c R C
with
zero-indexed values. For example:
B;Y5;X3;D3 1 4 2
Multiplan will interpret the dimensions based on the Y
and X
field, assuming
an origin of A1
. This would be A1:C5
in the example.
Excel will use 3 1 4 2
which is B4:C5
(3 1
cell B4
and 4 2
cell E5
)
Options (O)
This record includes a number of workbook-level settings
Excel
Field interpretations in quotes do not appear to be used in Excel 2019.
Field | Interpretation |
---|---|
A# # |
XLS CalcIter / CalcDelta (enables iterative calculation) |
C |
"Completion test at current cell" |
P |
"Sheet is protected (but no password)." |
L |
Use A1-style formulae (default is R1C1 formulae) |
M |
Manual recalculation (XLS CalcMode 0) |
R |
Precision as displayed (XLS CalcPrecision 0) |
E |
"File is a macrosheet" |
Undocumented
Field | Interpretation |
---|---|
G# # |
XLS CalcIter / CalcDelta (does not enable iterative calculation) |
V# |
Date system: (0 = 1900, 1/2/3/4 = 1904) |
K# |
currently unknown (Value must be between 1 and 255) |
D |
currently unknown |
B |
currently unknown |
S |
currently unknown (found in Warcraft III files) |
Defined Name (NN)
The N
field of the NN
record is the name of the defined name.
The E
field is the expression (interpreted as R1C1 or A1-style depending on
the presence or absence of the L
field in the O
record.
NN;N_rng;ER4C3:R7C4 <-- name "_rng" reference to `$C$4:$D$7`
NN;N_arr;E{"a","b","c";;1,2,3} <-- name "_arr" excel array {"a","b","c";1,2,3}
Cell (C)
X
and Y
fields modify the global state before applying cell values.
The K
field specifies the cell value. Numbers are specified as-is. Text
should be wrapped in double quotes. Logical values are specified as TRUE/FALSE.
Dates should be specified using the date codes after applying the appropriate
number format (behavior identical to XLS):
ID;PWXL;N;E
P;PGeneral <-- format 0 is "General"
P;Pm/d/yy <-- format 1 specifies the default Date format
C;Y1;X1;K123 <-- set cell A1 value to the number 123
C;X2;K"123" <-- set cell B1 value to the string "123"
C;X3;KTRUE <-- set cell C1 value to the logical TRUE
F;Y2;P1 <-- move to cell C2, set number format to date
C;K44444 <-- set cell C2 value to the number 44444 (formatted date 9/5/21)
E
The E
field specifies a formula. If the formula is included, it must be
consistent with the worksheet expression style (A1 or R1C1) in the O
record.
Comments
The A
field of the C
record can specify plaintext comments. They are encoded
using the same text encoding in K
fields.
C;Y4;X2;AHello! <-- sets comment on cell B4 to "Hello!"
comment.slk
includes a few comments with newline encoding.
Shared Formulae
The S
field of the C
record signals that a cell is using a shared formula.
The R
and C
fields are the 1-indexed row and column indices of the cell with
the formula. The formula should be extracted from the original location and
shifted to the current cell (relative references adjusted by the offset).
C;Y1;X1;K1 <-- cell A1=1
C;Y2;K2;ER[-1]C+1 <-- cell B1=A1+1 (both column and row relative)
C;Y3;K3;S;R2;C1 <-- cell C1=B1+1 (shifting formula from B1 +1 row)
C;X2;K3;S;R2;C1 <-- cell C2=B2+1 (shifting formula from B1 +1 row +1 col)
shared_formula.slk
includes a few shared formulae.
EOF (E)
This must be the last record of the file. There are no fields.
References
The Multiplan manual (1982) includes an appendix covering the SYLK format.
sylksum.doc
(1986) with author MCK, Microsoft
was available on a Microsoft
server. Public references to its existence date back to the 20th century.
Günter Born's "The File Formats Handbook" expands upon sylksum.doc
. While the
core details are covered in official specs, the chart extension details are not
covered in the public specifications.