diff --git a/components/fpspreadsheet/xlsconst.pas b/components/fpspreadsheet/xlsconst.pas new file mode 100644 index 000000000..c4dd32543 --- /dev/null +++ b/components/fpspreadsheet/xlsconst.pas @@ -0,0 +1,186 @@ +{ package-wide declaration of constants used by Excel which are not only needed + by the biff readers and writers. } + +unit xlsconst; + +interface + +const + { Formula constants TokenID values } + + { Binary Operator Tokens 3.6} + INT_EXCEL_TOKEN_TADD = $03; + INT_EXCEL_TOKEN_TSUB = $04; + INT_EXCEL_TOKEN_TMUL = $05; + INT_EXCEL_TOKEN_TDIV = $06; + INT_EXCEL_TOKEN_TPOWER = $07; // Power Exponentiation ^ + INT_EXCEL_TOKEN_TCONCAT = $08; // Concatenation & + INT_EXCEL_TOKEN_TLT = $09; // Less than < + INT_EXCEL_TOKEN_TLE = $0A; // Less than or equal <= + INT_EXCEL_TOKEN_TEQ = $0B; // Equal = + INT_EXCEL_TOKEN_TGE = $0C; // Greater than or equal >= + INT_EXCEL_TOKEN_TGT = $0D; // Greater than > + INT_EXCEL_TOKEN_TNE = $0E; // Not equal <> + INT_EXCEL_TOKEN_TISECT = $0F; // Cell range intersection + INT_EXCEL_TOKEN_TLIST = $10; // Cell range list + INT_EXCEL_TOKEN_TRANGE = $11; // Cell range + INT_EXCEL_TOKEN_TUPLUS = $12; // Unary plus + + INT_EXCEL_TOKEN_TUMINUS = $13; // Unary minus + + INT_EXCEL_TOKEN_TPERCENT= $14; // Percent (%, divides operand by 100) + INT_EXCEL_TOKEN_TPAREN = $15; // Operator in parenthesis + + { Constant Operand Tokens, 3.8} + INT_EXCEL_TOKEN_TMISSARG= $16; //missing operand + INT_EXCEL_TOKEN_TSTR = $17; //string + INT_EXCEL_TOKEN_TERR = $1C; //error value + INT_EXCEL_TOKEN_TBOOL = $1D; //boolean + INT_EXCEL_TOKEN_TINT = $1E; //(unsigned) integer + INT_EXCEL_TOKEN_TNUM = $1F; //floating-point + + { Operand Tokens } + // _R: reference; _V: value; _A: array + INT_EXCEL_TOKEN_TREFR = $24; + INT_EXCEL_TOKEN_TREFV = $44; + INT_EXCEL_TOKEN_TREFA = $64; + INT_EXCEL_TOKEN_TAREA_R = $25; + INT_EXCEL_TOKEN_TAREA_V = $45; + INT_EXCEL_TOKEN_TAREA_A = $65; + INT_EXCEL_TOKEN_TREFN_R = $2C; + INT_EXCEL_TOKEN_TREFN_V = $4C; + INT_EXCEL_TOKEN_TREFN_A = $6C; + + { Function Tokens } + // _R: reference; _V: value; _A: array + // Offset 0: token; offset 1: index to a built-in sheet function ( ➜ 3.111) + INT_EXCEL_TOKEN_FUNC_R = $21; + INT_EXCEL_TOKEN_FUNC_V = $41; + INT_EXCEL_TOKEN_FUNC_A = $61; + + //VAR: variable number of arguments: + INT_EXCEL_TOKEN_FUNCVAR_R = $22; + INT_EXCEL_TOKEN_FUNCVAR_V = $42; + INT_EXCEL_TOKEN_FUNCVAR_A = $62; + + { Special tokens } + INT_EXCEL_TOKEN_TEXP = $01; // cell belongs to shared formula + + { Built-in/worksheet functions } + INT_EXCEL_SHEET_FUNC_COUNT = 0; + INT_EXCEL_SHEET_FUNC_IF = 1; + INT_EXCEL_SHEET_FUNC_ISNA = 2; + INT_EXCEL_SHEET_FUNC_ISERROR = 3; + INT_EXCEL_SHEET_FUNC_SUM = 4; + INT_EXCEL_SHEET_FUNC_AVERAGE = 5; + INT_EXCEL_SHEET_FUNC_MIN = 6; + INT_EXCEL_SHEET_FUNC_MAX = 7; + INT_EXCEL_SHEET_FUNC_ROW = 8; + INT_EXCEL_SHEET_FUNC_COLUMN = 9; + INT_EXCEL_SHEET_FUNC_STDEV = 12; + INT_EXCEL_SHEET_FUNC_SIN = 15; + INT_EXCEL_SHEET_FUNC_COS = 16; + INT_EXCEL_SHEET_FUNC_TAN = 17; + INT_EXCEL_SHEET_FUNC_ATAN = 18; + INT_EXCEL_SHEET_FUNC_PI = 19; + INT_EXCEL_SHEET_FUNC_SQRT = 20; + INT_EXCEL_SHEET_FUNC_EXP = 21; + INT_EXCEL_SHEET_FUNC_LN = 22; + INT_EXCEL_SHEET_FUNC_LOG10 = 23; + INT_EXCEL_SHEET_FUNC_ABS = 24; // $18 + INT_EXCEL_SHEET_FUNC_INT = 25; + INT_EXCEL_SHEET_FUNC_SIGN = 26; + INT_EXCEL_SHEET_FUNC_ROUND = 27; // $1B + INT_EXCEL_SHEET_FUNC_MID = 31; + INT_EXCEL_SHEET_FUNC_LEN = 32; + INT_EXCEL_SHEET_FUNC_VALUE = 33; + INT_EXCEL_SHEET_FUNC_TRUE = 34; + INT_EXCEL_SHEET_FUNC_FALSE = 35; + INT_EXCEL_SHEET_FUNC_AND = 36; + INT_EXCEL_SHEET_FUNC_OR = 37; + INT_EXCEL_SHEET_FUNC_NOT = 38; + INT_EXCEL_SHEET_FUNC_VAR = 46; + INT_EXCEL_SHEET_FUNC_PV = 56; + INT_EXCEL_SHEET_FUNC_FV = 57; + INT_EXCEL_SHEET_FUNC_NPER = 58; + INT_EXCEL_SHEET_FUNC_PMT = 59; + INT_EXCEL_SHEET_FUNC_RATE = 60; + INT_EXCEL_SHEET_FUNC_RAND = 63; + INT_EXCEL_SHEET_FUNC_DATE = 65; // $41 + INT_EXCEL_SHEET_FUNC_TIME = 66; // $42 + INT_EXCEL_SHEET_FUNC_DAY = 67; + INT_EXCEL_SHEET_FUNC_MONTH = 68; + INT_EXCEL_SHEET_FUNC_YEAR = 69; + INT_EXCEL_SHEET_FUNC_WEEKDAY = 70; + INT_EXCEL_SHEET_FUNC_HOUR = 71; + INT_EXCEL_SHEET_FUNC_MINUTE = 72; + INT_EXCEL_SHEET_FUNC_SECOND = 73; + INT_EXCEL_SHEET_FUNC_NOW = 74; + INT_EXCEL_SHEET_FUNC_ROWS = 76; + INT_EXCEL_SHEET_FUNC_COLUMNS = 77; + INT_EXCEL_SHEET_FUNC_ASIN = 98; + INT_EXCEL_SHEET_FUNC_ACOS = 99; + INT_EXCEL_SHEET_FUNC_ISREF = 105; + INT_EXCEL_SHEET_FUNC_LOG = 109; + INT_EXCEL_SHEET_FUNC_CHAR = 111; + INT_EXCEL_SHEET_FUNC_LOWER = 112; + INT_EXCEL_SHEET_FUNC_UPPER = 113; + INT_EXCEL_SHEET_FUNC_PROPER = 114; + INT_EXCEL_SHEET_FUNC_LEFT = 115; + INT_EXCEL_SHEET_FUNC_RIGHT = 116; + INT_EXCEL_SHEET_FUNC_TRIM = 118; + INT_EXCEL_SHEET_FUNC_REPLACE = 119; + INT_EXCEL_SHEET_FUNC_SUBSTITUTE = 120; + INT_EXCEL_SHEET_FUNC_CODE = 121; + INT_EXCEL_SHEET_FUNC_CELL = 125; + INT_EXCEL_SHEET_FUNC_ISERR = 126; + INT_EXCEL_SHEET_FUNC_ISTEXT = 127; + INT_EXCEL_SHEET_FUNC_ISNUMBER = 128; + INT_EXCEL_SHEET_FUNC_ISBLANK = 129; + INT_EXCEL_SHEET_FUNC_DATEVALUE = 140; + INT_EXCEL_SHEET_FUNC_TIMEVALUE = 141; + INT_EXCEL_SHEET_FUNC_COUNTA = 169; + INT_EXCEL_SHEET_FUNC_PRODUCT = 183; + INT_EXCEL_SHEET_FUNC_ISNONTEXT = 190; + INT_EXCEL_SHEET_FUNC_STDEVP = 193; + INT_EXCEL_SHEET_FUNC_VARP = 194; + INT_EXCEL_SHEET_FUNC_ISLOGICAL = 198; + INT_EXCEL_SHEET_FUNC_TODAY = 221; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_MEDIAN = 227; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_SINH = 229; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_COSH = 230; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_TANH = 231; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_ASINH = 232; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_ACOSH = 233; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_ATANH = 234; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_INFO = 244; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_AVEDEV = 269; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_BETADIST = 270; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_BETAINV = 272; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_BINOMDIST = 273; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_CHIDIST = 274; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_CHIINV = 275; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_PERMUT = 299; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_POISSON = 300; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_SUMSQ = 321; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_CONCATENATE= 336; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_POWER = 337; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_RADIANS = 342; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_DEGREES = 343; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_SUMIF = 345; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_COUNTIF = 346; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_COUNTBLANK = 347; // not available in BIFF2 + INT_EXCEL_SHEET_FUNC_DATEDIF = 351; // not available in BIFF2 + + { Control Tokens, Special Tokens } +// 01H tExp Matrix formula or shared formula +// 02H tTbl Multiple operation table +// 15H tParen Parentheses +// 18H tNlr Natural language reference (BIFF8) + INT_EXCEL_TOKEN_TATTR = $19; // tAttr Special attribute +// 1AH tSheet Start of external sheet reference (BIFF2-BIFF4) +// 1BH tEndSheet End of external sheet reference (BIFF2-BIFF4) + + +implementation + +end. + diff --git a/components/fpspreadsheet/xlsxooxml.pas b/components/fpspreadsheet/xlsxooxml.pas index 11776095b..24c58c038 100755 --- a/components/fpspreadsheet/xlsxooxml.pas +++ b/components/fpspreadsheet/xlsxooxml.pas @@ -1174,12 +1174,28 @@ end; procedure TsSpreadOOXMLReader.ReadSharedStrings(ANode: TDOMNode); var valuenode: TDOMNode; + childnode: TDOMNode; + nodename: String; s: String; begin while Assigned(ANode) do begin if ANode.NodeName = 'si' then begin + s := ''; valuenode := ANode.FirstChild; - s := GetNodeValue(valuenode); + while valuenode <> nil do begin + nodename := valuenode.NodeName; + if nodename = 't' then + s := GetNodeValue(valuenode) + else + if nodename = 'r' then begin + childnode := valuenode.FirstChild; + while childnode <> nil do begin + s := s + GetNodeValue(childnode); + childnode := childnode.NextSibling; + end; + end; + valuenode := valuenode.NextSibling; + end; FSharedStrings.Add(s); end; ANode := ANode.NextSibling;