SYmbolic LinK (SYLK)
Symbolic Link is a Microsoft file format typically used to exchange data between applications, specifically spreadsheets. SYLK files conventionally have a
.slk
suffix. Composed of only displayable ANSI characters, it can be easily created and processed by other applications, such as databases.Microsoft does not publish a SYLK specification. Variants of the format are supported by Multiplan, Microsoft Excel, Microsoft Works, OpenOffice.org, and Gnumeric. The format was introduced in the 1980s and has not evolved since 1986.
A commonly encountered 'occurrence' of the SYLK file happens when a comma-separated value format is saved with an unquoted first field name of 'ID', that is the first two characters match the first two characters of the SYLK file format. Microsoft Excel will then emit misleading error messages relating to the format of the file, such as "The file you are trying to open, 'x.csv', is in a different format than specified by the file extension...".
SYLK is known to cause security issues, as it allows an attacker to run arbitrary code, offers the opportunity to disguise the attack vector under the benign-looking appearance of a CSV file, and is still enabled by default on recent versions of Microsoft Excel.
Limitations
SYLK does not have support for Unicode. Even if a SYLK file is created by an application that supports Unicode, the SYLK file will be encoded in the current system's ANSI code page, not in Unicode. If the application contained characters that were displayable in Unicode but have no code point in the current system's code page, they will be converted to question marks in the SYLK file.The semicolon is treated as a field separator in SYLK, so cannot be used unescaped in data values. If a character string in the SYLK file is to contain a semicolon then it should be prefixed with another semicolon so the string would appear as e.g., "WIDGET;;AXC1254". MS Excel will strip the first semicolon on import and the data element will appear as "WIDGET;AXC1254".
Each line of a SYLK input file must be no longer than 260 characters. Otherwise, Microsoft Excel will issue an error message and skip loading the overlong line.
Sample SYLK code
As an example, the following SYLK code in a text file with the.slk extension:ID;P
C;Y1;X1;K"Row 1"
C;Y2;X1;K"Row 2"
C;Y3;X1;K"Total"
C;Y1;X2;K11
C;Y2;X2;K22
C;Y3;X2;K33
E
would be displayed like this when read by an appropriate spreadsheet:
for numeric formatting
The formatting of 2 decimal digits is applied to Column 2 usingF;P2;C2
where P0 is for General, P1 is for no decimal, P2 is for 2 digits, P3 has leading $ sign with 2 decimal points as defined below.
ID;P
P;PGeneral
P;P_;;_;;_;;_
P;P_;;_;;_;;_
P;P_;;_;;_;;_
C;Y1;X1;K"Row 1"
C;Y2;X1;K"Row 2"
C;Y3;X1;K"Total"
C;Y1;X2;K11
C;Y2;X2;K22
C;Y3;X2;K0;ER1C2+R2C2
F;P2;C2
E
would be displayed like this when read by an appropriate spreadsheet:
for column width
defines the widths of a group of columns:; : one space
;< n1 > : the first column
;< n2 > : the last column
;< n3 > : the width of columns in number of characters
For example: Adding these SYLK codes will adjust the column width of column 1 and 2 to 20 and 30 respectively.
F;W1 1 20
F;W2 2 30
cell formatting properties
F; < cl > < n > < c2 >; < cl > : one of the following 1-character formatting codes:
;< n > : the number of digits.
;< c2 > : one of the following 1-character alignment codes:
For example: The following SYLK code demonstrates the cell formatting properties:
ID;P
P;PGeneral
C;Y1;X1;K"Row 1 Left Justify"
F;P0;FG0L
C;Y2;X1;K"Row 2 Right Justify"
F;P0;FG0R
C;Y3;X1;K"Total at Center"
F;P0;FG0C
C;Y1;X2;K11
C;Y2;X2;K22
C;Y3;X2;K0;ER1C2+R2C2
F;Y1;X2;FF2L
F;Y2;X2;FF2R
F;Y3;X2;F$2C
F;W1 2 25
E
SYLK syntax
SYLK_file ::=
Record +
Record ::=
RecordType Field* newline
- ID record
- * Use:
- *: A header to identify spreadsheet type and creator.
- *: Must be first record in the file.
- * Record type:
- *: ID
- * Mandatory fields:
- *:; P program
- *::: file creator
- *:::* possible creators include:
- *:::** MP
- *:::** XL
- * Possible fields:
- *:; N
- *:: If present, file uses ;N style cell protection
- *:: If absent, file uses ;P style cell protection
- *:; E
- *:: If present, NE records are redundant
- *:: If absent, NE records are not redundant
- B record
- * Use:
- *: Tells number of rows and columns in the spreadsheet.
- *: Recommended that it come before C and F records
- * Record type:
- *: B
- * Mandatory fields:
- *:; X columns
- *:: tells maximum number of columns
- *:; Y rows
- *:: tells maximum number of rows
- C record
- * Use:
- *: Cell contents
- * Record type:
- *: C
- * Mandatory fields:
- *:; X column
- *:: column position
- * Possible fields:
- *:; Y row
- *:: row position. If omitted, most recently encountered value is used.
- *:; E expression
- *:: expression for the cell
- *:; K value
- *:: value of the cell
- *:; C column
- *:: column reference
- *:; R row
- *:: row reference
- *:; G
- *:: defines shared value
- *:; D
- *:: defines shared expression
- *:; S
- *:: references shared value or shared expression
- *:; N
- *:: If present, the cell is not protected.
- *:: If absent and ;N is present in the ID record, cell is protected.
- *:; P
- *:: If present, cell is protected.
- *:: If absent and ;N is absent in the ID record, cell is not protected.
- *:; H
- *:: If present, cell is hidden.
- *:: If absent, cell is not hidden.
- *:; M expression
- *:: matrix expression from to
- *:; I
- *:: inside a matrix
- * Compatible fields:
- *: If ;G is present, ;E must be absent.
- *: If ;G is present, ;K must be present.
- *: If ;D is present, ;E must be present.
- *: If ;S is present, ;E, ;K, ;G, ;D, and ;M must be absent.
- *: If ;S is present, ;R and ;C must be present.
- *: If ;N is present in the ID record, ;P must be absent.
- *: If ;N is absent from the ID record, ;N must be absent.
- *: If ;M is present, ;E must be absent.
- *: If ;I is present, ;K and ;E must be absent
- P record
- * Use:
- *: Cell format
- *: If F records are present, precedes them.
- * Mandatory fields:
- *:; P formatting
- *:: Excel style cell format specification
- F record
- * Use:
- *: Format
- *: If P record are present, follows them.
- * Possible fields:
- *:; X column
- *:: column
- *:; Y row
- *:: row
- *:; C column
- *:: column
- *:; R row
- *:: row
- *:; F format
- *:: Cell/row/column format
- *:: The format of format is
- *:: ch1 digits ch2
- *:: ch1 is
- *:::;D:default
- *:::;C:currency
- *:::;E:exponent
- *:::;F:fixed
- *:::;G:general
- *:::;$:dollar
- *:::;
* :graph - *:::;%:percent
- *:: digits is number of digits after decimal point
- *:: ch2 is alignment
- *:::;D:default
- *:::;C:center
- *:::;G:standard
- *:::;L:left
- *:::;R:right
- *:::;-:ignored
- *:::;X:fill
- *:; D format
- *:: Default format.
- *:: The format of format is
- *:: ch1 digits ch2
- *:: ch1 is
- *:::;C:currency
- *:::;E:exponent
- *:::;F:fixed
- *:::;G:general
- *:::;$:dollar
- *:::;
* :graph - *:::;%:percent
- *:: digits is number of digits after decimal point
- *:: ch2 is alignment
- *:::;C:center
- *:::;G:standard
- *:::;L:left
- *:::;R:right
- *:::;-:ignored
- *:::;X:fill
- *:; E
- *:: show formulas
- *:; K
- *:: show commas
- *:; W col1 col2 width
- *:: set column widths
- *:; N fontid size
- *:: font to use
- *:; P index
- *:: Excel cell format, number of the P record
- *: If ;X is present, ;R, ;C, ;E, ;K, ;W, ;N, ;H, ;G must be absent.
- *: If ;R is present, ;X, ;Y, ;C, ;E, ;K, ;W, ;N, ;H, ;G must be absent.
- *: If ;C is present, ;X, ;Y, ;R, ;E, ;K, ;W, ;N, ;H, ;G must be absent.
- *: If ;D is present, ;X, ;Y, ;R, ;C must be absent.
- *: If ;X, ;Y, ;R, ;C are present, ;P and/or ;F and/or ;S must be present.
- O record
- * Use:
- *: Options
- * Possible fields:
- *:; A iter delta
- *:: If present, allow value iteration
- *:: If absent, circular references are not allowed.
- *:: iter
- *:: delta
- *:; C
- *:: completion test at nearest preceding C record
- *:; P
- *:: sheet is protected
- *:; L
- *:: use A1 mode references
- *:: Even if ;L is given R1C1 references are used in SYLK file expressions.
- *:; M
- *:: If present, use manual recalculation.
- *:: If absent, use automatic recalculation.
- *:; E
- *:: Macro sheet.
- *:: This should appear before the first appearance of a ;G or ;F field in a NN record.
- *:: This should appear before the first C record which uses a macro-only function.
- *:; V value
- *:: value indicates the base date used for calculating serial date values
- *:::0:1 January 1900
- *:::4:1 January 1904
- NU record
- * Use:
- *: file name substitution
- *: If NE record are present, must precede them.
- * Mandatory fields:
- *:; L filename
- *:: old filename
- *:; F filename
- *:: new filename
- NE record
- * Use:
- *: external link
- * Mandatory fields:
- *:; E expression
- *:: Target area on spreadsheet
- *:; F filename
- *:: Source file
- *:; S expression
- *:: Source area on external sheet
- NN record
- * Use:
- *: Defines names
- *: More efficient if NN appears before name use.
- * Mandatory fields:
- *:; N name
- *:: name
- *:; E expression
- *:: expression describing value of name
- * Possible fields:
- *:; G ch1 ch2
- *:: runable name with command key alias
- *:; K ch1 ch2
- *:: ordinary name with unused command aliases
- *:; F
- *:: usable as a function
- * Compatible fields:
- *: If ;G is present, ;K must be absent.
- W record
- * Use:
- *: Window definitions
- NL record
- * Use:
- *: Chart external link
- E record
- * Use:
- *: End of file.
- *: Must be last record.
.slk file exports opened with Excel have a limit of 255 characters in a cell. This limit is not present in LibreOffice.