You've already forked lazarus-ccr
fpspreadsheet: Construct Excel-like formula string out of an RPN formula and display it in fpsgrid demo.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3085 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -45,11 +45,15 @@ begin
|
|||||||
CurCell := MyWorkSheet.GetFirstCell();
|
CurCell := MyWorkSheet.GetFirstCell();
|
||||||
for i := 0 to MyWorksheet.GetCellCount - 1 do
|
for i := 0 to MyWorksheet.GetCellCount - 1 do
|
||||||
begin
|
begin
|
||||||
WriteLn('Row: ', CurCell^.Row,
|
Write('Row: ', CurCell^.Row,
|
||||||
' Col: ', CurCell^.Col, ' Value: ',
|
' Col: ', CurCell^.Col, ' Value: ',
|
||||||
UTF8ToAnsi(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row,
|
UTF8ToAnsi(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row,
|
||||||
CurCell^.Col))
|
CurCell^.Col))
|
||||||
);
|
);
|
||||||
|
if Length(CurCell^.RPNFormulaValue) > 0 then
|
||||||
|
WriteLn(' Formula: ', MyWorkSheet.ReadRPNFormulaAsString(CurCell))
|
||||||
|
else
|
||||||
|
WriteLn;
|
||||||
CurCell := MyWorkSheet.GetNextCell();
|
CurCell := MyWorkSheet.GetNextCell();
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -128,8 +128,8 @@
|
|||||||
<UnitName Value="mainform"/>
|
<UnitName Value="mainform"/>
|
||||||
<EditorIndex Value="1"/>
|
<EditorIndex Value="1"/>
|
||||||
<WindowIndex Value="0"/>
|
<WindowIndex Value="0"/>
|
||||||
<TopLine Value="818"/>
|
<TopLine Value="511"/>
|
||||||
<CursorPos X="3" Y="825"/>
|
<CursorPos X="27" Y="526"/>
|
||||||
<UsageCount Value="200"/>
|
<UsageCount Value="200"/>
|
||||||
<Loaded Value="True"/>
|
<Loaded Value="True"/>
|
||||||
<LoadedDesigner Value="True"/>
|
<LoadedDesigner Value="True"/>
|
||||||
@ -137,21 +137,24 @@
|
|||||||
<Unit2>
|
<Unit2>
|
||||||
<Filename Value="..\..\fpspreadsheet.pas"/>
|
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||||
<UnitName Value="fpspreadsheet"/>
|
<UnitName Value="fpspreadsheet"/>
|
||||||
<EditorIndex Value="6"/>
|
<EditorIndex Value="5"/>
|
||||||
<WindowIndex Value="0"/>
|
<WindowIndex Value="0"/>
|
||||||
<TopLine Value="145"/>
|
<TopLine Value="523"/>
|
||||||
<CursorPos X="38" Y="163"/>
|
<CursorPos X="40" Y="533"/>
|
||||||
<UsageCount Value="100"/>
|
<UsageCount Value="100"/>
|
||||||
|
<Bookmarks Count="1">
|
||||||
|
<Item0 X="68" Y="3716" ID="1"/>
|
||||||
|
</Bookmarks>
|
||||||
<Loaded Value="True"/>
|
<Loaded Value="True"/>
|
||||||
</Unit2>
|
</Unit2>
|
||||||
<Unit3>
|
<Unit3>
|
||||||
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
|
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
|
||||||
<UnitName Value="fpspreadsheetgrid"/>
|
<UnitName Value="fpspreadsheetgrid"/>
|
||||||
<IsVisibleTab Value="True"/>
|
<IsVisibleTab Value="True"/>
|
||||||
<EditorIndex Value="7"/>
|
<EditorIndex Value="6"/>
|
||||||
<WindowIndex Value="0"/>
|
<WindowIndex Value="0"/>
|
||||||
<TopLine Value="98"/>
|
<TopLine Value="539"/>
|
||||||
<CursorPos X="1" Y="108"/>
|
<CursorPos X="42" Y="557"/>
|
||||||
<UsageCount Value="100"/>
|
<UsageCount Value="100"/>
|
||||||
<Loaded Value="True"/>
|
<Loaded Value="True"/>
|
||||||
</Unit3>
|
</Unit3>
|
||||||
@ -229,11 +232,11 @@
|
|||||||
<Unit13>
|
<Unit13>
|
||||||
<Filename Value="..\..\fpsutils.pas"/>
|
<Filename Value="..\..\fpsutils.pas"/>
|
||||||
<UnitName Value="fpsutils"/>
|
<UnitName Value="fpsutils"/>
|
||||||
<EditorIndex Value="3"/>
|
<EditorIndex Value="2"/>
|
||||||
<WindowIndex Value="0"/>
|
<WindowIndex Value="0"/>
|
||||||
<TopLine Value="44"/>
|
<TopLine Value="62"/>
|
||||||
<CursorPos X="14" Y="70"/>
|
<CursorPos X="1" Y="63"/>
|
||||||
<UsageCount Value="68"/>
|
<UsageCount Value="69"/>
|
||||||
<Loaded Value="True"/>
|
<Loaded Value="True"/>
|
||||||
</Unit13>
|
</Unit13>
|
||||||
<Unit14>
|
<Unit14>
|
||||||
@ -261,11 +264,11 @@
|
|||||||
<Unit17>
|
<Unit17>
|
||||||
<Filename Value="..\..\xlsbiff8.pas"/>
|
<Filename Value="..\..\xlsbiff8.pas"/>
|
||||||
<UnitName Value="xlsbiff8"/>
|
<UnitName Value="xlsbiff8"/>
|
||||||
<EditorIndex Value="4"/>
|
<EditorIndex Value="3"/>
|
||||||
<WindowIndex Value="0"/>
|
<WindowIndex Value="0"/>
|
||||||
<TopLine Value="1920"/>
|
<TopLine Value="1920"/>
|
||||||
<CursorPos X="21" Y="1924"/>
|
<CursorPos X="21" Y="1924"/>
|
||||||
<UsageCount Value="98"/>
|
<UsageCount Value="99"/>
|
||||||
<Loaded Value="True"/>
|
<Loaded Value="True"/>
|
||||||
</Unit17>
|
</Unit17>
|
||||||
<Unit18>
|
<Unit18>
|
||||||
@ -286,14 +289,11 @@
|
|||||||
<Unit20>
|
<Unit20>
|
||||||
<Filename Value="..\..\xlscommon.pas"/>
|
<Filename Value="..\..\xlscommon.pas"/>
|
||||||
<UnitName Value="xlscommon"/>
|
<UnitName Value="xlscommon"/>
|
||||||
<EditorIndex Value="5"/>
|
<EditorIndex Value="4"/>
|
||||||
<WindowIndex Value="0"/>
|
<WindowIndex Value="0"/>
|
||||||
<TopLine Value="650"/>
|
<TopLine Value="1112"/>
|
||||||
<CursorPos X="24" Y="662"/>
|
<CursorPos X="1" Y="1142"/>
|
||||||
<UsageCount Value="94"/>
|
<UsageCount Value="95"/>
|
||||||
<Bookmarks Count="1">
|
|
||||||
<Item0 X="41" Y="1209" ID="1"/>
|
|
||||||
</Bookmarks>
|
|
||||||
<Loaded Value="True"/>
|
<Loaded Value="True"/>
|
||||||
</Unit20>
|
</Unit20>
|
||||||
<Unit21>
|
<Unit21>
|
||||||
@ -591,134 +591,132 @@
|
|||||||
</Unit59>
|
</Unit59>
|
||||||
<Unit60>
|
<Unit60>
|
||||||
<Filename Value="C:\development\fpc\rtl\inc\astrings.inc"/>
|
<Filename Value="C:\development\fpc\rtl\inc\astrings.inc"/>
|
||||||
<EditorIndex Value="2"/>
|
|
||||||
<WindowIndex Value="0"/>
|
<WindowIndex Value="0"/>
|
||||||
<TopLine Value="104"/>
|
<TopLine Value="104"/>
|
||||||
<CursorPos X="1" Y="120"/>
|
<CursorPos X="1" Y="120"/>
|
||||||
<UsageCount Value="11"/>
|
<UsageCount Value="11"/>
|
||||||
<Loaded Value="True"/>
|
|
||||||
</Unit60>
|
</Unit60>
|
||||||
</Units>
|
</Units>
|
||||||
<JumpHistory Count="30" HistoryIndex="29">
|
<JumpHistory Count="30" HistoryIndex="29">
|
||||||
<Position1>
|
<Position1>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="800" Column="1" TopLine="781"/>
|
<Caret Line="654" Column="3" TopLine="647"/>
|
||||||
</Position1>
|
</Position1>
|
||||||
<Position2>
|
<Position2>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||||
<Caret Line="799" Column="75" TopLine="781"/>
|
<Caret Line="742" Column="12" TopLine="723"/>
|
||||||
</Position2>
|
</Position2>
|
||||||
<Position3>
|
<Position3>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||||
<Caret Line="796" Column="1" TopLine="781"/>
|
<Caret Line="115" Column="1" TopLine="115"/>
|
||||||
</Position3>
|
</Position3>
|
||||||
<Position4>
|
<Position4>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||||
<Caret Line="797" Column="1" TopLine="781"/>
|
<Caret Line="349" Column="12" TopLine="318"/>
|
||||||
</Position4>
|
</Position4>
|
||||||
<Position5>
|
<Position5>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||||
<Caret Line="798" Column="1" TopLine="781"/>
|
<Caret Line="358" Column="25" TopLine="327"/>
|
||||||
</Position5>
|
</Position5>
|
||||||
<Position6>
|
<Position6>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||||
<Caret Line="799" Column="1" TopLine="781"/>
|
<Caret Line="478" Column="34" TopLine="449"/>
|
||||||
</Position6>
|
</Position6>
|
||||||
<Position7>
|
<Position7>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
|
||||||
<Caret Line="802" Column="1" TopLine="781"/>
|
<Caret Line="2524" Column="3" TopLine="2520"/>
|
||||||
</Position7>
|
</Position7>
|
||||||
<Position8>
|
<Position8>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
|
||||||
<Caret Line="803" Column="1" TopLine="788"/>
|
<Caret Line="2504" Column="46" TopLine="2498"/>
|
||||||
</Position8>
|
</Position8>
|
||||||
<Position9>
|
<Position9>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="816" Column="29" TopLine="788"/>
|
<Caret Line="654" Column="3" TopLine="647"/>
|
||||||
</Position9>
|
</Position9>
|
||||||
<Position10>
|
<Position10>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="798" Column="1" TopLine="788"/>
|
<Caret Line="661" Column="3" TopLine="654"/>
|
||||||
</Position10>
|
</Position10>
|
||||||
<Position11>
|
<Position11>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="799" Column="1" TopLine="788"/>
|
<Caret Line="542" Column="56" TopLine="540"/>
|
||||||
</Position11>
|
</Position11>
|
||||||
<Position12>
|
<Position12>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="802" Column="1" TopLine="788"/>
|
<Caret Line="728" Column="1" TopLine="704"/>
|
||||||
</Position12>
|
</Position12>
|
||||||
<Position13>
|
<Position13>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||||
<Caret Line="803" Column="1" TopLine="788"/>
|
<Caret Line="1316" Column="1" TopLine="1285"/>
|
||||||
</Position13>
|
</Position13>
|
||||||
<Position14>
|
<Position14>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||||
<Caret Line="804" Column="1" TopLine="788"/>
|
<Caret Line="394" Column="34" TopLine="394"/>
|
||||||
</Position14>
|
</Position14>
|
||||||
<Position15>
|
<Position15>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||||
<Caret Line="806" Column="19" TopLine="781"/>
|
<Caret Line="1" Column="1" TopLine="1"/>
|
||||||
</Position15>
|
</Position15>
|
||||||
<Position16>
|
<Position16>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||||
<Caret Line="799" Column="1" TopLine="781"/>
|
<Caret Line="501" Column="18" TopLine="470"/>
|
||||||
</Position16>
|
</Position16>
|
||||||
<Position17>
|
<Position17>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\xlscommon.pas"/>
|
||||||
<Caret Line="808" Column="1" TopLine="782"/>
|
<Caret Line="1430" Column="28" TopLine="1430"/>
|
||||||
</Position17>
|
</Position17>
|
||||||
<Position18>
|
<Position18>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\xlscommon.pas"/>
|
||||||
<Caret Line="799" Column="1" TopLine="782"/>
|
<Caret Line="1" Column="1" TopLine="1"/>
|
||||||
</Position18>
|
</Position18>
|
||||||
<Position19>
|
<Position19>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="800" Column="1" TopLine="782"/>
|
<Caret Line="704" Column="21" TopLine="704"/>
|
||||||
</Position19>
|
</Position19>
|
||||||
<Position20>
|
<Position20>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="803" Column="1" TopLine="782"/>
|
<Caret Line="1" Column="1" TopLine="1"/>
|
||||||
</Position20>
|
</Position20>
|
||||||
<Position21>
|
<Position21>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="804" Column="1" TopLine="782"/>
|
<Caret Line="83" Column="19" TopLine="53"/>
|
||||||
</Position21>
|
</Position21>
|
||||||
<Position22>
|
<Position22>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="805" Column="1" TopLine="782"/>
|
<Caret Line="229" Column="29" TopLine="199"/>
|
||||||
</Position22>
|
</Position22>
|
||||||
<Position23>
|
<Position23>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="806" Column="1" TopLine="782"/>
|
<Caret Line="540" Column="32" TopLine="509"/>
|
||||||
</Position23>
|
</Position23>
|
||||||
<Position24>
|
<Position24>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="807" Column="1" TopLine="782"/>
|
<Caret Line="511" Column="29" TopLine="511"/>
|
||||||
</Position24>
|
</Position24>
|
||||||
<Position25>
|
<Position25>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="808" Column="1" TopLine="782"/>
|
<Caret Line="1" Column="1" TopLine="1"/>
|
||||||
</Position25>
|
</Position25>
|
||||||
<Position26>
|
<Position26>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="806" Column="50" TopLine="784"/>
|
<Caret Line="83" Column="19" TopLine="53"/>
|
||||||
</Position26>
|
</Position26>
|
||||||
<Position27>
|
<Position27>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="787" Column="104" TopLine="784"/>
|
<Caret Line="229" Column="29" TopLine="199"/>
|
||||||
</Position27>
|
</Position27>
|
||||||
<Position28>
|
<Position28>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="mainform.pas"/>
|
||||||
<Caret Line="243" Column="29" TopLine="227"/>
|
<Caret Line="540" Column="32" TopLine="509"/>
|
||||||
</Position28>
|
</Position28>
|
||||||
<Position29>
|
<Position29>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\xlscommon.pas"/>
|
||||||
<Caret Line="714" Column="35" TopLine="696"/>
|
<Caret Line="1141" Column="28" TopLine="1111"/>
|
||||||
</Position29>
|
</Position29>
|
||||||
<Position30>
|
<Position30>
|
||||||
<Filename Value="mainform.pas"/>
|
<Filename Value="..\..\xlscommon.pas"/>
|
||||||
<Caret Line="825" Column="3" TopLine="818"/>
|
<Caret Line="1142" Column="1" TopLine="1112"/>
|
||||||
</Position30>
|
</Position30>
|
||||||
</JumpHistory>
|
</JumpHistory>
|
||||||
</ProjectOptions>
|
</ProjectOptions>
|
||||||
|
@ -4,7 +4,7 @@ object Form1: TForm1
|
|||||||
Top = 193
|
Top = 193
|
||||||
Width = 884
|
Width = 884
|
||||||
Caption = 'fpsGrid'
|
Caption = 'fpsGrid'
|
||||||
ClientHeight = 624
|
ClientHeight = 629
|
||||||
ClientWidth = 884
|
ClientWidth = 884
|
||||||
Menu = MainMenu
|
Menu = MainMenu
|
||||||
OnActivate = FormActivate
|
OnActivate = FormActivate
|
||||||
@ -13,19 +13,19 @@ object Form1: TForm1
|
|||||||
LCLVersion = '1.3'
|
LCLVersion = '1.3'
|
||||||
object Panel1: TPanel
|
object Panel1: TPanel
|
||||||
Left = 0
|
Left = 0
|
||||||
Height = 76
|
Height = 85
|
||||||
Top = 548
|
Top = 544
|
||||||
Width = 884
|
Width = 884
|
||||||
Align = alBottom
|
Align = alBottom
|
||||||
BevelOuter = bvNone
|
BevelOuter = bvNone
|
||||||
ClientHeight = 76
|
ClientHeight = 85
|
||||||
ClientWidth = 884
|
ClientWidth = 884
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
object CbShowHeaders: TCheckBox
|
object CbShowHeaders: TCheckBox
|
||||||
Left = 8
|
Left = 8
|
||||||
Height = 24
|
Height = 19
|
||||||
Top = 11
|
Top = 8
|
||||||
Width = 116
|
Width = 93
|
||||||
Caption = 'Show headers'
|
Caption = 'Show headers'
|
||||||
Checked = True
|
Checked = True
|
||||||
OnClick = CbShowHeadersClick
|
OnClick = CbShowHeadersClick
|
||||||
@ -34,9 +34,9 @@ object Form1: TForm1
|
|||||||
end
|
end
|
||||||
object CbShowGridLines: TCheckBox
|
object CbShowGridLines: TCheckBox
|
||||||
Left = 8
|
Left = 8
|
||||||
Height = 24
|
Height = 19
|
||||||
Top = 36
|
Top = 32
|
||||||
Width = 125
|
Width = 100
|
||||||
Caption = 'Show grid lines'
|
Caption = 'Show grid lines'
|
||||||
Checked = True
|
Checked = True
|
||||||
OnClick = CbShowGridLinesClick
|
OnClick = CbShowGridLinesClick
|
||||||
@ -45,7 +45,7 @@ object Form1: TForm1
|
|||||||
end
|
end
|
||||||
object EdFrozenCols: TSpinEdit
|
object EdFrozenCols: TSpinEdit
|
||||||
Left = 238
|
Left = 238
|
||||||
Height = 28
|
Height = 23
|
||||||
Top = 8
|
Top = 8
|
||||||
Width = 52
|
Width = 52
|
||||||
OnChange = EdFrozenColsChange
|
OnChange = EdFrozenColsChange
|
||||||
@ -53,7 +53,7 @@ object Form1: TForm1
|
|||||||
end
|
end
|
||||||
object EdFrozenRows: TSpinEdit
|
object EdFrozenRows: TSpinEdit
|
||||||
Left = 238
|
Left = 238
|
||||||
Height = 28
|
Height = 23
|
||||||
Top = 39
|
Top = 39
|
||||||
Width = 52
|
Width = 52
|
||||||
OnChange = EdFrozenRowsChange
|
OnChange = EdFrozenRowsChange
|
||||||
@ -61,27 +61,36 @@ object Form1: TForm1
|
|||||||
end
|
end
|
||||||
object Label1: TLabel
|
object Label1: TLabel
|
||||||
Left = 152
|
Left = 152
|
||||||
Height = 20
|
Height = 15
|
||||||
Top = 13
|
Top = 13
|
||||||
Width = 77
|
Width = 62
|
||||||
Caption = 'Frozen cols:'
|
Caption = 'Frozen cols:'
|
||||||
FocusControl = EdFrozenCols
|
FocusControl = EdFrozenCols
|
||||||
ParentColor = False
|
ParentColor = False
|
||||||
end
|
end
|
||||||
object Label2: TLabel
|
object Label2: TLabel
|
||||||
Left = 153
|
Left = 153
|
||||||
Height = 20
|
Height = 15
|
||||||
Top = 40
|
Top = 40
|
||||||
Width = 82
|
Width = 66
|
||||||
Caption = 'Frozen rows:'
|
Caption = 'Frozen rows:'
|
||||||
FocusControl = EdFrozenRows
|
FocusControl = EdFrozenRows
|
||||||
ParentColor = False
|
ParentColor = False
|
||||||
end
|
end
|
||||||
|
object CbReadFormulas: TCheckBox
|
||||||
|
Left = 8
|
||||||
|
Height = 19
|
||||||
|
Top = 56
|
||||||
|
Width = 96
|
||||||
|
Caption = 'Read formulas'
|
||||||
|
OnChange = CbReadFormulasChange
|
||||||
|
TabOrder = 4
|
||||||
|
end
|
||||||
end
|
end
|
||||||
object PageControl1: TPageControl
|
object PageControl1: TPageControl
|
||||||
Left = 0
|
Left = 0
|
||||||
Height = 495
|
Height = 465
|
||||||
Top = 53
|
Top = 79
|
||||||
Width = 884
|
Width = 884
|
||||||
ActivePage = TabSheet1
|
ActivePage = TabSheet1
|
||||||
Align = alClient
|
Align = alClient
|
||||||
@ -90,11 +99,11 @@ object Form1: TForm1
|
|||||||
OnChange = PageControl1Change
|
OnChange = PageControl1Change
|
||||||
object TabSheet1: TTabSheet
|
object TabSheet1: TTabSheet
|
||||||
Caption = 'Sheet1'
|
Caption = 'Sheet1'
|
||||||
ClientHeight = 462
|
ClientHeight = 437
|
||||||
ClientWidth = 876
|
ClientWidth = 876
|
||||||
object WorksheetGrid: TsWorksheetGrid
|
object WorksheetGrid: TsWorksheetGrid
|
||||||
Left = 0
|
Left = 0
|
||||||
Height = 462
|
Height = 437
|
||||||
Top = 0
|
Top = 0
|
||||||
Width = 876
|
Width = 876
|
||||||
FrozenCols = 0
|
FrozenCols = 0
|
||||||
@ -109,7 +118,7 @@ object Form1: TForm1
|
|||||||
TitleStyle = tsNative
|
TitleStyle = tsNative
|
||||||
OnSelection = WorksheetGridSelection
|
OnSelection = WorksheetGridSelection
|
||||||
ColWidths = (
|
ColWidths = (
|
||||||
56
|
42
|
||||||
64
|
64
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
@ -187,19 +196,19 @@ object Form1: TForm1
|
|||||||
end
|
end
|
||||||
object FontComboBox: TComboBox
|
object FontComboBox: TComboBox
|
||||||
Left = 52
|
Left = 52
|
||||||
Height = 28
|
Height = 23
|
||||||
Top = 2
|
Top = 2
|
||||||
Width = 127
|
Width = 127
|
||||||
ItemHeight = 20
|
ItemHeight = 15
|
||||||
OnSelect = FontComboBoxSelect
|
OnSelect = FontComboBoxSelect
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
end
|
end
|
||||||
object FontSizeComboBox: TComboBox
|
object FontSizeComboBox: TComboBox
|
||||||
Left = 179
|
Left = 179
|
||||||
Height = 28
|
Height = 23
|
||||||
Top = 2
|
Top = 2
|
||||||
Width = 48
|
Width = 48
|
||||||
ItemHeight = 20
|
ItemHeight = 15
|
||||||
Items.Strings = (
|
Items.Strings = (
|
||||||
'8'
|
'8'
|
||||||
'9'
|
'9'
|
||||||
@ -332,6 +341,22 @@ object Form1: TForm1
|
|||||||
Action = AcCopyFormat
|
Action = AcCopyFormat
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
object FormulaToolBar: TToolBar
|
||||||
|
Left = 0
|
||||||
|
Height = 26
|
||||||
|
Top = 53
|
||||||
|
Width = 884
|
||||||
|
Caption = 'FormulaToolBar'
|
||||||
|
TabOrder = 4
|
||||||
|
object EdFormula: TEdit
|
||||||
|
Left = 1
|
||||||
|
Height = 24
|
||||||
|
Top = 2
|
||||||
|
Width = 883
|
||||||
|
Align = alClient
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
object OpenDialog: TOpenDialog
|
object OpenDialog: TOpenDialog
|
||||||
DefaultExt = '.xls'
|
DefaultExt = '.xls'
|
||||||
Filter = 'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlxs|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|Wikitable (pipes) (.wikitable_pipes)|.wikitable_pipes|All files (*.*)|*.*'
|
Filter = 'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlxs|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|Wikitable (pipes) (.wikitable_pipes)|.wikitable_pipes|All files (*.*)|*.*'
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -80,6 +80,8 @@ type
|
|||||||
CbShowHeaders: TCheckBox;
|
CbShowHeaders: TCheckBox;
|
||||||
CbShowGridLines: TCheckBox;
|
CbShowGridLines: TCheckBox;
|
||||||
CbBackgroundColor: TColorBox;
|
CbBackgroundColor: TColorBox;
|
||||||
|
CbReadFormulas: TCheckBox;
|
||||||
|
EdFormula: TEdit;
|
||||||
FontComboBox: TComboBox;
|
FontComboBox: TComboBox;
|
||||||
EdFrozenRows: TSpinEdit;
|
EdFrozenRows: TSpinEdit;
|
||||||
FontDialog: TFontDialog;
|
FontDialog: TFontDialog;
|
||||||
@ -178,6 +180,7 @@ type
|
|||||||
NumFormatPopupMenu: TPopupMenu;
|
NumFormatPopupMenu: TPopupMenu;
|
||||||
SaveDialog: TSaveDialog;
|
SaveDialog: TSaveDialog;
|
||||||
EdFrozenCols: TSpinEdit;
|
EdFrozenCols: TSpinEdit;
|
||||||
|
FormulaToolBar: TToolBar;
|
||||||
WorksheetGrid: TsWorksheetGrid;
|
WorksheetGrid: TsWorksheetGrid;
|
||||||
TabSheet1: TTabSheet;
|
TabSheet1: TTabSheet;
|
||||||
ToolBar1: TToolBar;
|
ToolBar1: TToolBar;
|
||||||
@ -223,6 +226,7 @@ type
|
|||||||
procedure AcVertAlignmentExecute(Sender: TObject);
|
procedure AcVertAlignmentExecute(Sender: TObject);
|
||||||
procedure AcWordwrapExecute(Sender: TObject);
|
procedure AcWordwrapExecute(Sender: TObject);
|
||||||
procedure CbBackgroundColorSelect(Sender: TObject);
|
procedure CbBackgroundColorSelect(Sender: TObject);
|
||||||
|
procedure CbReadFormulasChange(Sender: TObject);
|
||||||
procedure CbShowHeadersClick(Sender: TObject);
|
procedure CbShowHeadersClick(Sender: TObject);
|
||||||
procedure CbShowGridLinesClick(Sender: TObject);
|
procedure CbShowGridLinesClick(Sender: TObject);
|
||||||
procedure CbBackgroundColorGetColors(Sender: TCustomColorBox; Items: TStrings);
|
procedure CbBackgroundColorGetColors(Sender: TCustomColorBox; Items: TStrings);
|
||||||
@ -533,6 +537,11 @@ begin
|
|||||||
with WorksheetGrid do BackgroundColors[Selection] := CbBackgroundColor.ItemIndex;
|
with WorksheetGrid do BackgroundColors[Selection] := CbBackgroundColor.ItemIndex;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TForm1.CbReadFormulasChange(Sender: TObject);
|
||||||
|
begin
|
||||||
|
WorksheetGrid.ReadFormulas := CbReadFormulas.Checked;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TForm1.CbShowHeadersClick(Sender: TObject);
|
procedure TForm1.CbShowHeadersClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
WorksheetGrid.ShowHeaders := CbShowHeaders.Checked;
|
WorksheetGrid.ShowHeaders := CbShowHeaders.Checked;
|
||||||
@ -697,17 +706,27 @@ end;
|
|||||||
procedure TForm1.WorksheetGridSelection(Sender: TObject; aCol, aRow: Integer);
|
procedure TForm1.WorksheetGridSelection(Sender: TObject; aCol, aRow: Integer);
|
||||||
var
|
var
|
||||||
r, c: Cardinal;
|
r, c: Cardinal;
|
||||||
|
cell: PCell;
|
||||||
begin
|
begin
|
||||||
if WorksheetGrid.Workbook = nil then
|
if WorksheetGrid.Workbook = nil then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
if AcCopyFormat.Checked then begin
|
|
||||||
r := WorksheetGrid.GetWorksheetRow(ARow);
|
r := WorksheetGrid.GetWorksheetRow(ARow);
|
||||||
c := WorksheetGrid.GetWorksheetCol(ACol);
|
c := WorksheetGrid.GetWorksheetCol(ACol);
|
||||||
|
|
||||||
|
if AcCopyFormat.Checked then begin
|
||||||
WorksheetGrid.Worksheet.CopyFormat(@FCopiedFormat, r, c);
|
WorksheetGrid.Worksheet.CopyFormat(@FCopiedFormat, r, c);
|
||||||
AcCopyFormat.Checked := false;
|
AcCopyFormat.Checked := false;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
cell := WorksheetGrid.Worksheet.FindCell(r, c);
|
||||||
|
if cell <> nil then begin
|
||||||
|
if Length(cell^.RPNFormulaValue) > 0 then
|
||||||
|
EdFormula.Text := WorksheetGrid.Worksheet.ReadRPNFormulaAsString(cell)
|
||||||
|
else
|
||||||
|
EdFormula.Text := WorksheetGrid.Worksheet.ReadAsUTF8Text(cell);
|
||||||
|
end;
|
||||||
|
|
||||||
UpdateHorAlignmentActions;
|
UpdateHorAlignmentActions;
|
||||||
UpdateVertAlignmentActions;
|
UpdateVertAlignmentActions;
|
||||||
UpdateWordwraps;
|
UpdateWordwraps;
|
||||||
@ -718,6 +737,7 @@ begin
|
|||||||
UpdateFontStyleActions;
|
UpdateFontStyleActions;
|
||||||
UpdateTextRotationActions;
|
UpdateTextRotationActions;
|
||||||
UpdateNumFormatActions;
|
UpdateNumFormatActions;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TForm1.UpdateBackgroundColorIndex;
|
procedure TForm1.UpdateBackgroundColorIndex;
|
||||||
|
@ -69,7 +69,7 @@ type
|
|||||||
TFEKind = (
|
TFEKind = (
|
||||||
{ Basic operands }
|
{ Basic operands }
|
||||||
fekCell, fekCellRef, fekCellRange, fekNum, fekInteger, fekString, fekBool,
|
fekCell, fekCellRef, fekCellRange, fekNum, fekInteger, fekString, fekBool,
|
||||||
fekErr, fekMissingArg,
|
fekErr, fekMissingArg, fekParen,
|
||||||
{ Basic operations }
|
{ Basic operations }
|
||||||
fekAdd, fekSub, fekDiv, fekMul, fekPercent, fekPower, fekUMinus, fekUPlus,
|
fekAdd, fekSub, fekDiv, fekMul, fekPercent, fekPower, fekUMinus, fekUPlus,
|
||||||
fekConcat, // string concatenation
|
fekConcat, // string concatenation
|
||||||
@ -393,11 +393,14 @@ type
|
|||||||
function GetLastCellOfRow(ARow: Cardinal): PCell;
|
function GetLastCellOfRow(ARow: Cardinal): PCell;
|
||||||
function GetLastColNumber: Cardinal;
|
function GetLastColNumber: Cardinal;
|
||||||
function GetLastRowNumber: Cardinal;
|
function GetLastRowNumber: Cardinal;
|
||||||
function ReadAsUTF8Text(ARow, ACol: Cardinal): ansistring;
|
function ReadAsUTF8Text(ARow, ACol: Cardinal): ansistring; overload;
|
||||||
|
function ReadAsUTF8Text(ACell: PCell): ansistring; overload;
|
||||||
function ReadAsNumber(ARow, ACol: Cardinal): Double;
|
function ReadAsNumber(ARow, ACol: Cardinal): Double;
|
||||||
function ReadAsDateTime(ARow, ACol: Cardinal; out AResult: TDateTime): Boolean;
|
function ReadAsDateTime(ARow, ACol: Cardinal; out AResult: TDateTime): Boolean;
|
||||||
|
function ReadRPNFormulaAsString(ACell: PCell): String;
|
||||||
function ReadUsedFormatting(ARow, ACol: Cardinal): TsUsedFormattingFields;
|
function ReadUsedFormatting(ARow, ACol: Cardinal): TsUsedFormattingFields;
|
||||||
function ReadBackgroundColor(ARow, ACol: Cardinal): TsColor;
|
function ReadBackgroundColor(ARow, ACol: Cardinal): TsColor;
|
||||||
|
|
||||||
procedure RemoveAllCells;
|
procedure RemoveAllCells;
|
||||||
|
|
||||||
{ Writing of values }
|
{ Writing of values }
|
||||||
@ -738,6 +741,7 @@ type
|
|||||||
function RPNInteger(AValue: Word; ANext: PRPNItem): PRPNItem;
|
function RPNInteger(AValue: Word; ANext: PRPNItem): PRPNItem;
|
||||||
function RPNMissingArg(ANext: PRPNItem): PRPNItem;
|
function RPNMissingArg(ANext: PRPNItem): PRPNItem;
|
||||||
function RPNNumber(AValue: Double; ANext: PRPNItem): PRPNItem;
|
function RPNNumber(AValue: Double; ANext: PRPNItem): PRPNItem;
|
||||||
|
function RPNParenthesis(ANext: PRPNItem): PRPNItem;
|
||||||
function RPNString(AValue: String; ANext: PRPNItem): PRPNItem;
|
function RPNString(AValue: String; ANext: PRPNItem): PRPNItem;
|
||||||
function RPNFunc(AToken: TFEKind; ANext: PRPNItem): PRPNItem; overload;
|
function RPNFunc(AToken: TFEKind; ANext: PRPNItem): PRPNItem; overload;
|
||||||
function RPNFunc(AToken: TFEKind; ANumParams: Byte; ANext: PRPNItem): PRPNItem; overload;
|
function RPNFunc(AToken: TFEKind; ANumParams: Byte; ANext: PRPNItem): PRPNItem; overload;
|
||||||
@ -758,7 +762,7 @@ procedure MakeLEPalette(APalette: PsPalette; APaletteSize: Integer);
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Math, StrUtils, fpsUtils, fpsNumFormatParser;
|
Math, StrUtils, TypInfo, fpsUtils, fpsNumFormatParser;
|
||||||
|
|
||||||
{ Translatable strings }
|
{ Translatable strings }
|
||||||
resourcestring
|
resourcestring
|
||||||
@ -1258,6 +1262,11 @@ end;
|
|||||||
@return The text representation of the cell
|
@return The text representation of the cell
|
||||||
}
|
}
|
||||||
function TsWorksheet.ReadAsUTF8Text(ARow, ACol: Cardinal): ansistring;
|
function TsWorksheet.ReadAsUTF8Text(ARow, ACol: Cardinal): ansistring;
|
||||||
|
begin
|
||||||
|
Result := ReadAsUTF8Text(GetCell(ARow, ACol));
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TsWorksheet.ReadAsUTF8Text(ACell: PCell): ansistring;
|
||||||
|
|
||||||
function FloatToStrNoNaN(const Value: Double;
|
function FloatToStrNoNaN(const Value: Double;
|
||||||
ANumberFormat: TsNumberFormat; ANumberFormatStr: string; ADecimals: byte): ansistring;
|
ANumberFormat: TsNumberFormat; ANumberFormatStr: string; ADecimals: byte): ansistring;
|
||||||
@ -1301,16 +1310,10 @@ function TsWorksheet.ReadAsUTF8Text(ARow, ACol: Cardinal): ansistring;
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
|
||||||
ACell: PCell;
|
|
||||||
begin
|
begin
|
||||||
ACell := FindCell(ARow, ACol);
|
|
||||||
|
|
||||||
if ACell = nil then
|
|
||||||
begin
|
|
||||||
Result := '';
|
Result := '';
|
||||||
|
if ACell = nil then
|
||||||
Exit;
|
Exit;
|
||||||
end;
|
|
||||||
|
|
||||||
with ACell^ do
|
with ACell^ do
|
||||||
case ContentType of
|
case ContentType of
|
||||||
@ -1381,6 +1384,126 @@ begin
|
|||||||
Result := True;
|
Result := True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TsWorksheet.ReadRPNFormulaAsString(ACell: PCell): String;
|
||||||
|
var
|
||||||
|
formula: TsRPNFormula;
|
||||||
|
elem: TsFormulaElement;
|
||||||
|
i, j: Integer;
|
||||||
|
L: TStringList;
|
||||||
|
s: String;
|
||||||
|
ptr: Pointer;
|
||||||
|
fek: TFEKind;
|
||||||
|
|
||||||
|
procedure Store(s: String);
|
||||||
|
begin
|
||||||
|
L.Clear;
|
||||||
|
L.Add(s);
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result := '';
|
||||||
|
if ACell = nil then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
L := TStringList.Create;
|
||||||
|
try
|
||||||
|
for i:=0 to Length(ACell^.RPNFormulaValue)-1 do begin
|
||||||
|
elem := ACell^.RPNFormulaValue[i];
|
||||||
|
ptr := Pointer(elem.ElementKind);
|
||||||
|
case elem.ElementKind of
|
||||||
|
fekNum:
|
||||||
|
L.AddObject(Format('%g', [elem.DoubleValue]), ptr);
|
||||||
|
fekInteger:
|
||||||
|
L.AddObject(IntToStr(elem.IntValue), ptr);
|
||||||
|
fekString:
|
||||||
|
L.AddObject('"' + elem.StringValue + '"', ptr);
|
||||||
|
fekBool:
|
||||||
|
L.AddObject(IfThen(elem.DoubleValue=0, 'TRUE', 'FALSE'), ptr);
|
||||||
|
fekCell,
|
||||||
|
fekCellRef:
|
||||||
|
L.AddObject(GetCellString(elem.Row, elem.Col, elem.RelFlags), ptr);
|
||||||
|
fekCellRange:
|
||||||
|
L.AddObject(GetCellRangeString(elem.Row, elem.Col, elem.Row2, elem.Col2, elem.RelFlags), ptr);
|
||||||
|
// Operations:
|
||||||
|
fekAdd : L.AddObject('+', ptr);
|
||||||
|
fekSub : L.AddObject('-', ptr);
|
||||||
|
fekMul : L.AddObject('*', ptr);
|
||||||
|
fekDiv : L.AddObject('/', ptr);
|
||||||
|
fekPower : L.AddObject('^', ptr);
|
||||||
|
fekConcat : L.AddObject('&', ptr);
|
||||||
|
fekParen : L.AddObject('', ptr);
|
||||||
|
fekEqual : L.AddObject('=', ptr);
|
||||||
|
fekNotEqual : L.AddObject('<>', ptr);
|
||||||
|
fekLess : L.AddObject('<', ptr);
|
||||||
|
fekLessEqual : L.AddObject('<=', ptr);
|
||||||
|
fekGreater : L.AddObject('>', ptr);
|
||||||
|
fekGreaterEqual: L.AddObject('>=', ptr);
|
||||||
|
fekPercent : L.AddObject('%', ptr);
|
||||||
|
fekUPlus : L.AddObject('+', ptr);
|
||||||
|
fekUMinus : L.AddObject('-', ptr);
|
||||||
|
fekCellInfo : L.AddObject('CELL', ptr); // That's the function name!
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
s := GetEnumName(TypeInfo(TFEKind), integer(elem.ElementKind));
|
||||||
|
Delete(s, 1, 3);
|
||||||
|
L.AddObject(s, ptr);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
i := L.Count-1;
|
||||||
|
while (L.Count > 0) and (i >= 0) do begin
|
||||||
|
fek := TFEKind(PtrInt(L.Objects[i]));
|
||||||
|
case fek of
|
||||||
|
fekAdd, fekSub, fekMul, fekDiv, fekPower, fekConcat,
|
||||||
|
fekEqual, fekNotEqual, fekLess, fekLessEqual, fekGreater, fekGreaterEqual:
|
||||||
|
begin
|
||||||
|
L.Strings[i] := Format('%s%s%s', [L[i+2], L[i], L[i+1]]);
|
||||||
|
L.Objects[i] := pointer(fekString);
|
||||||
|
L.Delete(i+2);
|
||||||
|
L.Delete(i+1);
|
||||||
|
end;
|
||||||
|
fekUPlus, fekUMinus:
|
||||||
|
begin
|
||||||
|
L.Strings[i] := L[i]+L[i+1];
|
||||||
|
L.Objects[i] := Pointer(fekString);
|
||||||
|
L.Delete(i+1);
|
||||||
|
end;
|
||||||
|
fekPercent:
|
||||||
|
begin
|
||||||
|
L.Strings[i] := L[i+1]+L[i];
|
||||||
|
L.Objects[i] := Pointer(fekString);
|
||||||
|
L.Delete(i+1);
|
||||||
|
end;
|
||||||
|
fekParen:
|
||||||
|
begin
|
||||||
|
L.Strings[i] := Format('(%s)', [L[i+1]]);
|
||||||
|
L.Objects[i] := pointer(fekString);
|
||||||
|
L.Delete(i+1);
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
if fek >= fekAdd then begin
|
||||||
|
elem := ACell^.RPNFormulaValue[i];
|
||||||
|
s := '';
|
||||||
|
for j:= i+elem.ParamsNum downto i+1 do begin
|
||||||
|
s := s + ',' + L[j];
|
||||||
|
L.Delete(j);
|
||||||
|
end;
|
||||||
|
Delete(s, 1, 1);
|
||||||
|
L.Strings[i] := Format('%s(%s)', [L[i], s]);
|
||||||
|
L.Objects[i] := pointer(fekString);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
dec(i);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Result := '=' + L[0];
|
||||||
|
|
||||||
|
finally
|
||||||
|
L.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TsWorksheet.ReadUsedFormatting(ARow, ACol: Cardinal): TsUsedFormattingFields;
|
function TsWorksheet.ReadUsedFormatting(ARow, ACol: Cardinal): TsUsedFormattingFields;
|
||||||
var
|
var
|
||||||
ACell: PCell;
|
ACell: PCell;
|
||||||
@ -3609,6 +3732,17 @@ begin
|
|||||||
Result^.Next := ANext;
|
Result^.Next := ANext;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array which put the curren operator in parenthesis.
|
||||||
|
For display purposes only, does not affect calculation.
|
||||||
|
}
|
||||||
|
function RPNParenthesis(ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekParen;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
{@@
|
{@@
|
||||||
Creates an entry in the RPN array for a string.
|
Creates an entry in the RPN array for a string.
|
||||||
}
|
}
|
||||||
@ -3631,6 +3765,34 @@ begin
|
|||||||
raise Exception.Create('No basic tokens allowed here.');
|
raise Exception.Create('No basic tokens allowed here.');
|
||||||
Result := NewRPNItem;
|
Result := NewRPNItem;
|
||||||
Result^.FE.ElementKind := AToken;
|
Result^.FE.ElementKind := AToken;
|
||||||
|
|
||||||
|
case AToken of
|
||||||
|
fekFALSE, fekNOW, fekPI, fekRAND, fekTODAY, fekTRUE:
|
||||||
|
Result^.FE.ParamsNum := 0;
|
||||||
|
|
||||||
|
fekABS, fekACOS, fekACOSH, fekASIN, fekASINH, fekATAN, fekATANH,
|
||||||
|
fekCHAR, fekCODE, fekCOLUMNS, fekCOUNTBLANK, fekCOS, fekCOSH,
|
||||||
|
fekDATEVALUE, fekDAY, fekDEGREES, fekEXP, fekHOUR, fekINFO, fekINT,
|
||||||
|
fekIsBLANK, fekIsERR, fekIsERROR, fekIsLOGICAL, fekIsNA, fekIsNONTEXT,
|
||||||
|
fekIsTEXT, fekIsNUMBER, fekIsRef, fekLN, fekLOG10, fekLOWER, fekMINUTE,
|
||||||
|
fekMONTH, fekNOT, fekOpSUM, fekPercent, fekPROPER, fekRADIANS, fekROWS,
|
||||||
|
fekSECOND, fekSIGN, fekSIN, fekSINH, fekSQRT, fekTAN, fekTANH,
|
||||||
|
fekTIMEVALUE, fekTRIM, fekUMinus, fekUPlus, fekUPPER, fekValue,
|
||||||
|
fekWEEKDAY, fekYEAR:
|
||||||
|
Result^.FE.ParamsNum := 1;
|
||||||
|
|
||||||
|
fekAdd, fekCHIDIST, fekCHIINV, fekConcat, fekCOUNTIF, fekDiv,
|
||||||
|
fekEqual, fekGreater, fekGreaterEqual, fekLess, fekLessEqual,
|
||||||
|
fekMul, fekNotEqual, fekPERMUT, fekPower, fekSub, fekROUND:
|
||||||
|
Result^.FE.ParamsNum := 2;
|
||||||
|
|
||||||
|
fekDATE, fekDATEDIF, fekMID, fekPOISSON, fekTIME:
|
||||||
|
Result^.FE.ParamsNum := 3;
|
||||||
|
|
||||||
|
fekBINOMDIST, fekREPLACE:
|
||||||
|
Result^.FE.ParamsNum := 4;
|
||||||
|
end;
|
||||||
|
|
||||||
Result^.Next := ANext;
|
Result^.Next := ANext;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -3688,7 +3850,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
MakeLEPalette(@DEFAULT_PALETTE, Length(DEFAULT_PALETTE));
|
MakeLEPalette(@DEFAULT_PALETTE, Length(DEFAULT_PALETTE));
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ type
|
|||||||
FLockCount: Integer;
|
FLockCount: Integer;
|
||||||
FEditing: Boolean;
|
FEditing: Boolean;
|
||||||
FCellFont: TFont;
|
FCellFont: TFont;
|
||||||
|
FReadFormulas: Boolean;
|
||||||
function CalcAutoRowHeight(ARow: Integer): Integer;
|
function CalcAutoRowHeight(ARow: Integer): Integer;
|
||||||
function CalcColWidth(AWidth: Single): Integer;
|
function CalcColWidth(AWidth: Single): Integer;
|
||||||
function CalcRowHeight(AHeight: Single): Integer;
|
function CalcRowHeight(AHeight: Single): Integer;
|
||||||
@ -132,6 +133,7 @@ type
|
|||||||
property DisplayFixedColRow: Boolean read GetShowHeaders write SetShowHeaders default true;
|
property DisplayFixedColRow: Boolean read GetShowHeaders write SetShowHeaders default true;
|
||||||
property FrozenCols: Integer read FFrozenCols write SetFrozenCols;
|
property FrozenCols: Integer read FFrozenCols write SetFrozenCols;
|
||||||
property FrozenRows: Integer read FFrozenRows write SetFrozenRows;
|
property FrozenRows: Integer read FFrozenRows write SetFrozenRows;
|
||||||
|
property ReadFormulas: Boolean read FReadFormulas write FReadFormulas;
|
||||||
property ShowGridLines: Boolean read GetShowGridLines write SetShowGridLines default true;
|
property ShowGridLines: Boolean read GetShowGridLines write SetShowGridLines default true;
|
||||||
property ShowHeaders: Boolean read GetShowHeaders write SetShowHeaders default true;
|
property ShowHeaders: Boolean read GetShowHeaders write SetShowHeaders default true;
|
||||||
|
|
||||||
@ -220,6 +222,7 @@ type
|
|||||||
property DisplayFixedColRow; deprecated 'Use ShowHeaders';
|
property DisplayFixedColRow; deprecated 'Use ShowHeaders';
|
||||||
property FrozenCols;
|
property FrozenCols;
|
||||||
property FrozenRows;
|
property FrozenRows;
|
||||||
|
property ReadFormulas;
|
||||||
property ShowGridLines;
|
property ShowGridLines;
|
||||||
property ShowHeaders;
|
property ShowHeaders;
|
||||||
|
|
||||||
@ -551,7 +554,7 @@ end;
|
|||||||
{ Converts a spreadsheet font to a font used for painting (TCanvas.Font). }
|
{ Converts a spreadsheet font to a font used for painting (TCanvas.Font). }
|
||||||
procedure TsCustomWorksheetGrid.Convert_sFont_to_Font(sFont: TsFont; AFont: TFont);
|
procedure TsCustomWorksheetGrid.Convert_sFont_to_Font(sFont: TsFont; AFont: TFont);
|
||||||
begin
|
begin
|
||||||
if Assigned(AFont) then begin
|
if Assigned(AFont) and Assigned(sFont) then begin
|
||||||
AFont.Name := sFont.FontName;
|
AFont.Name := sFont.FontName;
|
||||||
AFont.Size := round(sFont.Size);
|
AFont.Size := round(sFont.Size);
|
||||||
AFont.Style := [];
|
AFont.Style := [];
|
||||||
@ -2522,6 +2525,7 @@ begin
|
|||||||
try
|
try
|
||||||
FreeAndNil(FWorkbook);
|
FreeAndNil(FWorkbook);
|
||||||
FWorkbook := TsWorkbook.Create;
|
FWorkbook := TsWorkbook.Create;
|
||||||
|
FWorkbook.ReadFormulas := FReadFormulas;
|
||||||
FWorkbook.ReadFromFile(AFileName, AFormat);
|
FWorkbook.ReadFromFile(AFileName, AFormat);
|
||||||
LoadFromWorksheet(FWorkbook.GetWorksheetByIndex(AWorksheetIndex));
|
LoadFromWorksheet(FWorkbook.GetWorksheetByIndex(AWorksheetIndex));
|
||||||
finally
|
finally
|
||||||
@ -2536,6 +2540,7 @@ begin
|
|||||||
try
|
try
|
||||||
FreeAndNil(FWorkbook);
|
FreeAndNil(FWorkbook);
|
||||||
FWorkbook := TsWorkbook.Create;
|
FWorkbook := TsWorkbook.Create;
|
||||||
|
FWorkbook.ReadFormulas := FReadFormulas;
|
||||||
FWorkbook.ReadFromFile(AFilename);
|
FWorkbook.ReadFromFile(AFilename);
|
||||||
LoadFromWorksheet(FWorkbook.GetWorksheetByIndex(AWorksheetIndex));
|
LoadFromWorksheet(FWorkbook.GetWorksheetByIndex(AWorksheetIndex));
|
||||||
finally
|
finally
|
||||||
|
@ -59,6 +59,8 @@ function ParseCellColString(const AStr: string;
|
|||||||
var AResult: Integer): Boolean;
|
var AResult: Integer): Boolean;
|
||||||
|
|
||||||
function GetColString(AColIndex: Integer): String;
|
function GetColString(AColIndex: Integer): String;
|
||||||
|
function GetCellString(ARow,ACol: Cardinal; AFlags: TsRelFlags): String;
|
||||||
|
function GetCellRangeString(ARow1, ACol1, ARow2, ACol2: Cardinal; AFlags: TsRelFlags): String;
|
||||||
|
|
||||||
function UTF8TextToXMLText(AText: ansistring): ansistring;
|
function UTF8TextToXMLText(AText: ansistring): ansistring;
|
||||||
|
|
||||||
@ -459,6 +461,29 @@ begin
|
|||||||
Result := 'too big';
|
Result := 'too big';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
const
|
||||||
|
RELCHAR: Array[boolean] of String = ('$', '');
|
||||||
|
|
||||||
|
function GetCellString(ARow, ACol: Cardinal; AFlags: TsRelFlags): String;
|
||||||
|
begin
|
||||||
|
Result := Format('%s%s%s%d', [
|
||||||
|
RELCHAR[rfRelCol in AFlags], GetColString(ACol),
|
||||||
|
RELCHAR[rfRelRow in AFlags], ARow+1
|
||||||
|
]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function GetCellRangeString(ARow1, ACol1, ARow2, ACol2: Cardinal; AFlags: TsRelFlags): String;
|
||||||
|
begin
|
||||||
|
Result := Format('%s%s%s%d:%s%s%s%d', [
|
||||||
|
RELCHAR[rfRelCol in AFlags], GetColString(ACol1),
|
||||||
|
RELCHAR[rfRelRow in AFlags], ARow1 + 1,
|
||||||
|
RELCHAR[rfRelCol2 in AFlags], GetColString(ACol2),
|
||||||
|
RELCHAR[rfRelRow2 in AFlags], ARow2 + 1
|
||||||
|
]);
|
||||||
|
// Result := GetCellString(ARow1, ACol1, AFlags) + ':' + GetCellString(ARow2, ACol2, [rfRelRow2, rfRelCol2]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{In XML files some chars must be translated}
|
{In XML files some chars must be translated}
|
||||||
function UTF8TextToXMLText(AText: ansistring): ansistring;
|
function UTF8TextToXMLText(AText: ansistring): ansistring;
|
||||||
var
|
var
|
||||||
|
@ -1678,8 +1678,8 @@ begin
|
|||||||
ACol := c and MASK_EXCEL_COL_BITS_BIFF8;
|
ACol := c and MASK_EXCEL_COL_BITS_BIFF8;
|
||||||
// Extract info on absolute/relative addresses.
|
// Extract info on absolute/relative addresses.
|
||||||
AFlags := [];
|
AFlags := [];
|
||||||
if (c and MASK_EXCEL_RELATIVE_COL = 1) then Include(AFlags, rfRelCol);
|
if (c and MASK_EXCEL_RELATIVE_COL <> 0) then Include(AFlags, rfRelCol);
|
||||||
if (c and MASK_EXCEL_RELATIVE_ROW = 1) then Include(AFlags, rfRelRow);
|
if (c and MASK_EXCEL_RELATIVE_ROW <> 0) then Include(AFlags, rfRelRow);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ Reads a cell range address used in an RPN formula element.
|
{ Reads a cell range address used in an RPN formula element.
|
||||||
@ -1703,10 +1703,10 @@ begin
|
|||||||
ACol2 := c2 and MASK_EXCEL_COL_BITS_BIFF8;
|
ACol2 := c2 and MASK_EXCEL_COL_BITS_BIFF8;
|
||||||
// Extract info on absolute/relative addresses.
|
// Extract info on absolute/relative addresses.
|
||||||
AFlags := [];
|
AFlags := [];
|
||||||
if (c1 and MASK_EXCEL_RELATIVE_COL = 1) then Include(AFlags, rfRelCol);
|
if (c1 and MASK_EXCEL_RELATIVE_COL <> 0) then Include(AFlags, rfRelCol);
|
||||||
if (c1 and MASK_EXCEL_RELATIVE_ROW = 1) then Include(AFlags, rfRelRow);
|
if (c1 and MASK_EXCEL_RELATIVE_ROW <> 0) then Include(AFlags, rfRelRow);
|
||||||
if (c2 and MASK_EXCEL_RELATIVE_COL = 1) then Include(AFlags, rfRelCol2);
|
if (c2 and MASK_EXCEL_RELATIVE_COL <> 0) then Include(AFlags, rfRelCol2);
|
||||||
if (c2 and MASK_EXCEL_RELATIVE_ROW = 1) then Include(AFlags, rfRelRow2);
|
if (c2 and MASK_EXCEL_RELATIVE_ROW <> 0) then Include(AFlags, rfRelRow2);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsSpreadBIFF8Reader.ReadSST(const AStream: TStream);
|
procedure TsSpreadBIFF8Reader.ReadSST(const AStream: TStream);
|
||||||
|
@ -79,6 +79,7 @@ const
|
|||||||
INT_EXCEL_TOKEN_TUPLUS = $12; // Unary plus +
|
INT_EXCEL_TOKEN_TUPLUS = $12; // Unary plus +
|
||||||
INT_EXCEL_TOKEN_TUMINUS = $13; // Unary minus +
|
INT_EXCEL_TOKEN_TUMINUS = $13; // Unary minus +
|
||||||
INT_EXCEL_TOKEN_TPERCENT= $14; // Percent (%, divides operand by 100)
|
INT_EXCEL_TOKEN_TPERCENT= $14; // Percent (%, divides operand by 100)
|
||||||
|
INT_EXCEL_TOKEN_TPAREN = $15; // Operator in parenthesis
|
||||||
|
|
||||||
{ Constant Operand Tokens, 3.8}
|
{ Constant Operand Tokens, 3.8}
|
||||||
INT_EXCEL_TOKEN_TMISSARG= $16; //missing operand
|
INT_EXCEL_TOKEN_TMISSARG= $16; //missing operand
|
||||||
@ -515,6 +516,7 @@ const
|
|||||||
(0, INT_EXCEL_TOKEN_TBOOL), {fekBool}
|
(0, INT_EXCEL_TOKEN_TBOOL), {fekBool}
|
||||||
(0, INT_EXCEL_TOKEN_TERR), {fekErr}
|
(0, INT_EXCEL_TOKEN_TERR), {fekErr}
|
||||||
(0, INT_EXCEL_TOKEN_TMISSARG), {fekMissArg, missing argument}
|
(0, INT_EXCEL_TOKEN_TMISSARG), {fekMissArg, missing argument}
|
||||||
|
(0, INT_EXCEL_TOKEN_TPAREN), {Operator in parenthesis}
|
||||||
|
|
||||||
// Basic operations
|
// Basic operations
|
||||||
(0, INT_EXCEL_TOKEN_TADD), {fekAdd, +}
|
(0, INT_EXCEL_TOKEN_TADD), {fekAdd, +}
|
||||||
@ -1373,8 +1375,8 @@ begin
|
|||||||
ARow := r and MASK_EXCEL_ROW;
|
ARow := r and MASK_EXCEL_ROW;
|
||||||
// Extract absolute/relative flags
|
// Extract absolute/relative flags
|
||||||
AFlags := [];
|
AFlags := [];
|
||||||
if (r and MASK_EXCEL_RELATIVE_COL = 1) then Include(AFlags, rfRelCol);
|
if (r and MASK_EXCEL_RELATIVE_COL <> 0) then Include(AFlags, rfRelCol);
|
||||||
if (r and MASK_EXCEL_RELATIVE_ROW = 1) then Include(AFlags, rfRelRow);
|
if (r and MASK_EXCEL_RELATIVE_ROW <> 0) then Include(AFlags, rfRelRow);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ Reads the cell address used in an RPN formula element. Evaluates the corresponding
|
{ Reads the cell address used in an RPN formula element. Evaluates the corresponding
|
||||||
@ -1396,10 +1398,10 @@ begin
|
|||||||
ARow2 := r2 and MASK_EXCEL_ROW;
|
ARow2 := r2 and MASK_EXCEL_ROW;
|
||||||
// Extract absolute/relative flags
|
// Extract absolute/relative flags
|
||||||
AFlags := [];
|
AFlags := [];
|
||||||
if (r1 and MASK_EXCEL_RELATIVE_COL = 1) then Include(AFlags, rfRelCol);
|
if (r1 and MASK_EXCEL_RELATIVE_COL <> 0) then Include(AFlags, rfRelCol);
|
||||||
if (r2 and MASK_EXCEL_RELATIVE_COL = 1) then Include(AFlags, rfRelCol2);
|
if (r2 and MASK_EXCEL_RELATIVE_COL <> 0) then Include(AFlags, rfRelCol2);
|
||||||
if (r1 and MASK_EXCEL_RELATIVE_ROW = 1) then Include(AFlags, rfRelRow);
|
if (r1 and MASK_EXCEL_RELATIVE_ROW <> 0) then Include(AFlags, rfRelRow);
|
||||||
if (r2 and MASK_EXCEL_RELATIVE_ROW = 1) then Include(AFlags, rfRelRow2);
|
if (r2 and MASK_EXCEL_RELATIVE_ROW <> 0) then Include(AFlags, rfRelRow2);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ Reads the identifier for an RPN function with fixed argument count.
|
{ Reads the identifier for an RPN function with fixed argument count.
|
||||||
@ -1463,6 +1465,8 @@ begin
|
|||||||
AStream.ReadBuffer(dblVal, 8);
|
AStream.ReadBuffer(dblVal, 8);
|
||||||
rpnItem := RPNNumber(dblVal, rpnItem);
|
rpnItem := RPNNumber(dblVal, rpnItem);
|
||||||
end;
|
end;
|
||||||
|
INT_EXCEL_TOKEN_TPAREN:
|
||||||
|
rpnItem := RPNParenthesis(rpnItem);
|
||||||
|
|
||||||
INT_EXCEL_TOKEN_FUNC_R,
|
INT_EXCEL_TOKEN_FUNC_R,
|
||||||
INT_EXCEL_TOKEN_FUNC_V,
|
INT_EXCEL_TOKEN_FUNC_V,
|
||||||
@ -1510,42 +1514,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
if not found then
|
if not found then
|
||||||
supported := false;
|
supported := false;
|
||||||
(*
|
|
||||||
// binary tokens
|
|
||||||
INT_EXCEL_TOKEN_TADD:
|
|
||||||
rpnItem := RPNFunc(fekAdd, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TSUB:
|
|
||||||
rpnItem := RPNFunc(fekSub, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TMUL:
|
|
||||||
rpnItem := RPNFunc(fekMul, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TDIV:
|
|
||||||
rpnItem := RPNFunc(fekDiv, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TPOWER:
|
|
||||||
rpnItem := RPNFunc(fekPower, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TCONCAT:
|
|
||||||
rpnItem := RPNFunc(fekConcat, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TLT:
|
|
||||||
rpnItem := RPNFunc(fekLess, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TLE:
|
|
||||||
rpnItem := RPNFunc(fekLessEqual, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TEQ:
|
|
||||||
rpnItem := RPNFunc(fekEqual, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TGE:
|
|
||||||
rpnItem := RPNFunc(fekGreaterEqual, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TGT:
|
|
||||||
rpnItem := RPNFunc(fekGreater, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TNE:
|
|
||||||
rpnItem := RPNFunc(fekNotEqual, rpnItem);
|
|
||||||
// Unary operations
|
|
||||||
INT_EXCEL_TOKEN_TUPLUS:
|
|
||||||
rpnItem := RPNFunc(fekUPlus, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TUMINUS:
|
|
||||||
rpnItem := RPNFunc(fekUMinus, rpnItem);
|
|
||||||
INT_EXCEL_TOKEN_TPERCENT:
|
|
||||||
rpnItem := RPNFunc(fekPercent, rpnItem);
|
|
||||||
// Operands (--> 3.8)
|
|
||||||
else
|
|
||||||
supported := false; *)
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
if not supported then begin
|
if not supported then begin
|
||||||
|
Reference in New Issue
Block a user