Add preference option to use locale number format for CSV+XML+HTML exports. Mainly to work around an Excel bug, which expects float values to be formatted with locale decimal separator when pasting. Fixes issue #1459.

This commit is contained in:
Ansgar Becker
2009-12-08 09:14:42 +00:00
parent bd4dd71797
commit 0e29eda7ac
5 changed files with 30 additions and 6 deletions

View File

@ -140,6 +140,8 @@ const
REGNAME_CSV_TERMINATOR = 'CSVTerminator';
DEFAULT_CSV_TERMINATOR = '\r\n';
REGNAME_CSV_ESCAPER = 'CSVImportFieldEscaperV2';
REGNAME_EXPORT_LOCALENUMBERS = 'ExportLocaleNumberFormats';
DEFAULT_EXPORT_LOCALENUMBERS = False;
REGNAME_CSV_FILENAME = 'loadfilename';
REGNAME_CSV_ENCLOPTION = 'CSVImportFieldsEnclosedOptionallyV2';
REGNAME_CSV_IGNORELINES = 'CSVImportIgnoreLines';

View File

@ -902,6 +902,9 @@ begin
Data := Grid.Text[Node, i];
// Handle nulls.
if GridData.Rows[Node.Index].Cells[i].IsNull then Data := TEXT_NULL;
// Unformat numeric values
if (GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal]) and (not Mainform.prefExportLocaleNumbers) then
Data := UnformatNumber(Data);
// Escape HTML control characters in data.
Data := htmlentities(Data);
tmp := tmp + ' <td class="col' + IntToStr(i) + '">' + Data + '</td>' + CRLF;
@ -997,8 +1000,9 @@ begin
Data := Grid.Text[Node, i];
// Remove 0x.
if GridData.Columns[i].DatatypeCat = dtcBinary then Delete(Data, 1, 2);
// Unformat float values
if GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal] then Data := UnformatNumber(Data);
// Unformat numeric values
if (GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal]) and (not Mainform.prefExportLocaleNumbers) then
Data := UnformatNumber(Data);
// Escape encloser characters inside data per de-facto CSV.
Data := WideStringReplace(Data, Encloser, Encloser + Encloser, [rfReplaceAll]);
// Special handling for NULL (MySQL-ism, not de-facto CSV: unquote value)
@ -1075,8 +1079,9 @@ begin
Data := Grid.Text[Node, i];
// Remove 0x.
if GridData.Columns[i].DatatypeCat = dtcBinary then Delete(Data, 1, 2);
// Unformat float values
if GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal] then Data := UnformatNumber(Data);
// Unformat numeric values
if (GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal]) and (not Mainform.prefExportLocaleNumbers) then
Data := UnformatNumber(Data);
// Escape XML control characters in data.
Data := htmlentities(Data);
// Add data and cell end tag.
@ -1153,7 +1158,7 @@ begin
Data := Grid.Text[Node, i];
// Remove 0x.
if GridData.Columns[i].DatatypeCat = dtcBinary then Delete(Data, 1, 2);
// Unformat float values
// Unformat numeric values
if GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal] then Data := UnformatNumber(Data);
// Add data and cell end tag.
tmp := tmp + esc(Data);

View File

@ -778,7 +778,8 @@ type
prefEnableDatetimeEditor,
prefEnableEnumEditor,
prefEnableSetEditor,
prefEnableNullBG : Boolean;
prefEnableNullBG,
prefExportLocaleNumbers : Boolean;
prefNullColorDefault,
prefNullBG : TColor;
CreateDatabaseForm : TCreateDatabaseForm;
@ -1225,6 +1226,7 @@ begin
prefCSVSeparator := GetRegValue(REGNAME_CSV_SEPARATOR, DEFAULT_CSV_SEPARATOR);
prefCSVEncloser := GetRegValue(REGNAME_CSV_ENCLOSER, DEFAULT_CSV_ENCLOSER);
prefCSVTerminator := GetRegValue(REGNAME_CSV_TERMINATOR, DEFAULT_CSV_TERMINATOR);
prefExportLocaleNumbers := GetRegValue(REGNAME_EXPORT_LOCALENUMBERS, DEFAULT_EXPORT_LOCALENUMBERS);
prefRememberFilters := GetRegValue(REGNAME_REMEMBERFILTERS, DEFAULT_REMEMBERFILTERS);
// Data-Font:

View File

@ -785,6 +785,17 @@ object optionsform: Toptionsform
Wrap = True
OnChanging = anyUpDownLimitChanging
end
object chkExportLocaleNumbers: TCheckBox
Left = 8
Top = 232
Width = 385
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption =
'Use locale number format in grid exports (MS Excel paste compati' +
'bility)'
TabOrder = 3
end
end
object tabShortcuts: TTabSheet
Caption = 'Shortcuts'

View File

@ -118,6 +118,7 @@ type
grpSQLTabWidth: TGroupBox;
editSQLTabWidth: TEdit;
updownSQLTabWidth: TUpDown;
chkExportLocaleNumbers: TCheckBox;
procedure FormShow(Sender: TObject);
procedure Modified(Sender: TObject);
procedure Apply(Sender: TObject);
@ -222,6 +223,7 @@ begin
MainReg.WriteString(REGNAME_CSV_ENCLOSER, editCSVEncloser.Text);
MainReg.WriteString(REGNAME_CSV_TERMINATOR, editCSVTerminator.Text);
MainReg.WriteInteger(REGNAME_COPYMAXSIZE, updownCopyDataMaxSize.Position);
MainReg.WriteBool(REGNAME_EXPORT_LOCALENUMBERS, chkExportLocaleNumbers.Checked);
MainReg.WriteInteger(REGNAME_MAXCOLWIDTH, updownMaxColWidth.Position);
maxrows := StrToIntDef(editMaxTotalRows.Text, DEFAULT_MAXTOTALROWS);
@ -297,6 +299,7 @@ begin
Mainform.prefCSVSeparator := editCSVSeparator.Text;
Mainform.prefCSVEncloser := editCSVEncloser.Text;
Mainform.prefCSVTerminator := editCSVTerminator.Text;
Mainform.prefExportLocaleNumbers := chkExportLocaleNumbers.Checked;
DatatypeCategories[Integer(dtcInteger)].Color := cboxNumeric.Selected;
DatatypeCategories[Integer(dtcReal)].Color := cboxNumeric.Selected;
DatatypeCategories[Integer(dtcText)].Color := cboxText.Selected;
@ -385,6 +388,7 @@ begin
editCSVEncloser.Text := GetRegValue(REGNAME_CSV_ENCLOSER, DEFAULT_CSV_ENCLOSER);
editCSVTerminator.Text := GetRegValue(REGNAME_CSV_TERMINATOR, DEFAULT_CSV_TERMINATOR);
updownCopyDataMaxSize.Position := GetRegValue(REGNAME_COPYMAXSIZE, DEFAULT_COPYMAXSIZE);
chkExportLocaleNumbers.Checked := GetRegValue(REGNAME_EXPORT_LOCALENUMBERS, DEFAULT_EXPORT_LOCALENUMBERS);
// Log to file
chkLogToFile.Checked := GetRegValue(REGNAME_LOGTOFILE, DEFAULT_LOGTOFILE);