📄 xlcdump.c
字号:
/* xlcdump - dumps individual chart records for analysis Copyright 2002 Charles N Wyble <jackshck@yahoo.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#if !(defined( __BORLANDC__ ) || defined( __WIN32__ ))#include "config.h" /* Created by ./configure script */#include "cole.h"#else#include "config.h.in" /* Created by ./configure script */#include "cole.h.in"#include <io.h> /* for umask */#endif#include <stdio.h>#include <stdlib.h>#include <string.h> /* for strcpy() */#include <ctype.h> /* For isprint */#define MODE 0 /* 0 - ascii; 1 - hex */#define TEXT 0 /* In ascii mode, 0 - ascii, 1 - hex */#define PRGNAME "xlcdump"#define MAX_COLS 64#define MAX_ROWS 512static char FileName[2][12] = /* The section of the Excel Spreadsheet we read in */{ "/Workbook", /* Office 97 */ "/Book" /* Everything else ? */};/* Function Prototypes */COLE_LOCATE_ACTION_FUNC dump_file;static void output_opcode_string(int);/* Global data */static char filename[128];int main (int argc, char **argv){ int f_ptr = 0; COLEFS * cfs; COLERRNO colerrno; if (argc < 2) { fprintf (stderr, "dump - Outputs excel chart records for analysis.\n" "Usage: "PRGNAME" <FILE>\n"); exit (1); } else { strncpy(filename, argv[1], 124); cfs = cole_mount (filename, &colerrno); if (cfs == NULL) { cole_perror (PRGNAME, colerrno); exit (1); } } while (cole_locate_filename (cfs, FileName[f_ptr], NULL, dump_file, &colerrno)) { if (f_ptr) { cole_perror (PRGNAME, colerrno); break; } else f_ptr++; } if (cole_umount (cfs, &colerrno)) { cole_perror ("travel", colerrno); exit (1); } return 0;}void dump_file(COLEDIRENT *cde, void *_info){ unsigned int length=0, opcode=0, target=0, count = 0; unsigned char buf[16]; COLEFILE *cf; COLERRNO err; cf = cole_fopen_direntry(cde, &err); /* Ouput Header */ printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n"); printf("<HTML><HEAD><TITLE>%s", filename); printf("</TITLE></HEAD><BODY>\n"); /* Output body */#if (MODE == 1) while (cole_fread(cf, buf, 8, &err)) /* For mode >= 1 */#else while (cole_fread(cf, buf, 1, &err))#endif { if (MODE == 0) { if (count == 0) { length = 0; opcode = (unsigned)buf[0]; target = 80; /* ficticious number */ printf("<br>"); } else if (count == 1) opcode |= (buf[0]<<8)&0x0000FFFFL; else if (count == 2) length = (unsigned)buf[0]; else if (count == 3) { length |= (buf[0]<<8); target = length; printf("<br>\nLength:%04X Opcode:%04X - ", length, opcode); output_opcode_string(opcode); puts("<br>\n"); } if (count > 3) { /* Here is where we want to process the data */ /* based on the opcode... */#if (TEXT == 0) if (isprint(buf[0])) putc(buf[0], stdout); #else printf("%02X ", buf[0]); if (((count-3) % 8) == 0) printf("<br>\n");#endif } if (count == (target+3)) count = 0; else count++; } else /* mode >= 1 */ { printf("%02x %02x %02x %02x %02x %02x %02x %02x ", (unsigned)buf[0], (unsigned)buf[1], (unsigned)buf[2], (unsigned)buf[3], (unsigned)buf[4], (unsigned)buf[5], (unsigned)buf[6], (unsigned)buf[7]); putchar(buf[0]); putchar(buf[1]); putchar(buf[2]); putchar(buf[3]); putchar(buf[4]); putchar(buf[5]); putchar(buf[6]); putchar(buf[7]); printf("<br>\n"); } }/* Output Tail */ printf("</BODY></HTML>\n"); cole_fclose(cf, &err);}static void output_opcode_string(int opcode){ switch (opcode&0x00FF) { case 0x10: case 0x01: puts("UNITS: Chart Units"); break; case 0x02: puts("CHART: Location and overall chart dimensions"); break; case 0x03: puts("SERIES: Series Definition"); break; case 0x06: puts("DATAFORMAT: Series and Data Point Numbers"); break; case 0x07: puts("LINEFORMAT: Style of a line or border"); break; case 0x09: puts("MARKERFORMAT: Style of a line marker"); break; case 0x0A: puts("AREAFORMAT: Colors and patterns for an area"); break; case 0x0B: puts("PIEFORMAT: Position of the pie slice"); break; case 0x0C: puts("ATTACHEDLABEL: Series data/value labels"); break; case 0x0D: puts("SERIESTEXT: Legend/category/value text"); break; case 0x14: puts("CHARTFORMAT: Parent record for chart group"); break; case 0x15: puts("LEGEND: Legend type and position"); break; case 0x16: puts("SERIESLIST: Specifies the series in an overlay chart"); break; case 0x17: puts("BAR: Chart group is a bar or column chart group"); break; case 0x18: puts("LINE: Chart group is a line chart group"); break; case 0x19: puts("PIE: Chart group is a pie chart group"); break; case 0x1A: puts("AREA: Chart group is an area chart group"); break; case 0x1B: puts("SCATTER: Chart group is a scatter chart group"); break; case 0x1C: puts("CHARTLINE: Drop/Hi-Lo/Series Lines on a line chart"); break; case 0x1D: puts("AXIS: Axis Type"); break; case 0x1E: puts("TICK: Tick marks and labels format"); break; case 0x1F: puts("VALUERANGE: Defines value axis scale"); break; case 0x20: puts("CATSERRANGE: Defines a category or series axis"); break; case 0x21: puts("AXISLINEFORMAT: Defines a line that spans an axis"); break; case 0x22: puts("CHARTFORMTLINK: Not Used"); break; case 0x24: puts("DEFAULTTEXT: Default data label text properties"); break; case 0x25: puts("TEXT: Defines display of text fields"); break; case 0x26: puts("FONTX: Font Index"); break; case 0x27: puts("OBJECTLINK: Attaches Text to chart or chart item"); break; case 0x32: puts("FRAME: Defines border shape around displayed text"); break; case 0x33: puts("BEGIN: Defines the beginning of an object"); break; case 0x34: puts("END: Defines the end of an object"); break; case 0x35: puts("PLOTAREA: Frame belongs to ploat area"); break; case 0x3A: puts("3d Chart group"); break; case 0x3C: puts("PICF: Picture Format"); break; case 0x3D: puts("DROPBAR: Defines drop bars"); break; case 0x3E: puts("RADAR: Chart group is a radar chart group"); break; case 0x3F: puts("SURFACE: Chart group is a surface chart group"); break; case 0x40: puts("RADARAREA: Chart group is a radar area chart group"); break; case 0x41: puts("AXISPARENT: Axis size and location"); break; case 0x43: puts("LEGENDXN: Legend Exception"); break; case 0x44: puts("SHTPROPS: Sheet Properties"); break; case 0x45: puts("SERTOCRT: Series chart-group index"); break; case 0x46: puts("AXESUSED: Number of axes sets"); break; case 0x48: puts("SBASEREF: PivotTable Reference"); break; case 0x4A: puts("SERPARENT: Trendline or Errorbar series index"); break; case 0x4B: puts("SERAUXTREND: Series trendline"); break; case 0x4E: puts("IFMT: Number-Format Index"); break; case 0x4F: puts("POS: Position information"); break; case 0x50: puts("ALRUNS: Text formatting"); break; case 0x51: puts("AI: Linked data"); break; case 0x5B: puts("Series ErrorBar"); break; case 0x5D: puts("SERFMT: Series Format"); break; case 0x60: puts("FBI: Font Basis"); break; case 0x61: puts("BOPPOP: Bar of pie/pie of pie chart options"); break; case 0x62: puts("AXCEXT: Axis options"); break; case 0x63: puts("DAT: Data Table Options"); break; case 0x64: puts("PLOTGROWTH: Font scale factors"); break; case 0x65: puts("SIINDEX: Series Index"); break; case 0x66: puts("GELFRAME: Fill data"); break; case 0x67: puts("Custom bar of pie/ pie of pie chart options"); break; default: puts("Unknown Chart Opcode"); break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -