1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2  *
3  * Copyright 2004 Komarov Valery
4  * Copyright 2006 Christophe Leitienne
5  * Copyright 2008-2017 David Hoerl
6  * Copyright 2013 Bob Colbert
7  * Copyright 2013-2018 Evan Miller
8  *
9  * This file is part of libxls -- A multiplatform, C/C++ library for parsing
10  * Excel(TM) files.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions are met:
14  *
15  *    1. Redistributions of source code must retain the above copyright notice,
16  *    this list of conditions and the following disclaimer.
17  *
18  *    2. Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the
20  *    documentation and/or other materials provided with the distribution.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS
23  * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
26  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
29  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
31  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
32  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  *
34  */
35 
36 #ifndef XLS_STRUCT_INC
37 #define XLS_STRUCT_INC
38 
39 #include "../libxls/ole.h"
40 
41 #define XLS_RECORD_EOF          0x000A
42 #define XLS_RECORD_DEFINEDNAME  0x0018
43 #define XLS_RECORD_NOTE         0x001C
44 #define XLS_RECORD_1904         0x0022
45 #define XLS_RECORD_CONTINUE     0x003C
46 #define XLS_RECORD_WINDOW1      0x003D
47 #define XLS_RECORD_CODEPAGE     0x0042
48 #define XLS_RECORD_OBJ          0x005D
49 #define XLS_RECORD_MERGEDCELLS  0x00E5
50 #define XLS_RECORD_DEFCOLWIDTH  0x0055
51 #define XLS_RECORD_COLINFO      0x007D
52 #define XLS_RECORD_BOUNDSHEET   0x0085
53 #define XLS_RECORD_PALETTE      0x0092
54 #define XLS_RECORD_MULRK        0x00BD
55 #define XLS_RECORD_MULBLANK     0x00BE
56 #define XLS_RECORD_RSTRING      0x00D6
57 #define XLS_RECORD_DBCELL       0x00D7
58 #define XLS_RECORD_XF           0x00E0
59 #define XLS_RECORD_MSODRAWINGGROUP   0x00EB
60 #define XLS_RECORD_MSODRAWING   0x00EC
61 #define XLS_RECORD_SST          0x00FC
62 #define XLS_RECORD_LABELSST     0x00FD
63 #define XLS_RECORD_EXTSST       0x00FF
64 #define XLS_RECORD_TXO          0x01B6
65 #define XLS_RECORD_HYPERREF     0x01B8
66 #define XLS_RECORD_BLANK        0x0201
67 #define XLS_RECORD_NUMBER       0x0203
68 #define XLS_RECORD_LABEL        0x0204
69 #define XLS_RECORD_BOOLERR      0x0205
70 #define XLS_RECORD_STRING       0x0207 // only follows a formula
71 #define XLS_RECORD_ROW          0x0208
72 #define XLS_RECORD_INDEX        0x020B
73 #define XLS_RECORD_ARRAY        0x0221 // Array-entered formula
74 #define XLS_RECORD_DEFAULTROWHEIGHT    0x0225
75 #define XLS_RECORD_FONT         0x0031 // spec says 0x0231 but Excel expects 0x0031
76 #define XLS_RECORD_FONT_ALT     0x0231
77 #define XLS_RECORD_WINDOW2      0x023E
78 #define XLS_RECORD_RK           0x027E
79 #define XLS_RECORD_STYLE        0x0293
80 #define XLS_RECORD_FORMULA      0x0006
81 #define XLS_RECORD_FORMULA_ALT  0x0406 // Apple Numbers bug
82 #define XLS_RECORD_FORMAT       0x041E
83 #define XLS_RECORD_BOF          0x0809
84 
85 #define BLANK_CELL  XLS_RECORD_BLANK  // compat
86 
87 #if defined(_AIX) || defined(__sun)
88 #pragma pack(1)
89 #else
90 #pragma pack(push, 1)
91 #endif
92 
93 typedef struct BOF
94 {
95     WORD id;
96     WORD size;
97 }
98 BOF;
99 
100 typedef struct BIFF
101 {
102     WORD ver;
103     WORD type;
104     WORD id_make;
105     WORD year;
106     DWORD flags;
107     DWORD min_ver;
108 }
109 BIFF;
110 
111 typedef struct WIND1
112 {
113     WORD xWn;
114     WORD yWn;
115     WORD dxWn;
116     WORD dyWn;
117     WORD grbit;
118     WORD itabCur;
119     WORD itabFirst;
120     WORD ctabSel;
121     WORD wTabRatio;
122 }
123 WIND1;
124 
125 typedef struct BOUNDSHEET
126 {
127     DWORD	filepos;
128     BYTE	type;
129     BYTE	visible;
130     char	name[1];
131 }
132 BOUNDSHEET;
133 
134 typedef struct ROW
135 {
136     WORD	index;
137     WORD	fcell; // first cell, 0-indexed
138     WORD	lcell; // last cell, 1-indexed
139     WORD	height;
140     WORD	notused;
141     WORD	notused2; //used only for BIFF3-4
142     WORD	flags;
143     WORD	xf;
144 }
145 ROW;
146 
147 typedef struct COL
148 {
149     WORD	row;
150     WORD	col;
151     WORD	xf;
152 }
153 COL;
154 
155 
156 typedef struct FORMULA // BIFF8
157 {
158     WORD	row;
159     WORD	col;
160     WORD	xf;
161 	// next 8 bytes either a IEEE double, or encoded on a byte basis
162     BYTE	resid;
163     BYTE	resdata[5];
164     WORD	res;
165     WORD	flags;
166     BYTE	chn[4]; // BIFF8
167     WORD	len;
168     BYTE	value[1]; //var
169 }
170 FORMULA;
171 
172 typedef struct FARRAY // BIFF8
173 {
174     WORD	row1;
175     WORD	row2;
176     BYTE	col1;
177     BYTE	col2;
178     WORD	flags;
179     BYTE	chn[4]; // BIFF8
180     WORD	len;
181     BYTE	value[1]; //var
182 }
183 FARRAY;
184 
185 typedef struct RK
186 {
187     WORD	row;
188     WORD	col;
189     WORD	xf;
190     DWORD   value;
191 }
192 RK;
193 
194 typedef struct MULRK
195 {
196     WORD	row;
197     WORD	col;
198 	struct {
199 		WORD	xf;
200 		DWORD   value;
201 	}		rk[1];
202 	//WORD	last_col;
203 }
204 MULRK;
205 
206 typedef struct MULBLANK
207 {
208     WORD	row;
209     WORD	col;
210     WORD	xf[1];
211 	//WORD	last_col;
212 }
213 MULBLANK;
214 
215 typedef struct BLANK
216 {
217     WORD	row;
218     WORD	col;
219     WORD	xf;
220 }
221 BLANK;
222 
223 typedef struct LABEL
224 {
225     WORD	row;
226     WORD	col;
227     WORD	xf;
228     BYTE	value[1]; // var
229 }
230 LABEL;
231 
232 typedef struct BOOLERR
233 {
234     WORD    row;
235     WORD    col;
236     WORD    xf;
237     BYTE    value;
238     BYTE    iserror;
239 }
240 BOOLERR;
241 
242 typedef struct SST
243 {
244     DWORD	num;
245     DWORD	numofstr;
246     BYTE	strings[1];
247 }
248 SST;
249 
250 typedef struct XF5
251 {
252     WORD	font;
253     WORD	format;
254     WORD	type;
255     WORD	align;
256     WORD	color;
257     WORD	fill;
258     WORD	border;
259     WORD	linestyle;
260 }
261 XF5;
262 
263 typedef struct XF8
264 {
265     WORD	font;
266     WORD	format;
267     WORD	type;
268     BYTE	align;
269     BYTE	rotation;
270     BYTE	ident;
271     BYTE	usedattr;
272     DWORD	linestyle;
273     DWORD	linecolor;
274     WORD	groundcolor;
275 }
276 XF8;
277 
278 typedef struct BR_NUMBER
279 {
280     WORD	row;
281     WORD	col;
282     WORD	xf;
283     double value;
284 }
285 BR_NUMBER;
286 
287 typedef struct COLINFO
288 {
289     WORD	first;
290     WORD	last;
291     WORD	width;
292     WORD	xf;
293     WORD	flags;
294 /* There should be an unused WORD field at the end here. However, some files in
295  * the wild report it as a BYTE, which results in a boundary-check parse error.
296  * Since the value is ignored anyway, we'll just pretend it was never there.
297  *
298  * See issue https://github.com/evanmiller/libxls/issues/27
299  */
300 }
301 COLINFO;
302 
303 typedef struct MERGEDCELLS
304 {
305     WORD	rowf;
306     WORD	rowl;
307     WORD	colf;
308     WORD	coll;
309 }
310 MERGEDCELLS;
311 
312 typedef struct FONT
313 {
314     WORD	height;
315     WORD	flag;
316     WORD	color;
317     WORD	bold;
318     WORD	escapement;
319     BYTE	underline;
320     BYTE	family;
321     BYTE	charset;
322     BYTE	notused;
323     char    name[1];
324 }
325 FONT;
326 
327 typedef struct FORMAT
328 {
329     WORD	index;
330     char	value[1];
331 }
332 FORMAT;
333 
334 #pragma pack(pop)
335 
336 //---------------------------------------------------------
337 
338 typedef	struct st_sheet
339 {
340     DWORD count;        // Count of sheets
341     struct st_sheet_data
342     {
343         DWORD filepos;
344         BYTE visibility;
345         BYTE type;
346         char * name;
347     }
348     * sheet;
349 }
350 st_sheet;
351 
352 typedef	struct st_font
353 {
354     DWORD count;		// Count of FONT's
355     struct st_font_data
356     {
357         WORD	height;
358         WORD	flag;
359         WORD	color;
360         WORD	bold;
361         WORD	escapement;
362         BYTE	underline;
363         BYTE	family;
364         BYTE	charset;
365         char *	name;
366     }
367     * font;
368 }
369 st_font;
370 
371 typedef struct st_format
372 {
373     DWORD count;		// Count of FORMAT's
374     struct st_format_data
375     {
376          WORD index;
377          char *value;
378     }
379     * format;
380 }
381 st_format;
382 
383 typedef	struct st_xf
384 {
385     DWORD count;	// Count of XF
386     //	XF** xf;
387     struct st_xf_data
388     {
389         WORD	font;
390         WORD	format;
391         WORD	type;
392         BYTE	align;
393         BYTE	rotation;
394         BYTE	ident;
395         BYTE	usedattr;
396         DWORD	linestyle;
397         DWORD	linecolor;
398         WORD	groundcolor;
399     }
400     * xf;
401 }
402 st_xf;
403 
404 
405 typedef	struct st_sst
406 {
407     DWORD count;
408     DWORD lastid;
409     DWORD continued;
410     DWORD lastln;
411     DWORD lastrt;
412     DWORD lastsz;
413     struct str_sst_string
414     {
415         char * str;
416     }
417     * string;
418 }
419 st_sst;
420 
421 
422 typedef	struct st_cell
423 {
424     DWORD count;
425     struct st_cell_data
426     {
427         WORD	id;
428         WORD	row;
429         WORD	col;
430         WORD	xf;
431         char *	str;		// String value;
432         double	d;
433         int32_t	l;
434         WORD	width;		// Width of col
435         WORD	colspan;
436         WORD	rowspan;
437         BYTE	isHidden;	// Is cell hidden
438     }
439     * cell;
440 }
441 st_cell;
442 
443 
444 typedef	struct st_row
445 {
446     //	DWORD count;
447     WORD lastcol;	// numCols - 1
448     WORD lastrow;	// numRows - 1
449     struct st_row_data
450     {
451         WORD index;
452         WORD fcell;
453         WORD lcell;
454         WORD height;
455         WORD flags;
456         WORD xf;
457         BYTE xfflags;
458         st_cell cells;
459     }
460     * row;
461 }
462 st_row;
463 
464 
465 typedef	struct st_colinfo
466 {
467     DWORD count;				// Count of COLINFO
468     struct st_colinfo_data
469     {
470         WORD	first;
471         WORD	last;
472         WORD	width;
473         WORD	xf;
474         WORD	flags;
475     }
476     * col;
477 }
478 st_colinfo;
479 
480 typedef struct xlsWorkBook
481 {
482     //FILE*		file;
483     OLE2Stream*	olestr;
484     int32_t		filepos;		// position in file
485 
486     //From Header (BIFF)
487     BYTE		is5ver;
488     BYTE		is1904;
489     WORD		type;
490     WORD		activeSheetIdx;	// index of the active sheet
491 
492     //Other data
493     WORD		codepage;		// Charset codepage
494     char*		charset;
495     st_sheet	sheets;
496     st_sst		sst;			// SST table
497     st_xf		xfs;			// XF table
498     st_font		fonts;
499     st_format	formats;		// FORMAT table
500 
501 	char		*summary;		// ole file
502 	char		*docSummary;	// ole file
503 
504     void        *converter;
505     void        *utf16_converter;
506     void        *utf8_locale;
507 }
508 xlsWorkBook;
509 
510 typedef struct xlsWorkSheet
511 {
512     DWORD		filepos;
513     WORD		defcolwidth;
514     st_row		rows;
515     xlsWorkBook *workbook;
516     st_colinfo	colinfo;
517 }
518 xlsWorkSheet;
519 
520 #ifdef __cplusplus
521 typedef struct st_cell::st_cell_data xlsCell;
522 typedef	struct st_row::st_row_data xlsRow;
523 #else
524 typedef struct st_cell_data xlsCell;
525 typedef	struct st_row_data xlsRow;
526 #endif
527 
528 typedef struct xls_summaryInfo
529 {
530 	BYTE		*title;
531 	BYTE		*subject;
532 	BYTE		*author;
533 	BYTE		*keywords;
534 	BYTE		*comment;
535 	BYTE		*lastAuthor;
536 	BYTE		*appName;
537 	BYTE		*category;
538 	BYTE		*manager;
539 	BYTE		*company;
540 }
541 xlsSummaryInfo;
542 
543 typedef void (*xls_formula_handler)(WORD bof, WORD len, BYTE *formula);
544 
545 #endif
546