slk文件读取
更新日期:
在项目中数据配置一般用excel表格居多,excel格式又有很多,其中要数csv和slk最简单易解读。其实csv和slk也不算excel的版本格式,只是excel文件都可以保存为csv、slk格式。
csv格式最简单,就是把excel单元格的内容用分号;隔开然后存与文本中,用txt打开这种文件就很容易看到其内容与格式。它不好的地方也在于太多简单,不能存储excel里面的很多信息,例如公式、注释、批注等,当把excel保存为csv的时候这些信息就丢失了,但有时候这样信息是需要的。
slk又叫sylk(SYmbolic LinK ),符号链接文件,它能够存储excel的大部分信息,当然也有一些信息的丢失,其简单格式如下1
2
3
4
5
6
7
8ID;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
E
excel打开结果如下,1
2
3
4
5
6
7+-------+---+
| Row 1 | 11|
+-------+---+
| Row 2 | 22|
+-------+---+
| Total | 33|
+-------+---+
基本格式即,
以ID开头,以E结尾,C代表这行是单元格内容,XY是单元格坐标,x表示单元格在第几列,y表示单元格在第几行,k后面跟着单元格内容,如果是字符串就用””括起来。
在看看复杂点的格式,1
2
3
4
5
6
7
8
9
10
11
12
13ID;P
P;PGeneral
P;P_(* #,##0_);;_(* \-#,##0_);;_(* "-"_);;_(@_)
P;P_(* #,##0.00_);;_(* \(#,##0.00\);;_(* "-"??_);;_(@_)
P;P_("$"* #,##0.00_);;_("$"* \(#,##0.00\);;_("$"* "-"??_);;_(@_)
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
excel打开结果如下,1
2
3
4
5
6
7+-------+------+
| Row 1 | 11.00|
+-------+------+
| Row 2 | 22.00|
+-------+------+
| Total | 33.00|
+-------+------+
F;P2;C2 表示对第2列使用第2种格式显示,即P定义格式,F使用格式
如果你把一个excel文件保存为slk格式文件,然后用txt或者其他编辑器打开会发现它远比上面的格式复杂,但是他们共通的格式还是保持的,
第一行 ID;PWXL;N;E
最后一行 E
表示大小的行 B;Y4;X2;D0 即总共4行2列
内容行 C;X2;N;K33 第2列内容33,行数向上找最近的Y;K后面的内容以\r\n结束或者遇“”之外的;结束
根据上面的规则就可以把单元格的内容读取出来了,但是在解析字符串的时候需要注意几点
字符串内容在最大匹配的两个””之间
字符串中1b 20 3a三个连续字符表示换行,解析时需用\n替换
字符串中两个连续的;表示一个; 即;;要解析成;
格式参考https://en.wikipedia.org/wiki/SYmbolic_LinK_%28SYLK%29
C++源码https://github.com/sstask/readslk/blob/master/readslk.h