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

📄 xlhtml.c~

📁 excel to html
💻 C~
📖 第 1 页 / 共 5 页
字号:
				if (len > (last-3))					len = (U16)(last-3);				if (file_version == EXCEL97)				{					/* Check for unicode. Terminate the buffer at 2x len						since unicode is 2bytes per char. Then see if						strlen is short...upperbyte is usually 0 in						western chararcter sets. */					int t = len << 1;					if ((t+3) < WBUFF_SIZE)						working_buffer[t+3] = 0;					else						working_buffer[len+3] = 0;					if ((len+3) < last)					{						uni = 2;						len = (U16)t;					}					str = &working_buffer[3];				}				else if (file_version == EXCEL95)				{					str = &working_buffer[2];					working_buffer[len+2] = 0;				}				else				{					if (OutputXML)						str = (U8*)"<NotImplemented/>String Formula";					else						str = (U8*)"***String Formula";					len = (U16)strlen((char*)str);					NotImplemented++;				}				add_wb_array(str_formula_row, str_formula_col, str_formula_format, opcode, uni, str, len, 0, 0);			}			break;		case 0x5C:	/* Author's name A.K.A. WRITEACCESS */			working_buffer[bufidx++] = data;			if ((bufidx == last)&&(author.str == 0))			{				if (file_version == EXCEL97)				{					author.len = getShort(&working_buffer[0]);					if ((int)working_buffer[2] & 0x01)					{						author.len *= (U16)2;						author.uni = 2;					}					else						author.uni = 0;					if (author.len > (last-2))						author.len = (U16)(last-2);					author.str = (U8 *)malloc(author.len+1);					if (author.str)					{						memcpy(author.str, &working_buffer[3], author.len);						author.str[author.len] = 0;					}				}				else if (file_version == EXCEL95)				{					author.len = working_buffer[0];					author.str = (U8 *)malloc(author.len+1);					if (author.str)					{						memcpy(author.str, &working_buffer[1], author.len);						author.str[author.len] = 0;					}					author.uni = 0;				}			}			break;		case 0x08:	/* Row Data */			/* There's actually some other interesting things			   here that we're not collecting. For now, we'll			   Just get the dimensions of the sheet. */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				/* question...what is the actual limit?					This can go as high as 64K. Is this really OK? */				U16 i, r, fc, lc, d, xf;				r = getShort(&working_buffer[0]);				fc = getShort(&working_buffer[2]);				lc = (U16)(getShort(&working_buffer[4]) - (U16)1);				d = getShort(&working_buffer[12]);				xf = getShort(&working_buffer[14]);				if (ws_array[sheet_count] == 0)					if (ws_init(sheet_count))						return;				if (r > ws_array[sheet_count]->biggest_row)				{					if (r < ws_array[sheet_count]->max_rows)						ws_array[sheet_count]->biggest_row = r;					else					{	/* Resize the array... */						if (MaxRowExceeded == 0)						{							int diff = (r/ROWS_INCR) + 1;							if(resize_c_array(ws_array[sheet_count], ROWS_INCR*diff, 0))							{								ws_array[sheet_count]->biggest_row = ws_array[sheet_count]->max_rows - 1;								MaxRowExceeded = 1;								return;							}							else								ws_array[sheet_count]->biggest_row = r;						}						else							return;					}				}				if (lc > ws_array[sheet_count]->biggest_col)				{					if (lc < ws_array[sheet_count]->max_cols)						ws_array[sheet_count]->biggest_col = lc;					else					{	/* Resize array... */						if (MaxColExceeded == 0)						{							int diff = (lc/COLS_INCR) + 1;							if (resize_c_array(ws_array[sheet_count], 0, (U16)(COLS_INCR*diff)))							{								ws_array[sheet_count]->biggest_col = (S16)(ws_array[sheet_count]->max_cols - 1);								MaxColExceeded = 1;								lc = ws_array[sheet_count]->max_cols;							}							else								ws_array[sheet_count]->biggest_col = lc;						}						else							lc = ws_array[sheet_count]->max_cols;					}				}				if ((fc < ws_array[sheet_count]->max_cols)&&(d & 0x0080))	/* fGhostDirty flag */				{					for (i=fc; i<lc; i++)					{	/* Set the default attr... */						update_cell_xf(r, i, xf);					}				}			}			break;		case 0x22:	/* 1904 Flag - MacIntosh Dates or PC Dates */			working_buffer[bufidx++] = data;			if (bufidx == 2)				DatesR1904 = getShort(&working_buffer[0]);			break;		case 0x085:	/* BoundSheet */			working_buffer[bufidx++] = data;			if (bufidx == last)			{	/* This is based on Office 97 info... */				if ((working_buffer[4] & 0x0F) == 0)				{	/* Worksheet as opposed to chart, etc */					U16 len;					U8 uni=0;					if (file_version == EXCEL97)					{						len = (U16)working_buffer[6];		/* FIXME: Check this !!! Was GetShort */						if (working_buffer[7] & 0x01)						{							uni = 2;							len = (U16)(len<<1);						}						if (len != 0)						{							working_buffer[8 + len + 1] = 0;							add_ws_title(uni, &working_buffer[8], len);						}					}					else					{						len = working_buffer[6];						if (len != 0)						{							working_buffer[7 + len + 1] = 0;							add_ws_title(uni, &working_buffer[7], len);						}					}				}			}			break;		case 0x7E:	/* RK Number */			working_buffer[bufidx++] = data;			if (bufidx == last)			{	/* This is based on Office 97 info... */				U16 r, c, f;				U32 t;				S32 n, n2;		/* Must be signed long !!! */				F64 d;				char temp[64];				r = getShort(&working_buffer[0]);				c = getShort(&working_buffer[2]);				f = getShort(&working_buffer[4]);				n = getLong(&working_buffer[6]);				t = n & 0x03;				n2 = n>>2;				switch (t)				{					case 0:						RKtoDouble(n2, &d);						sprintf(temp, "%.15g", d);						break;					case 1:						RKtoDouble(n2, &d);						sprintf(temp, "%.15g", d / 100.0);						break;					case 2:						sprintf(temp, "%ld", (S32)n2);						break;					default:						d = (F64) n2;						sprintf(temp, "%.15g", d / 100.0 );						break;				}				add_wb_array(r, c, f, opcode, (U16)0, (U8 *)temp, (U16)strlen(temp), 0, 0);			}			break;		case 0xBC:		/* Shared Formula's *//*			working_buffer[bufidx++] = data;			if (bufidx == last)			{				int fr, lr, fc, lc, i, j;				fr = getShort(&working_buffer[0]);				lr = getShort(&working_buffer[2]);				fc = working_buffer[4];				lc = working_buffer[5];				for (i=fr; i<=lr; i++)				{					for (j=fc; j<=lc; j++)						add_wb_array(i, j, (U16)0, opcode, 0, "***SHRFORMULA", 13);				}				NotImplemented = 1;			}	*/			break;		case 0x21:		/* Arrays */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				U16 fr, lr, fc, lc, i, j;				fr = getShort(&working_buffer[0]);				lr = getShort(&working_buffer[2]);				fc = working_buffer[4];				lc = working_buffer[5];				for (i=fr; i<=lr; i++)				{					for (j=fc; j<=lc; j++)						add_wb_array(i, j, (U16)0, opcode, 0, (U8 *)"***Array", 8, 0, 0);				}				NotImplemented = 1;			}			break;		case 0xBD:		/* MULRK */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				U16 r, fc, lc;				int i;				r = getShort(&working_buffer[0]);				fc = getShort(&working_buffer[2]);				lc = getShort(&working_buffer[last-2]);				for (i=0; i<=(lc-fc); i++)				{					U32 t;					S32 n2, n;		/* Must be signed long !!! */					U16 f;					F64 d;					char temp[64];					f = getShort(&working_buffer[4+(i*6)]);					n = getLong(&working_buffer[6+(i*6)]);					t = n & 0x03;					n2 = n>>2;					switch (t)					{						case 0:							RKtoDouble(n2, &d);							sprintf(temp, "%.15g", d);							break;						case 1:							RKtoDouble(n2, &d);							sprintf(temp, "%.15g", d / 100.0);							break;						case 2:							sprintf(temp, " %ld", (S32)n2);							break;						default:							d = (F64) n2;							sprintf(temp, "%.15g",  d / 100.0 );							break;					}/*					printf("%08X %02X %s  %d  %d\n", n2, t, temp, r, fc+i); */					add_wb_array(r, fc+i, f, opcode, (U16)0, (U8 *)temp, (U16)strlen(temp), 0, 0);				}			}			break;		case 0xBE:		/* MULBLANK */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				U16 r, fc, lc, j, f;				r = getShort(&working_buffer[0]);				fc = getShort(&working_buffer[2]);				lc = getShort(&working_buffer[last-2]);				for (j=0; j<=(lc-fc); j++)				{	/* This just stores format strings... */					f = getShort(&working_buffer[4+(j*2)]);					add_wb_array(r, fc+j, f, opcode, (U16)0, (U8 *)0, (U16)0, 0, 0);				}			}			break;		case 0x18:		/* Name UNI */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				char *ptr;				working_buffer[bufidx] = 0;				ptr = (char *)strstr((char *)&working_buffer[15], "LastUpdate");				if (ptr)				{					ptr += 13;					lastUpdated = (char *)malloc(strlen(ptr)+1);					if (lastUpdated)						strcpy(lastUpdated, ptr);				}				else				{					ptr = (char *)strstr((char *)&working_buffer[15], "Title");					if (ptr)					{						ptr += 8;						title = (char *)malloc(strlen(ptr)+1);						if (title)							strcpy(title, ptr);					}				}			}			break;		case 0xE0:		/* Extended format */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				U16 fnt_idx;				U16 fmt_idx;				U16 gen;				U16 align;				U16 indent;				U16 b_style;				U16 b_l_color;				U32  b_t_color;				U16 cell_color;				fnt_idx = getShort(&working_buffer[0]);				fmt_idx = getShort(&working_buffer[2]);				gen = getShort(&working_buffer[4]);				align  = getShort(&working_buffer[6]);				indent  = getShort(&working_buffer[8]);				b_style  = getShort(&working_buffer[10]);				if (file_version == EXCEL95)				{					b_l_color  = 0;					b_t_color = 0;					cell_color  = (U16)(getShort(&working_buffer[12]) & (U16)0x1FFF);				}				else	/* Excel 97 + */				{					b_l_color  = getShort(&working_buffer[12]);					b_t_color = getLong(&working_buffer[14]);					cell_color  = getShort(&working_buffer[18]);				}				/* printf("XF:%02X FG:%02X BG:%02X\n", next_xf, cell_color&0x007F, (cell_color&0x1F80)>>7); */				/* printf("XF:%02X M:%02X b_t:%04X<br>\n", next_xf, indent, b_t_color); */				add_xf_array(fnt_idx, fmt_idx, gen, align, indent, b_style,					b_l_color, b_t_color, cell_color);			}			break;		case 0xE5:		/* CELL MERGE INSTRUCTIONS */			working_buffer[bufidx++] = data;			if (bufidx == last)			{				U16 num, fr, lr, fc, lc, i, j, k;				ws_array[sheet_count]->spanned = 1;				num = getShort(&working_buffer[0]);				if (ws_array[sheet_count]->c_array == 0)					return;				for (i=0; i<num; i++)				{					cell *c;					fr = getShort(&working_buffer[2+(i*8)]);					lr = getShort(&working_buffer[4+(i*8)]);					fc = getShort(&working_buffer[6+(i*8)]);					lc = getShort(&working_buffer[8+(i*8)]);					if (sheet_count < (int)max_worksheets)					{						if (ws_array[sheet_count] == 0)						{							if (ws_init(sheet_count))								return;						}						if (ws_array[sheet_count]->c_array)						{							if ((fr > lr)||(fr > ws_array[sheet_count]->biggest_row)||(lr > ws_array[sheet_count]->biggest_row))								lr = (U16)ws_array[sheet_count]->biggest_row;							if ((fc > lc)||(fc > ws_array[sheet_count]->biggest_col)||(lc > ws_array[sheet_count]->biggest_col))								lc = ws_array[sheet_count]->biggest_col;							for(j=fr; j<=lr; j++)							{	/* For each row */								for(k=fc; k<=lc; k++)								{	/* for each column */									c = ws_array[sheet_count]->c_array[(j*ws_array[sheet_count]->max_cols)+k];									if (c != 0)									{										c->spanned = 1;										c->rowspan = 0;										if (k == fc)											c->colspan = (U16)((lc-fc)+1);										else											c->colspan = 0;									}/*									else									{	/ Need to create one...										printf("Bad One at:%d %d %d<br>\n", sheet_count, j, k);									} */								}							}						}						/* Now reset the first one... *//*						printf("s:%d fr:%d fc:%d lr:%d lc:%d<br>\n", sheet_count, fr, fc, lr, lc); */						c = ws_array[sheet_count]->c_array[(fr*ws_array[sheet_count]->max_cols)+fc];						if (c != 0)						{							c->spanned = 0;							c->rowspan = (U16)(lr-fr);							c->colspan = (U16)(lc-fc);							if (c->rowspan)								c->rowspan++;							if (c->colspan)								c->colspan++;						}					}				}			}			break;		case 0xB8:	/* Hyperlink */			working_buffer[bufidx++] = data;			if (bufidx == last)			{	/* This is based on Office 97 info... */				U16 r, c, uni_type, off;				U32 len;				r = getShort(&working_buffer[0]);				c = getShort(&working_buffer[4]);				if (working_buffer[32] == 0xE0)				{	/* Unicode format */					len = getLong(&working_buffer[48]);					off = 52;					uni_type = 2;				}				else				{	/* Ascii format */					len = getLong(&working_buffer[50]);					off = 54;					uni_type = 0;				}				if (len > (U32)(bufidx - off))				{	/* correct misidentified li

⌨️ 快捷键说明

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