You seem to have some localized date format which I do not understand: Does HHHH-YY-DD mean the same as YYYY-MM-DD in English? (i.e. 4-digit-year, 2-digit month, 2-digit day)? And you want to display the date/time in this format, with a "minus" as separator?
In this case, I would write the date format string as "yyyy-mm-dd". Alternatively you can use "yyyy/mm/dd", but then you must define the DateSeparator in the workbook's FormatSettings as '-' (because the '/' is replaced by the DateSeparator); the other FormatSettings you mentioned are not needed. So:
worksheet.WriteDateTimeFormat(FDateTemplateCell, nfCustom, 'yyyy-mm-dd');
This should return today's date as "2017-07-08".
The phone number is more difficult because I never though that somebody would ever want to format numbers this way. But of course, this is a valid request. My tests showed me that a format string like "000 000" prints the number twice, separated by a space. This is because "000" is interpreted to display the number with
at least 3 digits. An alternative interpretation of assigning each digit of the number to a 0 of the format mask is not in the format parser.
What you could do is to write the phone number as a string. Calling field.AsString will get you the database value of the phone number as a correctly formatted string, and this will be written directly to the worksheet as a text cell without any special formatting needed.
procedure TForm1.WriteCellDataHandler(Sender: TsWorksheet; ARow, ACol: Cardinal;
var AValue: variant; var AStyleCell: PCell);
var
field: TField;
begin
field := FExportDataset.FieldByName('phone');
...
AValue := field.AsString;
...
end;