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
object FormulaToolBar: TToolBar
Left = 0
Height = 26
Height = 28
Top = 53
Width = 884
Caption = 'FormulaToolBar'
Constraints.MinHeight = 26
TabOrder = 2
object EdFormula: TEdit
Left = 129
Height = 24
object FormulaToolbarSplitter: TSplitter
Left = 171
Height = 26
Top = 2
Width = 755
Align = alClient
OnEditingDone = EdFormulaEditingDone
TabOrder = 1
Width = 5
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
Height = 24
Top = 2
Width = 123
Width = 170
Align = alLeft
Alignment = taCenter
OnEditingDone = EdCellAddressEditingDone
TabOrder = 0
end
object FormulaToolbarSplitter: TSplitter
Left = 124
Height = 24
Top = 2
Width = 5
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
OnEditingDone = EdCellAddressEditingDone
TabOrder = 0
end
end
end
object InspectorSplitter: TSplitter
Left = 648
Height = 453
Top = 79
Height = 446
Top = 86
Width = 5
Align = alRight
ResizeAnchor = akRight
end
object InspectorPageControl: TPageControl
Left = 653
Height = 453
Top = 79
Height = 446
Top = 86
Width = 231
ActivePage = PgCellValue
Align = alRight
@ -410,11 +424,11 @@ object MainFrm: TMainFrm
OnChange = InspectorPageControlChange
object PgCellValue: TTabSheet
Caption = 'Cell value'
ClientHeight = 420
ClientHeight = 413
ClientWidth = 223
object CellInspector: TValueListEditor
Left = 0
Height = 420
Height = 413
Top = 0
Width = 223
Align = alClient
@ -458,15 +472,15 @@ object MainFrm: TMainFrm
end
object TabControl: TTabControl
Left = 0
Height = 453
Top = 79
Height = 446
Top = 86
Width = 648
OnChange = TabControlChange
Align = alClient
TabOrder = 3
object WorksheetGrid: TsWorksheetGrid
Left = 2
Height = 448
Height = 441
Top = 3
Width = 644
FrozenCols = 0
@ -514,6 +528,15 @@ object MainFrm: TMainFrm
)
end
end
object Splitter1: TSplitter
Cursor = crVSplit
Left = 0
Height = 5
Top = 81
Width = 884
Align = alTop
ResizeAnchor = akTop
end
object OpenDialog: TOpenDialog
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 (*.*)|*.*'

View File

@ -89,7 +89,6 @@ type
CbHeaderStyle: TComboBox;
CbAutoCalcFormulas: TCheckBox;
CbTextOverflow: TCheckBox;
EdFormula: TEdit;
EdCellAddress: TEdit;
FontComboBox: TComboBox;
EdFrozenRows: TSpinEdit;
@ -99,6 +98,7 @@ type
Label1: TLabel;
Label2: TLabel;
MainMenu: TMainMenu;
FormulaMemo: TMemo;
MenuItem1: TMenuItem;
MenuItem10: TMenuItem;
MenuItem11: TMenuItem;
@ -215,6 +215,7 @@ type
Panel1: TPanel;
BordersPopupMenu: TPopupMenu;
NumFormatPopupMenu: TPopupMenu;
AddressPanel: TPanel;
SaveDialog: TSaveDialog;
EdFrozenCols: TSpinEdit;
FormulaToolBar: TToolBar;
@ -222,6 +223,7 @@ type
InspectorSplitter: TSplitter;
PgCellValue: TTabSheet;
PgProperties: TTabSheet;
Splitter1: TSplitter;
TabControl: TTabControl;
PgSheet: TTabSheet;
ToolButton22: TToolButton;
@ -291,7 +293,6 @@ type
procedure CbBackgroundColorGetColors(Sender: TCustomColorBox; Items: TStrings);
procedure CbTextOverflowChange(Sender: TObject);
procedure EdCellAddressEditingDone(Sender: TObject);
procedure EdFormulaEditingDone(Sender: TObject);
procedure EdFrozenColsChange(Sender: TObject);
procedure EdFrozenRowsChange(Sender: TObject);
procedure FontComboBoxSelect(Sender: TObject);
@ -299,6 +300,7 @@ type
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure InspectorPageControlChange(Sender: TObject);
procedure MemoFormulaEditingDone(Sender: TObject);
procedure TabControlChange(Sender: TObject);
procedure WorksheetGridHeaderClick(Sender: TObject; IsColumn: Boolean;
Index: Integer);
@ -793,20 +795,6 @@ begin
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);
begin
WorksheetGrid.FrozenCols := EdFrozenCols.Value;
@ -931,6 +919,20 @@ begin
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;
begin
// This change triggers re-reading of the workbooks palette by the OnGetColors
@ -1244,24 +1246,26 @@ begin
s := WorksheetGrid.Worksheet.ReadFormulaAsString(cell, true);
if s <> '' then begin
if s[1] <> '=' then s := '=' + s;
EdFormula.Text := s;
end
else
FormulaMemo.Lines.Text := s;
end else
begin
case cell^.ContentType of
cctNumber:
EdFormula.Text := FloatToStr(cell^.NumberValue);
s := FloatToStr(cell^.NumberValue);
cctDateTime:
if cell^.DateTimeValue < 1.0 then
EdFormula.Text := FormatDateTime('tt', cell^.DateTimeValue)
s := FormatDateTime('tt', cell^.DateTimeValue)
else
EdFormula.Text := FormatDateTime('c', cell^.DateTimeValue);
s := FormatDateTime('c', cell^.DateTimeValue);
cctUTF8String:
EdFormula.Text := cell^.UTF8StringValue;
s := cell^.UTF8StringValue;
else
EdFormula.Text := WorksheetGrid.Worksheet.ReadAsUTF8Text(cell);
s := WorksheetGrid.Worksheet.ReadAsUTF8Text(cell);
end;
FormulaMemo.Lines.Text := s;
end;
end else
EdFormula.Text := '';
FormulaMemo.Text := '';
EdCellAddress.Text := GetCellString(r, c, [rfRelRow, rfRelCol]);
AcMergeCells.Checked := WorksheetGrid.Worksheet.IsMerged(cell);

View File

@ -263,6 +263,16 @@ begin
c := 0;
while AStream.Position < n do begin
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
// End of column reached
ReadCellValue(r, c, cellValue);