diff --git a/components/fpspreadsheet/examples/read_write/htmldemo/htmlread_http.lpi b/components/fpspreadsheet/examples/read_write/htmldemo/htmlread_http.lpi
new file mode 100644
index 000000000..a24466c24
--- /dev/null
+++ b/components/fpspreadsheet/examples/read_write/htmldemo/htmlread_http.lpi
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/fpspreadsheet/examples/read_write/htmldemo/htmlread_http.lpr b/components/fpspreadsheet/examples/read_write/htmldemo/htmlread_http.lpr
new file mode 100644
index 000000000..6406d943b
--- /dev/null
+++ b/components/fpspreadsheet/examples/read_write/htmldemo/htmlread_http.lpr
@@ -0,0 +1,78 @@
+{
+htmlread_http.dpr
+
+Demonstrates how to read a html file from the internet using the fpspreadsheet library.
+}
+
+program htmlread_http;
+
+{$mode delphi}{$H+}
+
+uses
+ Classes, SysUtils, LazUTF8, fphttpclient, fpstypes, fpsutils, fpspreadsheet, fpshtml;
+
+var
+ MyWorkbook: TsWorkbook;
+ MyWorksheet: TsWorksheet;
+ i: Integer;
+ CurCell: PCell;
+ stream: TMemoryStream;
+
+const
+// url = 'http://unicode.e-workers.de/entities.php';
+ url = 'http://www.freepascal.org/docs.var';
+
+begin
+ stream := TMemoryStream.Create;
+ try
+ // Get file from the internet
+ with TFPHttpClient.Create(nil) do
+ try
+ Get(url, stream);
+ finally
+ Free;
+ end;
+
+ // Parameters
+ HTMLParams.TableIndex := 0;
+
+ // Create the spreadsheet
+ MyWorkbook := TsWorkbook.Create;
+ try
+ MyWorkbook.Options := MyWorkbook.Options + [boReadFormulas];
+ MyWorkbook.ReadFromStream(stream, sfHTML);
+
+ MyWorksheet := MyWorkbook.GetFirstWorksheet;
+
+ // Write all cells with contents to the console
+ WriteLn('');
+ WriteLn('Contents of the first worksheet of the file:');
+ WriteLn('');
+
+ for CurCell in MyWorksheet.Cells do
+ begin
+ Write(
+ 'Row: ', CurCell^.Row,
+ ' Col: ', CurCell^.Col,
+ ' Value: ', UTF8ToConsole(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row, CurCell^.Col))
+ );
+ if MyWorksheet.HasHyperlink(CurCell) then
+ Write(' Hyperlink: ', MyWorksheet.ReadHyperlink(CurCell).Target);
+ WriteLn;
+ end;
+
+ finally
+ // Finalization
+ MyWorkbook.Free;
+ end;
+ finally
+ stream.Free;
+ end;
+
+ {$IFDEF MSWINDOWS}
+ WriteLn;
+ WriteLn('Press ENTER to exit.');
+ ReadLn;
+ {$ENDIF}
+end.
+
diff --git a/components/fpspreadsheet/fpshtml.pas b/components/fpspreadsheet/fpshtml.pas
index b542e4401..bed134042 100644
--- a/components/fpspreadsheet/fpshtml.pas
+++ b/components/fpspreadsheet/fpshtml.pas
@@ -31,6 +31,8 @@ type
FCelLText: String;
FAttrList: TsHTMLAttrList;
FColSpan, FRowSpan: Integer;
+ FHRef: String;
+ procedure ExtractHRef;
procedure ExtractMergedRange;
procedure TagFoundHandler(NoCaseTag, ActualTag: string);
procedure TextFoundHandler(AText: String);
@@ -444,8 +446,17 @@ begin
cell := FWorksheet.AddCell(ARow, ACol);
// Merged cells
- if (FColSpan > 0) or (FRowSpan > 0) then
+ if (FColSpan > 0) or (FRowSpan > 0) then begin
FWorksheet.MergeCells(ARow, ACol, ARow + FRowSpan, ACol + FColSpan);
+ FRowSpan := 0;
+ FColSpan := 0;
+ end;
+
+ // Hyperlink
+ if FHRef <> '' then begin
+ FWorksheet.WriteHyperlink(cell, FHRef);
+ FHRef := '';
+ end;
// Do not try to interpret the strings. --> everything is a LABEL cell.
if not HTMLParams.DetectContentType then
@@ -486,6 +497,16 @@ begin
FWorksheet.WriteUTF8Text(cell, AText);
end;
+procedure TsHTMLReader.ExtractHRef;
+var
+ idx: Integer;
+begin
+ FHRef := '';
+ idx := FAttrList.IndexOfName('href');
+ if idx > -1 then
+ FHRef := FAttrList[idx].Value;
+end;
+
procedure TsHTMLReader.ExtractMergedRange;
var
idx: Integer;
@@ -566,6 +587,7 @@ begin
if ((NoCaseTag = '
') or (pos(' | |