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