diff --git a/components/fpspreadsheet/fpshtml.pas b/components/fpspreadsheet/fpshtml.pas index bdebbce66..f9e82d413 100644 --- a/components/fpspreadsheet/fpshtml.pas +++ b/components/fpspreadsheet/fpshtml.pas @@ -29,6 +29,7 @@ type FHRef: String; FFontStack: TsIntegerStack; procedure ReadBackgroundColor; + procedure ReadBorder; procedure ReadEncoding; procedure ReadFont(AFont: TsFont); procedure ReadHRef; @@ -393,6 +394,10 @@ begin begin FFontStack.Push(AddFont(FCurrFont)); FAttrList.Parse(ActualTag); + ReadBackgroundColor; + ReadBorder; + ReadHorAlign; + ReadVertAlign; ReadFont(FCurrFont); AddRichTextParam(FCurrFont); end; @@ -423,6 +428,10 @@ begin FCellText := FCellText + FPS_LINE_ENDING; FFontStack.Push(AddFont(FCurrFont)); FAttrList.Parse(ActualTag); + ReadBackgroundColor; + ReadBorder; + ReadHorAlign; + ReadVertAlign; ReadFont(FCurrFont); AddRichTextParam(FCurrFont); end; @@ -436,6 +445,10 @@ begin begin FFontStack.Push(AddFont(FCurrFont)); FAttrList.Parse(ActualTag); + ReadBackgroundColor; + ReadBorder; + ReadHorAlign; + ReadVertAlign; ReadFont(FCurrFont); AddRichTextparam(FCurrFont); end; @@ -463,8 +476,8 @@ begin if (NoCaseTag = '') or (NoCaseTag = '') then begin - while FWorksheet.isMerged(FWorksheet.FindCell(FCurrRow, FCurrRow)) do - inc(FCurrRow); + while FWorksheet.IsMerged(FWorksheet.FindCell(FCurrRow, FCurrCol)) do + inc(FCurrCol); AddCell(FCurrRow, FCurrCol, FCellText); FInCell := false; FCurrFont.CopyOf(TsFont(FFontList[FFontStack.Pop])); @@ -552,6 +565,109 @@ begin end; end; +procedure TsHTMLReader.ReadBorder; +var + idx: Integer; + cb: TsCellBorders; + value: String; + + procedure ReadBorderAttribs(AValue: String; var ABorderStyle: TsCellBorderStyle); + var + L: TStringList; + bs: TsCellBorderStyle; + w: String; + style: String; + color: String; + begin + L := TStringList.Create; + try + L.StrictDelimiter := true; + L.Delimiter := ' '; + L.DelimitedText := AValue; + w := L[0]; + if L.Count > 1 then style := L[1] else style := ''; + if L.Count > 2 then color := L[2] else color := ''; + if (w = '1px') and (style = 'solid') then + ABorderStyle.LineStyle := lsHair + else + if (w = 'thin') or (w = '1px') then + case style of + 'solid' : ABorderStyle.LineStyle := lsThin; + 'dashed' : ABorderStyle.LineStyle := lsDashed; + 'dotted' : ABorderStyle.LineStyle := lsDotted; + end + else + if (w = 'medium') then + case style of + 'solid' : ABorderStyle.LineStyle := lsMedium; + 'dashed' : ABorderStyle.LineStyle := lsMediumDash; + end + else + if (w = 'thick') and (style = 'solid') then + ABorderStyle.LineStyle := lsThick + else + if (w = 'double') then begin + ABorderStyle.LineStyle := lsDouble; + if L.Count > 1 then color := L[1]; + end; + if color <> '' then + ABorderStyle.Color := HTMLColorStrToColor(color); + finally + L.Free; + end; + end; + +begin + cb := []; + idx := FAttrList.IndexOfName('border'); + if idx <> -1 then + begin + value := FAttrList[idx].Value; + ReadBorderAttribs(value, FCurrCellFormat.BorderStyles[cbNorth]); + FCurrCellFormat.BorderStyles[cbEast] := FCurrCellFormat.BorderStyles[cbNorth]; + FCurrCellFormat.BorderStyles[cbSouth] := FCurrCellFormat.BorderStyles[cbNorth]; + FCurrCellFormat.BorderStyles[cbWest] := FCurrCellFormat.BorderStyles[cbNorth]; + FCurrCellFormat.Border := FCurrCellFormat.Border + [cbNorth, cbSouth, cbEast, cbWest]; + Include(FCurrCellFormat.UsedFormattingFields, uffBorder); + end; + + idx := FAttrList.IndexOfName('border-left'); + if idx <> -1 then + begin + Include(FCurrCellFormat.Border, cbWest); + value := FAttrList[idx].Value; + ReadBorderAttribs(value, FCurrCellFormat.BorderStyles[cbWest]); + Include(FCurrCellFormat.UsedFormattingFields, uffBorder); + end; + + idx := FAttrList.IndexOfName('border-right'); + if idx <> -1 then + begin + Include(FCurrCellFormat.Border, cbEast); + value := FAttrList[idx].Value; + ReadBorderAttribs(value, FCurrCellFormat.BorderStyles[cbEast]); + Include(FCurrCellFormat.UsedFormattingFields, uffBorder); + end; + + idx := FAttrList.IndexofName('border-top'); + if idx <> -1 then + begin + Include(FCurrCellFormat.Border, cbNorth); + value := FAttrList[idx].Value; + ReadBorderAttribs(value, FCurrCellFormat.BorderStyles[cbNorth]); + Include(FCurrCellFormat.UsedFormattingFields, uffBorder); + end; + + idx := FAttrList.IndexOfName('border-bottom'); + if idx <> -1 then + begin + Include(FCurrCellFormat.Border, cbSouth); + value := FAttrList[idx].Value; + ReadBorderAttribs(value, FCurrCellFormat.BorderStyles[cbSouth]); + Include(FCurrCellFormat.UsedFormattingFields, uffBorder); + end; +end; + procedure TsHTMLReader.ReadEncoding; function FoundEncoding(AString: string): Boolean; @@ -920,6 +1036,7 @@ begin FAttrList.Parse(ActualTag); ReadMergedRange; ReadBackgroundColor; + ReadBorder; ReadHorAlign; ReadVertAlign; ReadFont(FCurrFont);