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:
wp_xxyyzz 2014-10-14 12:06:11 +00:00
parent 75fea05685
commit 1262d95889
3 changed files with 90 additions and 53 deletions

View File

@ -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 (*.*)|*.*'

View File

@ -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);

View File

@ -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);