⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xlhtml.c~

📁 excel to html
💻 C~
📖 第 1 页 / 共 5 页
字号:
			break;		case 0x01:	/* Blank */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				U16 r, c, f;				r = getShort(&working_buffer[0]);				c = getShort(&working_buffer[2]);				if (version == 2)					f = getShort(&working_buffer[4]);				else					f = 0;				add_wb_array(r, c, f, opcode, (U16)0, (U8 *)0, 0, (U16)0, 0);			}			break;		case 0x02:	/* Integer */			working_buffer[bufidx++] = data;					if (bufidx == last)			{				U16 r, c, i, f;				char temp[32];				r = getShort(&working_buffer[0]);				c = getShort(&working_buffer[2]);				if (version == 2)				{					f = getShort(&working_buffer[4]);					i = getShort(&working_buffer[7]);					sprintf(temp, "%d", i);				}				else				{					f = 0;					Unsupported++;					strcpy(temp, OutputXML ? "<Unsupported/>INT" : "****INT");				}				add_wb_array(r, c, f, opcode, (U16)0, (U8 *)temp, (U16)strlen(temp), 0, NULL);			}					break;		case 0x03:	/* Number - Float */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				U16 r, c, f;				F64 d;				char temp[64];				r = getShort(&working_buffer[0]);				c = getShort(&working_buffer[2]);				if (version == 2)				{					f = getShort(&working_buffer[4]);					getDouble(&working_buffer[6], &d);					sprintf(temp, "%.15g", d);				}				else				{	/* Who knows what the future looks like */					f = 0;					Unsupported = 1;					sprintf(temp, "****FPv:%d", version);				}				add_wb_array(r, c, f, opcode, (U16)0, (U8 *)temp, (U16)strlen(temp), 0, 0);			}			break;		case 0xD6:	/* RString */			working_buffer[bufidx++] = data;					if ((bufidx == 7)&&(buflast == 0))				buflast = working_buffer[7];			if (buflast)			{				if (bufidx == buflast)				{					U16 r, c, l, f;					r = getShort(&working_buffer[0]);					c = getShort(&working_buffer[2]);					f = getShort(&working_buffer[4]);					l = getShort(&working_buffer[6]);					working_buffer[8+l] = 0;					add_wb_array(r, c, f, opcode, (U16)0, &working_buffer[8],							(U16)strlen((char *)&working_buffer[8]), 0, 0);				}			}			break;		case 0x04:	/* Label - UNI */			working_buffer[bufidx++] = data;			if (file_version == EXCEL95)			{				if (bufidx == last)				{					U16 r, c, f;					r = getShort(&working_buffer[0]);					c = getShort(&working_buffer[2]);					f = getShort(&working_buffer[4]);					working_buffer[bufidx] = 0;					add_wb_array(r, c, f, opcode, (U16)0, &working_buffer[8],							(U16)strlen((char *)&working_buffer[8]), 0, 0);				}			}			else if (file_version == EXCEL97)			{    /* Remember, bufidx is 1 more than it should be */				if ((bufidx == 8)&&(buflast == 0))				{	/* buflast = working_buffer[7]; */					cch = getShort(&working_buffer[6]);					buflast = cch + 9;				}				if (bufidx == 9)				{					if (working_buffer[8] == 1)						buflast = (cch << 1) + 9;				}				if (buflast)				{					if (bufidx == buflast)					{						U16 r, c, f;						U16 len;						r = getShort(&working_buffer[0]);						c = getShort(&working_buffer[2]);						if (version == 2)							f = getShort(&working_buffer[4]);						else	/* Unknown version */							f = 0;						working_buffer[bufidx] = 0;						len = (U16)strlen((char *)&working_buffer[8]);						if (working_buffer[8] == 1)						{							UnicodeStrings = 2;							add_wb_array(r, c, f, opcode, (U16)2, &working_buffer[9], (U16)(cch << 1), 0, 0);						}						else							add_wb_array(r, c, f, opcode, (U16)0, &working_buffer[8], len, 0, 0);					}				}			}			break;		case 0x05:	/* Boolerr */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				U16 r, c, f;				char temp[16];				r = getShort(&working_buffer[0]);				c = getShort(&working_buffer[2]);				if (version == 2)				{					f = getShort(&working_buffer[4]);					decodeBoolErr(working_buffer[6], working_buffer[7], temp);					add_wb_array(r, c, f, opcode, (U16)0, (U8 *)temp, (U16)strlen(temp), 0, 0);				}				else				{					f = 0;					Unsupported = 1;					strcpy(temp, "****Bool");					add_wb_array(r, c, f, opcode, (U16)0, (U8 *)temp, (U16)strlen(temp), 0, 0);				}			}			break;			/************			*	This function has 2 entry points. 1 is the mainline FC opcode.			*	In this event there are several bytes that setup the type of			*	strings that will follow. Then there is the continue entry			*	point which is immediate - e.g location 0.			*************/		case 0xFC:	/* Packed String Array A.K.A. SST Shared String Table...UNI */			if ((count > 7)||(cont_opcode == 1)) /* Skip the 1st 8 locations they are bs */			{/*				if ((count == 0)&&(data == 0)&&(buflast))	*/				if ((count == 0)&&(cont_opcode == 1)&&(buflast))				{/*					printf("Adjusting...\n"); *//*					printf("I:%04X BL:%04X\n", bufidx, buflast); */					cont_str_array = 1;					cont_grbit = data;					return;				}				working_buffer[bufidx] = data;				bufidx++;				if((cont_str_array)&&(grbit & 0x01)&& !(cont_grbit & 0x01))				{	/* ASCII -> unicode */					working_buffer[bufidx] = 0;					bufidx++;				}				if (buflast == 0)	/* Header processor */				{					if (bufidx == 0x03)  /* After 3 locations we have length */					{				    /* and type of chars... */						cch = getShort(&working_buffer[0]);						grbit = working_buffer[2];						if (grbit < 0x04)	/* Normal run */						{							nonascii = 0;							bufidx = 0;							crun = 0;							extrst = 0;							buflast = cch << (grbit & 0x01);							/* special case for empty strings */							if (!cch && !buflast)								add_str_array(0, (U8 *)0, 0, 0, 0);							else								memset(working_buffer, 0, WBUFF_SIZE);						}					}					else if (bufidx == 0x05)					{						if ((grbit & 0x0C) == 0x08)	/* Rich string only */						{							nonascii = 0;							bufidx = 0;							crun = getShort(&working_buffer[3]);							extrst = 0;							buflast = (cch << (grbit & 0x01)) + (crun*4);/*							printf("rtbuflast:%X cch%X grbit:%X extrst:%X crun:%X last:%X\n",										buflast, cch, grbit, extrst, crun, last);							printf("%02X %02X %02X %02X %02X %02X\n",							working_buffer[0], working_buffer[1], working_buffer[2],							working_buffer[3], working_buffer[4], working_buffer[5]); */							memset(working_buffer, 0, WBUFF_SIZE);						}					}					else if (bufidx == 0x07)					{						if ((grbit & 0x0C) == 0x04)	/* Extended string only */						{							nonascii = 0;							bufidx = 0;							crun = 0;							extrst = getLong(&working_buffer[3]);							buflast = (cch << (grbit & 0x01)) + extrst;/*							printf("esbuflast:%X cch%X grbit:%X extrst:%X last:%X\n",										buflast, cch, grbit, extrst, last);							printf("%02X %02X %02X %02X %02X %02X\n",							working_buffer[0], working_buffer[1], working_buffer[2],							working_buffer[3], working_buffer[4], working_buffer[5]); */							memset(working_buffer, 0, WBUFF_SIZE);						}					}					else if (bufidx == 0x09)					{						if ((grbit & 0x0C) == 0x0C)						{							/* Rich String + Extended String **/							nonascii = 0;							bufidx = 0;							crun = getShort(&working_buffer[3]);							extrst = getLong(&working_buffer[5]);							buflast = (cch << (grbit & 0x01)) + extrst + (crun*4);/*							printf("xrtbuflast:%X cch%X grbit:%X extrst:%X crun:%X last:%X\n",										buflast, cch, grbit, extrst, crun, last);							printf("%02X %02X %02X %02X %02X %02X\n",							working_buffer[0], working_buffer[1], working_buffer[2],							working_buffer[3], working_buffer[4], working_buffer[5]); */							memset(working_buffer, 0, WBUFF_SIZE);						}					}/*					printf("*%02X ", data); */				}				else	/* payload processor */				{/*					if (cont_opcode == 1)						printf(" %02X", data); */					if (data > 127)						nonascii = 1;					if (bufidx == buflast)					{						U8 uni;						U16 len = (U16)(cch << (grbit & 0x01));/*						int i;	*/						if (grbit & 01)						{							uni = 2;							UnicodeStrings = 2;						}						else							uni = nonascii;						working_buffer[bufidx] = 0;/*  						fprintf(stderr,":buflast-"); *//*                                                  { int i; *//*  						for (i=0; i<buflast; i++) *//*                                                    putchar(working_buffer[i]); *//*  						fprintf(stderr,"\nNext String:%d\n", next_string); *//*                                                  } */						if (crun)							add_str_array(uni, working_buffer, len, working_buffer+len, crun);						else							add_str_array(uni, working_buffer, len, 0, 0);						if (uni > UnicodeStrings)	/* Try to "upgrade" charset */							UnicodeStrings = uni;						bufidx = 0;						buflast = 0;						cch = 0;						cont_str_array = 0;						memset(working_buffer, 0, WBUFF_SIZE);					}				}			}			break;		case 0xFD:	/* String Array Index A.K.A. LABELSST */			working_buffer[count] = data;			if (count == (last - 1))			{				U32 i;				U16 r, c, f;				/* This is byte reversed... */				r = getShort(&working_buffer[0]);				c = getShort(&working_buffer[2]);				f = getShort(&working_buffer[4]);				i = getLong(&working_buffer[6]);				if (i < next_string)				{/*					printf("String used:%d\n", (int)i); */					if (str_array[i])					{						if (str_array[i]->str)							add_wb_array(								r, c, f, opcode,								str_array[i]->uni, str_array[i]->str,								str_array[i]->len, str_array[i]->crun_cnt, str_array[i]->fmt_run);					}					else	/* Error, so just set it empty */						add_wb_array( r, c, f, opcode,								(U16)0, (U8 *)"String Table Error", 18, 0, 0);				}				else					MaxStringsExceeded = 1;			}			break;		case 0x31:	/* Font */			working_buffer[bufidx++] = data;			if (bufidx > 14) /* Address 14 has length in unicode chars */			{				if ((file_version == EXCEL95)&&(bufidx == last))				{	/* Microsoft doesn't stick to their documentation. Excel 97 is supposed					   to be 0x0231...but its not. Have to use file_version to separate them. */					unsigned int i;					U16 size, attr, c_idx, b, su;					U8 u;					size = getShort(&working_buffer[0]);					attr = getShort(&working_buffer[2]);					c_idx = getShort(&working_buffer[4]);					b = getShort(&working_buffer[6]);					su = getShort(&working_buffer[8]);					u = working_buffer[10];					buflast = working_buffer[14];					for (i=0; i<buflast; i++)						working_buffer[i] = working_buffer[i+15];					working_buffer[buflast] = 0;/*					printf("S:%04X A:%04X C:%04X B:%04X SU:%04X U:%02X\n",							size, attr,c_idx,b,su,u);					printf("f:%s\n", working_buffer); */					add_font(size, attr, c_idx, b, su, u, 0, &working_buffer[0], 0);				}				else if ((file_version == EXCEL97)&&(bufidx == last))				{	/* Microsoft doesn't stick to their documentation. Excel 97 is supposed					   to be 0x0231...but its not. Have to use file_version to separate them. */					unsigned int i;					U16 len;					U16 size, attr, c_idx, b, su;					U8 u, uni=0;					size = getShort(&working_buffer[0]);					attr = getShort(&working_buffer[2]);					c_idx = getShort(&working_buffer[4]);					b = getShort(&working_buffer[6]);					su = getShort(&working_buffer[8]);					u = working_buffer[10];					buflast = working_buffer[14];					for (i=0; i<(buflast-2); i++)					{	/* This looks at the 2nd byte to see if its unicode... */						if (working_buffer[(i<<1)+17] != 0)							uni = 2;					}					if (uni == 2)						len = (U16)(buflast<<1);					else						len = (U16)buflast;					if (uni == 0)					{							for (i=0; i<len; i++)						{							working_buffer[i] = working_buffer[(i<<1)+16];							if ((working_buffer[i] > 0x0080U) && (uni == 0))								uni = 1;						}					}					else					{						for (i=0; i<len; i++)							working_buffer[i] = working_buffer[i+16];					}					working_buffer[len] = 0;/*					printf("S:%04X A:%04X C:%04X B:%04X SU:%04X U:%02X\n",							size, attr,c_idx,b,su,u);					printf("BL:%d L:%d Uni:%d\n", buflast, len, uni);					printf("%X %X %X %X\n", working_buffer[15], working_buffer[16], working_buffer[17], working_buffer[18]);					printf("f:%s\n", working_buffer); */					add_font(size, attr, c_idx, b, su, u, uni, &working_buffer[0], len);				}			}			break;		case 0x14:	/* Header */			break;		case 0x15:	/* Footer */			break;		case 0x06:	/* Formula */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				U16 r, c, f;				U8 calc_val[64];				r = getShort(&working_buffer[0]);				c = getShort(&working_buffer[2]);				f = getShort(&working_buffer[4]);				if ((working_buffer[12] == 0xFF)&&(working_buffer[13] == 0xFF))				{	/* Formula evaluates to Bool, Err, or String */					if (working_buffer[6] == 1)				/* Boolean */					{						decodeBoolErr(working_buffer[8], 0, (char *)calc_val);						opcode = 0x0105;					}					else if (working_buffer[6] == 2)			/* Err */					{						decodeBoolErr(working_buffer[8], 1, (char *)calc_val);						opcode = 0x0105;					}					else					{							/* String UNI */						str_formula_row = r;						str_formula_col = c;						str_formula_format = f;						break;					}				}				else				{	/* Otherwise...this is a number */					F64 n;					getDouble(&working_buffer[6], &n);					sprintf((char *)calc_val, "%.15g", n);					opcode = 0x0103;	/* To fix up OutputCellFormatted... */				}				add_wb_array(r, c, f, opcode, (U16)0, calc_val, (U16)strlen((char *)calc_val), 0, 0);			}			break;		case 0x07:	/* String Formula Results */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				U8 *str;				U8 uni = 0;				U16 len = getShort(&working_buffer[0]);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -