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
|
||||
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 (*.*)|*.*'
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user