fpspreadsheet: Improved reading of shared strings in xlsx files (see http://forum.lazarus.freepascal.org/index.php/topic,25624.msg155857.html#msg155857)
Add unit xlsconst.pas (will be needed for string formula support) git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3503 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
5e5eccef12
commit
fa8632bb9a
186
components/fpspreadsheet/xlsconst.pas
Normal file
186
components/fpspreadsheet/xlsconst.pas
Normal file
@ -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.
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user