fpspreadsheet: Extend CSV reader to allow multi-line quoted text cells. Modify TsWorksheetGrid to display multi-line text in formulabar.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3654 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
75fea05685
commit
1262d95889
@ -359,49 +359,63 @@ object MainFrm: TMainFrm
|
|||||||
end
|
end
|
||||||
object FormulaToolBar: TToolBar
|
object FormulaToolBar: TToolBar
|
||||||
Left = 0
|
Left = 0
|
||||||
Height = 26
|
Height = 28
|
||||||
Top = 53
|
Top = 53
|
||||||
Width = 884
|
Width = 884
|
||||||
Caption = 'FormulaToolBar'
|
Caption = 'FormulaToolBar'
|
||||||
|
Constraints.MinHeight = 26
|
||||||
TabOrder = 2
|
TabOrder = 2
|
||||||
object EdFormula: TEdit
|
object FormulaToolbarSplitter: TSplitter
|
||||||
Left = 129
|
Left = 171
|
||||||
Height = 24
|
Height = 26
|
||||||
Top = 2
|
Top = 2
|
||||||
Width = 755
|
Width = 5
|
||||||
Align = alClient
|
|
||||||
OnEditingDone = EdFormulaEditingDone
|
|
||||||
TabOrder = 1
|
|
||||||
end
|
end
|
||||||
object EdCellAddress: TEdit
|
object FormulaMemo: TMemo
|
||||||
|
Left = 176
|
||||||
|
Height = 26
|
||||||
|
Top = 2
|
||||||
|
Width = 708
|
||||||
|
Align = alClient
|
||||||
|
OnEditingDone = MemoFormulaEditingDone
|
||||||
|
TabOrder = 1
|
||||||
|
WantReturns = False
|
||||||
|
end
|
||||||
|
object AddressPanel: TPanel
|
||||||
Left = 1
|
Left = 1
|
||||||
Height = 24
|
Height = 24
|
||||||
Top = 2
|
Top = 2
|
||||||
Width = 123
|
Width = 170
|
||||||
Align = alLeft
|
Align = alLeft
|
||||||
|
BorderSpacing.Bottom = 2
|
||||||
|
BevelOuter = bvNone
|
||||||
|
ClientHeight = 24
|
||||||
|
ClientWidth = 170
|
||||||
|
TabOrder = 2
|
||||||
|
object EdCellAddress: TEdit
|
||||||
|
Left = 0
|
||||||
|
Height = 28
|
||||||
|
Top = 0
|
||||||
|
Width = 170
|
||||||
|
Align = alTop
|
||||||
Alignment = taCenter
|
Alignment = taCenter
|
||||||
OnEditingDone = EdCellAddressEditingDone
|
OnEditingDone = EdCellAddressEditingDone
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
end
|
end
|
||||||
object FormulaToolbarSplitter: TSplitter
|
|
||||||
Left = 124
|
|
||||||
Height = 24
|
|
||||||
Top = 2
|
|
||||||
Width = 5
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
object InspectorSplitter: TSplitter
|
object InspectorSplitter: TSplitter
|
||||||
Left = 648
|
Left = 648
|
||||||
Height = 453
|
Height = 446
|
||||||
Top = 79
|
Top = 86
|
||||||
Width = 5
|
Width = 5
|
||||||
Align = alRight
|
Align = alRight
|
||||||
ResizeAnchor = akRight
|
ResizeAnchor = akRight
|
||||||
end
|
end
|
||||||
object InspectorPageControl: TPageControl
|
object InspectorPageControl: TPageControl
|
||||||
Left = 653
|
Left = 653
|
||||||
Height = 453
|
Height = 446
|
||||||
Top = 79
|
Top = 86
|
||||||
Width = 231
|
Width = 231
|
||||||
ActivePage = PgCellValue
|
ActivePage = PgCellValue
|
||||||
Align = alRight
|
Align = alRight
|
||||||
@ -410,11 +424,11 @@ object MainFrm: TMainFrm
|
|||||||
OnChange = InspectorPageControlChange
|
OnChange = InspectorPageControlChange
|
||||||
object PgCellValue: TTabSheet
|
object PgCellValue: TTabSheet
|
||||||
Caption = 'Cell value'
|
Caption = 'Cell value'
|
||||||
ClientHeight = 420
|
ClientHeight = 413
|
||||||
ClientWidth = 223
|
ClientWidth = 223
|
||||||
object CellInspector: TValueListEditor
|
object CellInspector: TValueListEditor
|
||||||
Left = 0
|
Left = 0
|
||||||
Height = 420
|
Height = 413
|
||||||
Top = 0
|
Top = 0
|
||||||
Width = 223
|
Width = 223
|
||||||
Align = alClient
|
Align = alClient
|
||||||
@ -458,15 +472,15 @@ object MainFrm: TMainFrm
|
|||||||
end
|
end
|
||||||
object TabControl: TTabControl
|
object TabControl: TTabControl
|
||||||
Left = 0
|
Left = 0
|
||||||
Height = 453
|
Height = 446
|
||||||
Top = 79
|
Top = 86
|
||||||
Width = 648
|
Width = 648
|
||||||
OnChange = TabControlChange
|
OnChange = TabControlChange
|
||||||
Align = alClient
|
Align = alClient
|
||||||
TabOrder = 3
|
TabOrder = 3
|
||||||
object WorksheetGrid: TsWorksheetGrid
|
object WorksheetGrid: TsWorksheetGrid
|
||||||
Left = 2
|
Left = 2
|
||||||
Height = 448
|
Height = 441
|
||||||
Top = 3
|
Top = 3
|
||||||
Width = 644
|
Width = 644
|
||||||
FrozenCols = 0
|
FrozenCols = 0
|
||||||
@ -514,6 +528,15 @@ object MainFrm: TMainFrm
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
object Splitter1: TSplitter
|
||||||
|
Cursor = crVSplit
|
||||||
|
Left = 0
|
||||||
|
Height = 5
|
||||||
|
Top = 81
|
||||||
|
Width = 884
|
||||||
|
Align = alTop
|
||||||
|
ResizeAnchor = akTop
|
||||||
|
end
|
||||||
object OpenDialog: TOpenDialog
|
object OpenDialog: TOpenDialog
|
||||||
DefaultExt = '.xls'
|
DefaultExt = '.xls'
|
||||||
Filter = 'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlsx|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|Comma-delimited files (*.csv)|*.csv|Wikitable (pipes) (.wikitable_pipes)|*.wikitable_pipes|All files (*.*)|*.*'
|
Filter = 'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlsx|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|Comma-delimited files (*.csv)|*.csv|Wikitable (pipes) (.wikitable_pipes)|*.wikitable_pipes|All files (*.*)|*.*'
|
||||||
|
@ -89,7 +89,6 @@ type
|
|||||||
CbHeaderStyle: TComboBox;
|
CbHeaderStyle: TComboBox;
|
||||||
CbAutoCalcFormulas: TCheckBox;
|
CbAutoCalcFormulas: TCheckBox;
|
||||||
CbTextOverflow: TCheckBox;
|
CbTextOverflow: TCheckBox;
|
||||||
EdFormula: TEdit;
|
|
||||||
EdCellAddress: TEdit;
|
EdCellAddress: TEdit;
|
||||||
FontComboBox: TComboBox;
|
FontComboBox: TComboBox;
|
||||||
EdFrozenRows: TSpinEdit;
|
EdFrozenRows: TSpinEdit;
|
||||||
@ -99,6 +98,7 @@ type
|
|||||||
Label1: TLabel;
|
Label1: TLabel;
|
||||||
Label2: TLabel;
|
Label2: TLabel;
|
||||||
MainMenu: TMainMenu;
|
MainMenu: TMainMenu;
|
||||||
|
FormulaMemo: TMemo;
|
||||||
MenuItem1: TMenuItem;
|
MenuItem1: TMenuItem;
|
||||||
MenuItem10: TMenuItem;
|
MenuItem10: TMenuItem;
|
||||||
MenuItem11: TMenuItem;
|
MenuItem11: TMenuItem;
|
||||||
@ -215,6 +215,7 @@ type
|
|||||||
Panel1: TPanel;
|
Panel1: TPanel;
|
||||||
BordersPopupMenu: TPopupMenu;
|
BordersPopupMenu: TPopupMenu;
|
||||||
NumFormatPopupMenu: TPopupMenu;
|
NumFormatPopupMenu: TPopupMenu;
|
||||||
|
AddressPanel: TPanel;
|
||||||
SaveDialog: TSaveDialog;
|
SaveDialog: TSaveDialog;
|
||||||
EdFrozenCols: TSpinEdit;
|
EdFrozenCols: TSpinEdit;
|
||||||
FormulaToolBar: TToolBar;
|
FormulaToolBar: TToolBar;
|
||||||
@ -222,6 +223,7 @@ type
|
|||||||
InspectorSplitter: TSplitter;
|
InspectorSplitter: TSplitter;
|
||||||
PgCellValue: TTabSheet;
|
PgCellValue: TTabSheet;
|
||||||
PgProperties: TTabSheet;
|
PgProperties: TTabSheet;
|
||||||
|
Splitter1: TSplitter;
|
||||||
TabControl: TTabControl;
|
TabControl: TTabControl;
|
||||||
PgSheet: TTabSheet;
|
PgSheet: TTabSheet;
|
||||||
ToolButton22: TToolButton;
|
ToolButton22: TToolButton;
|
||||||
@ -291,7 +293,6 @@ type
|
|||||||
procedure CbBackgroundColorGetColors(Sender: TCustomColorBox; Items: TStrings);
|
procedure CbBackgroundColorGetColors(Sender: TCustomColorBox; Items: TStrings);
|
||||||
procedure CbTextOverflowChange(Sender: TObject);
|
procedure CbTextOverflowChange(Sender: TObject);
|
||||||
procedure EdCellAddressEditingDone(Sender: TObject);
|
procedure EdCellAddressEditingDone(Sender: TObject);
|
||||||
procedure EdFormulaEditingDone(Sender: TObject);
|
|
||||||
procedure EdFrozenColsChange(Sender: TObject);
|
procedure EdFrozenColsChange(Sender: TObject);
|
||||||
procedure EdFrozenRowsChange(Sender: TObject);
|
procedure EdFrozenRowsChange(Sender: TObject);
|
||||||
procedure FontComboBoxSelect(Sender: TObject);
|
procedure FontComboBoxSelect(Sender: TObject);
|
||||||
@ -299,6 +300,7 @@ type
|
|||||||
procedure FormActivate(Sender: TObject);
|
procedure FormActivate(Sender: TObject);
|
||||||
procedure FormCreate(Sender: TObject);
|
procedure FormCreate(Sender: TObject);
|
||||||
procedure InspectorPageControlChange(Sender: TObject);
|
procedure InspectorPageControlChange(Sender: TObject);
|
||||||
|
procedure MemoFormulaEditingDone(Sender: TObject);
|
||||||
procedure TabControlChange(Sender: TObject);
|
procedure TabControlChange(Sender: TObject);
|
||||||
procedure WorksheetGridHeaderClick(Sender: TObject; IsColumn: Boolean;
|
procedure WorksheetGridHeaderClick(Sender: TObject; IsColumn: Boolean;
|
||||||
Index: Integer);
|
Index: Integer);
|
||||||
@ -793,20 +795,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainFrm.EdFormulaEditingDone(Sender: TObject);
|
|
||||||
var
|
|
||||||
r, c: Cardinal;
|
|
||||||
s: String;
|
|
||||||
begin
|
|
||||||
r := WorksheetGrid.GetWorksheetRow(WorksheetGrid.Row);
|
|
||||||
c := WorksheetGrid.GetWorksheetCol(WorksheetGrid.Col);
|
|
||||||
s := EdFormula.Text;
|
|
||||||
if (s <> '') and (s[1] = '=') then
|
|
||||||
WorksheetGrid.Worksheet.WriteFormula(r, c, Copy(s, 2, Length(s)), true)
|
|
||||||
else
|
|
||||||
WorksheetGrid.Worksheet.WriteCellValueAsString(r, c, EdFormula.Text);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TMainFrm.EdFrozenColsChange(Sender: TObject);
|
procedure TMainFrm.EdFrozenColsChange(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
WorksheetGrid.FrozenCols := EdFrozenCols.Value;
|
WorksheetGrid.FrozenCols := EdFrozenCols.Value;
|
||||||
@ -931,6 +919,20 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TMainFrm.MemoFormulaEditingDone(Sender: TObject);
|
||||||
|
var
|
||||||
|
r, c: Cardinal;
|
||||||
|
s: String;
|
||||||
|
begin
|
||||||
|
r := WorksheetGrid.GetWorksheetRow(WorksheetGrid.Row);
|
||||||
|
c := WorksheetGrid.GetWorksheetCol(WorksheetGrid.Col);
|
||||||
|
s := FormulaMemo.Lines.Text;
|
||||||
|
if (s <> '') and (s[1] = '=') then
|
||||||
|
WorksheetGrid.Worksheet.WriteFormula(r, c, Copy(s, 2, Length(s)), true)
|
||||||
|
else
|
||||||
|
WorksheetGrid.Worksheet.WriteCellValueAsString(r, c, s);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TMainFrm.SetupBackgroundColorBox;
|
procedure TMainFrm.SetupBackgroundColorBox;
|
||||||
begin
|
begin
|
||||||
// This change triggers re-reading of the workbooks palette by the OnGetColors
|
// This change triggers re-reading of the workbooks palette by the OnGetColors
|
||||||
@ -1244,24 +1246,26 @@ begin
|
|||||||
s := WorksheetGrid.Worksheet.ReadFormulaAsString(cell, true);
|
s := WorksheetGrid.Worksheet.ReadFormulaAsString(cell, true);
|
||||||
if s <> '' then begin
|
if s <> '' then begin
|
||||||
if s[1] <> '=' then s := '=' + s;
|
if s[1] <> '=' then s := '=' + s;
|
||||||
EdFormula.Text := s;
|
FormulaMemo.Lines.Text := s;
|
||||||
end
|
end else
|
||||||
else
|
begin
|
||||||
case cell^.ContentType of
|
case cell^.ContentType of
|
||||||
cctNumber:
|
cctNumber:
|
||||||
EdFormula.Text := FloatToStr(cell^.NumberValue);
|
s := FloatToStr(cell^.NumberValue);
|
||||||
cctDateTime:
|
cctDateTime:
|
||||||
if cell^.DateTimeValue < 1.0 then
|
if cell^.DateTimeValue < 1.0 then
|
||||||
EdFormula.Text := FormatDateTime('tt', cell^.DateTimeValue)
|
s := FormatDateTime('tt', cell^.DateTimeValue)
|
||||||
else
|
else
|
||||||
EdFormula.Text := FormatDateTime('c', cell^.DateTimeValue);
|
s := FormatDateTime('c', cell^.DateTimeValue);
|
||||||
cctUTF8String:
|
cctUTF8String:
|
||||||
EdFormula.Text := cell^.UTF8StringValue;
|
s := cell^.UTF8StringValue;
|
||||||
else
|
else
|
||||||
EdFormula.Text := WorksheetGrid.Worksheet.ReadAsUTF8Text(cell);
|
s := WorksheetGrid.Worksheet.ReadAsUTF8Text(cell);
|
||||||
|
end;
|
||||||
|
FormulaMemo.Lines.Text := s;
|
||||||
end;
|
end;
|
||||||
end else
|
end else
|
||||||
EdFormula.Text := '';
|
FormulaMemo.Text := '';
|
||||||
|
|
||||||
EdCellAddress.Text := GetCellString(r, c, [rfRelRow, rfRelCol]);
|
EdCellAddress.Text := GetCellString(r, c, [rfRelRow, rfRelCol]);
|
||||||
AcMergeCells.Checked := WorksheetGrid.Worksheet.IsMerged(cell);
|
AcMergeCells.Checked := WorksheetGrid.Worksheet.IsMerged(cell);
|
||||||
|
@ -263,6 +263,16 @@ begin
|
|||||||
c := 0;
|
c := 0;
|
||||||
while AStream.Position < n do begin
|
while AStream.Position < n do begin
|
||||||
ch := char(AStream.ReadByte);
|
ch := char(AStream.ReadByte);
|
||||||
|
if (CSVParams.QuoteChar <> #0) and (ch = CSVParams.QuoteChar) then
|
||||||
|
begin
|
||||||
|
// Begin of quoted string --> read until next quote; this allows line breaks
|
||||||
|
// and column separators in quoted string!
|
||||||
|
cellValue := cellValue + ch;
|
||||||
|
repeat
|
||||||
|
ch := char(AStream.ReadByte);
|
||||||
|
cellValue := cellValue + ch;
|
||||||
|
until (AStream.Position = n) or (ch = CSVParams.QuoteChar);
|
||||||
|
end else
|
||||||
if ch = CSVParams.Delimiter then begin
|
if ch = CSVParams.Delimiter then begin
|
||||||
// End of column reached
|
// End of column reached
|
||||||
ReadCellValue(r, c, cellValue);
|
ReadCellValue(r, c, cellValue);
|
||||||
|
Loading…
Reference in New Issue
Block a user