diff --git a/ods2csv.cabal b/ods2csv.cabal
--- a/ods2csv.cabal
+++ b/ods2csv.cabal
@@ -1,5 +1,5 @@
 Name:                ods2csv
-Version:             0.1
+Version:             0.1.0.1
 Synopsis:            Convert Open Document Spreadsheet ODS to CSV
 Description:
   Usually you would convert ODS to CSV via @libreoffice --headless@
@@ -16,7 +16,7 @@
   but might not be true if generated or manipulated by other tools.
   .
   You can feed generated CSV files to LaTeX @datatool.sty@, @csvmidi@,
-  or @csvreplace@ from Haskell package @spreadsheet@.
+  Hledger's CSV import or @csvreplace@ from Haskell package @spreadsheet@.
   .
   Example runs of the program:
   .
@@ -33,8 +33,11 @@
   The program supports UTF-8 encoding for FODS/XML input,
   and applies Latin1 decoding otherwise.
   For writing CSV it uses the system's default encoding.
+  You may only feed FODS, not ODS via pipe/stdin to the program.
   .
   ToDo: Provide FODS parser as library function, maybe in @spreadsheet@.
+  .
+  Alternatives: <https://www.visidata.org/>, <https://csvkit.rtfd.org/>
 Homepage:            https://hub.darcs.net/thielema/ods2csv
 License:             BSD3
 License-File:        LICENSE
@@ -45,7 +48,7 @@
 Cabal-Version:       >=1.10
 
 Source-Repository this
-  Tag:         0.1
+  Tag:         0.1.0.1
   Type:        darcs
   Location:    https://hub.darcs.net/thielema/ods2csv
 
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -5,12 +5,13 @@
 
 import qualified Options.Applicative as OP
 
+import qualified Text.HTML.Tagchup.Format as TagFormat
 import qualified Text.HTML.Tagchup.Parser as TagParser
 import qualified Text.HTML.Tagchup.Process as TagProc
 import qualified Text.HTML.Tagchup.Tag.Match as TagMatch
 import qualified Text.HTML.Tagchup.Tag as Tag
 import qualified Text.XML.Basic.Attribute as Attr
-import qualified Text.XML.Basic.Name.MixedCase as Name -- Qualified would also be appropriate
+import qualified Text.XML.Basic.Name.MixedCase as Name
 import qualified Text.XML.Basic.Name as NameC
 
 import qualified Codec.Archive.Zip as Zip
@@ -25,7 +26,8 @@
 import qualified Data.Char as Char
 import Data.Function.HT (Id)
 import Data.Tuple.HT (mapSnd)
-import Data.Maybe (mapMaybe)
+import Data.Maybe.HT (toMaybe)
+import Data.Maybe (mapMaybe, fromMaybe)
 import Data.Monoid ((<>))
 
 import Control.Monad (join, guard)
@@ -91,21 +93,39 @@
       =<< readInput
 
 
+{-
+LibreOffice escapes double spaces as in @Foo  Bar@ like so:
+
+> <text:p>Foo <text:s/>Baar</text:p>
+-}
+flattenText :: [Tag.T Name.T String] -> String
+flattenText =
+   concatMap
+      (\tag ->
+         fromMaybe
+            (printf "*** unexpected tag %s in cell text ***"
+               (TagFormat.xml [tag] "")) $
+         Tag.maybeText tag
+         <|>
+         toMaybe (TagMatch.openNameLit "text:s" tag) " "
+         <|>
+         toMaybe (TagMatch.closeNameLit "text:s" tag) "")
+
 extractTablesContents :: [Tag.T Name.T String] -> [(String, [[String]])]
 extractTablesContents =
    map (mapSnd (
          map
             (concatMap
                (uncurry $ \n ->
-                  (\texts ->
-                     replicate n $
-                     case texts of
-                        text:_ -> text
-                        [] -> "")
-                   .
-                   mapMaybe Tag.maybeText
-                   .
-                   dropWhile (not . TagMatch.openNameLit "text:p"))
+                  replicate n
+                  .
+                  flattenText
+                  .
+                  takeWhile (not . TagMatch.closeNameLit "text:p")
+                  .
+                  drop 1
+                  .
+                  dropWhile (not . TagMatch.openNameLit "text:p"))
              .
              snd
              .
