diff --git a/components/fpspreadsheet/xlsxml.pas b/components/fpspreadsheet/xlsxml.pas index 41ab30340..299e05ad8 100644 --- a/components/fpspreadsheet/xlsxml.pas +++ b/components/fpspreadsheet/xlsxml.pas @@ -104,14 +104,39 @@ procedure TsSpreadExcelXMLWriter.WriteBlank(AStream: TStream; const ARow, ACol: Cardinal; ACell: PCell); var styleStr: String; + hyperlink: PsHyperlink; + hyperlinkStr: String; + comment: PsComment; + commentStr: String; begin if ACell^.FormatIndex > 0 then styleStr := Format(' ss:StyleID="s%d"', [ACell^.FormatIndex + FMT_OFFSET]) else styleStr := ''; + + hyperlink := FWorksheet.FindHyperlink(ACell); + if Assigned(hyperlink) then + hyperlinkStr := ' ss:HRef="' + hyperlink^.Target + '"' else + hyperlinkStr := ''; + + comment := FWorksheet.FindComment(ACell); + if Assigned(comment) then +// commentStr := ''+comment^.Text+'' else + commentStr := ''+comment^.Text+'' else + commentStr := ''; + + AppendToStream(AStream, Format( + ' ' + // style, hyperlink + '%s' + // Comment ... + '' + LineEnding, [ + styleStr, hyperlinkStr, + commentStr + ])); + + { AppendToStream(AStream, Format( ' ' + LineEnding, [styleStr]) - ); + ); } end; procedure TsSpreadExcelXMLWriter.WriteBool(AStream: TStream; @@ -121,6 +146,10 @@ var formulaStr: String; cctStr: String; stylestr: String; + hyperlink: PsHyperlink; + hyperlinkStr: String; + comment: PsComment; + commentStr: String; begin valueStr := StrUtils.IfThen(AValue, '1', '0'); cctStr := 'Boolean'; @@ -134,9 +163,33 @@ begin styleStr := Format(' ss:StyleID="s%d"', [ACell^.FormatIndex + FMT_OFFSET]) else styleStr := ''; + hyperlink := FWorksheet.FindHyperlink(ACell); + if Assigned(hyperlink) then + hyperlinkStr := ' ss:HRef="' + hyperlink^.Target + '"' else + hyperlinkStr := ''; + + comment := FWorksheet.FindComment(ACell); + if Assigned(comment) then + commentStr := ''+comment^.Text+'' else + commentStr := ''; + + AppendToStream(AStream, Format( + ' ' + // style, formula, hyperlink + '' + // data type + '%s' + // value string + '' + + '%s' + // Comment ... + '' + LineEnding, [ + styleStr, formulaStr, hyperlinkStr, + cctStr, + valueStr, + commentStr + ])); + + { AppendToStream(AStream, Format( ' %s' + LineEnding, - [styleStr, formulaStr, cctStr, valueStr])); + [styleStr, formulaStr, cctStr, valueStr])); } end; procedure TsSpreadExcelXMLWriter.WriteCells(AStream: TStream; AWorksheet: TsWorksheet); @@ -207,6 +260,10 @@ var ExcelDate: TDateTime; nfp: TsNumFormatParams; fmt: PsCellFormat; + hyperlink: PsHyperlink; + hyperlinkStr: String; + comment: PsComment; + commentStr: String; begin ExcelDate := AValue; fmt := FWorkbook.GetPointerToCellFormat(ACell^.FormatIndex); @@ -230,10 +287,33 @@ begin styleStr := Format(' ss:StyleID="s%d"', [ACell^.FormatIndex + FMT_OFFSET]) else styleStr := ''; + hyperlink := FWorksheet.FindHyperlink(ACell); + if Assigned(hyperlink) then + hyperlinkStr := ' ss:HRef="' + hyperlink^.Target + '"' else + hyperlinkStr := ''; + + comment := FWorksheet.FindComment(ACell); + if Assigned(comment) then + commentStr := ''+comment^.Text+'' else + commentStr := ''; + AppendToStream(AStream, Format( + ' ' + // style, formula, hyperlink + '' + // data type + '%s' + // value string + '' + + '%s' + // Comment ... + '' + LineEnding, [ + styleStr, formulaStr, hyperlinkStr, + cctStr, + valueStr, + commentStr + ])); + + { AppendToStream(AStream, Format( ' %s' + LineEnding, [styleStr, formulaStr, cctStr, valueStr]) - ); + ); } end; procedure TsSpreadExcelXMLWriter.WriteError(AStream: TStream; @@ -243,8 +323,13 @@ var cctStr: String; formulaStr: String; styleStr: String; + hyperlink: PsHyperlink; + hyperlinkStr: String; + comment: PsComment; + commentStr: String; begin valueStr := GetErrorValueStr(AValue); + formulaStr := ''; cctStr := 'Error'; if HasFormula(ACell) then @@ -252,14 +337,41 @@ begin cctStr := GetCellContentTypeStr(ACell); formulaStr := Format(' ss:Formula="=%s"', [ACell^.FormulaValue]); end; + if ACell^.FormatIndex > 0 then styleStr := Format(' ss:StyleID="s%d"', [ACell^.FormatIndex + FMT_OFFSET]) else styleStr := ''; + hyperlink := FWorksheet.FindHyperlink(ACell); + if Assigned(hyperlink) then + hyperlinkStr := ' ss:HRef="' + hyperlink^.Target + '"' else + hyperlinkStr := ''; + + comment := FWorksheet.FindComment(ACell); + if Assigned(comment) then +// commentStr := ''+comment^.Text+'' else + commentStr := ''+comment^.Text+'' else + commentStr := ''; + + AppendToStream(AStream, Format( + ' ' + // style, formula, hyperlink + '' + // data type + '%s' + // value string + '' + + '%s' + // Comment ... + '' + LineEnding, [ + styleStr, formulaStr, hyperlinkStr, + cctStr, + valueStr, + commentStr + ])); + + { AppendToStream(AStream, Format( ' %s' + LineEnding, [styleStr, formulaStr, cctStr, valueStr]) ); + } end; procedure TsSpreadExcelXMLWriter.WriteLabel(AStream: TStream; const ARow, @@ -269,10 +381,12 @@ var cctStr: String; formulaStr: String; styleStr: String; - xmlns: String; + xmlnsStr: String; dataTagStr: String; comment: PsComment; commentStr: String; + hyperlink: PsHyperlink; + hyperlinkStr: String; begin if Length(ACell^.RichTextParams) > 0 then begin @@ -284,7 +398,7 @@ begin valueStr, // html-formatted rich text 'html:', tcProperCase ); - xmlns := ' xmlns="http://www.w3.org/TR/REC-html40"'; + xmlnsStr := ' xmlns="http://www.w3.org/TR/REC-html40"'; dataTagStr := 'ss:'; end else begin @@ -294,7 +408,7 @@ begin rsInvalidCharacterInCell, [ GetCellString(ARow, ACol) ]); - xmlns := ''; + xmlnsStr := ''; dataTagStr := ''; end; @@ -309,6 +423,11 @@ begin styleStr := Format(' ss:StyleID="s%d"', [ACell^.FormatIndex + FMT_OFFSET]) else styleStr := ''; + hyperlink := FWorksheet.FindHyperlink(ACell); + if Assigned(hyperlink) then + hyperlinkStr := ' ss:HRef="' + hyperlink^.Target + '"' else + hyperlinkStr := ''; + comment := FWorksheet.FindComment(ACell); if Assigned(comment) then // commentStr := ''+comment^.Text+'' else @@ -316,18 +435,30 @@ begin commentStr := ''; AppendToStream(AStream, Format( - ' <%sData ss:Type="%s"%s>%s%s' + LineEnding, - [styleStr, formulaStr, dataTagStr, cctStr, xmlns, valueStr, dataTagStr, commentStr]) - ); + ' ' + // style, formula, hyperlink + '<%sData ss:Type="%s"%s>'+ // "ss:", data type, "xmlns=.." + '%s' + // value string + '' + // "ss:" + '%s' + // Comment + '' + LineEnding, [ + styleStr, formulaStr, hyperlinkStr, + dataTagStr, cctStr, xmlnsStr, + valueStr, + dataTagStr, + commentStr + ])); end; - procedure TsSpreadExcelXMLWriter.WriteNumber(AStream: TStream; const ARow, ACol: Cardinal; const AValue: double; ACell: PCell); var formulaStr: String; cctStr: String; styleStr: String; + hyperlink: PsHyperlink; + hyperlinkStr: String; + comment: PsComment; + commentStr: String; begin cctStr := 'Number'; if HasFormula(ACell) then @@ -339,10 +470,33 @@ begin styleStr := Format(' ss:StyleID="s%d"', [ACell^.FormatIndex + FMT_OFFSET]) else styleStr := ''; + hyperlink := FWorksheet.FindHyperlink(ACell); + if Assigned(hyperlink) then + hyperlinkStr := ' ss:HRef="' + hyperlink^.Target + '"' else + hyperlinkStr := ''; + + comment := FWorksheet.FindComment(ACell); + if Assigned(comment) then + commentStr := ''+comment^.Text+'' else + commentStr := ''; + + AppendToStream(AStream, Format( + ' ' + // style, formula, hyperlink + '' + // data type + '%g' + // value + '' + + '%s' + // Comment ... + '' + LineEnding, [ + styleStr, formulaStr, hyperlinkStr, + cctStr, + AValue, + commentStr + ])); + { AppendToStream(AStream, Format( ' %g' + LineEnding, [styleStr, formulaStr, cctStr, AValue], FPointSeparatorSettings) - ); + ); } end; procedure TsSpreadExcelXMLWriter.WriteStyle(AStream: TStream; AIndex: Integer);