Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 33048)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 33049)
@@ -35,5 +35,7 @@
 
     private static final String COOR = "(\\-?\\d+(?:[\\.,]\\d+)?)";
-    private static final Pattern LATLON_PATTERN = Pattern.compile("^"+COOR+"[,;]?\\s*"+COOR+"$");
+    // Lat/lon pattern with optional altitude and precision
+    private static final Pattern LATLON_PATTERN = Pattern.compile(
+            "^"+COOR+"[,;\\s]\\s*"+COOR+"(?:[,;\\s]\\s*"+COOR+"(?:[,;\\s]\\s*"+COOR+")?)?$");
 
     protected final SpreadSheetHandler handler;
@@ -220,5 +222,7 @@
                     if (!coordinate) {
                         if (!fields[i].isEmpty()) {
-                            nodes.values().iterator().next().put(header[i], fields[i]);
+                            for (Node n : nodes.values()) {
+                                n.put(header[i], fields[i]);
+                            }
                         }
                     }
@@ -232,5 +236,5 @@
                 EastNorth en = ens.get(c);
                 if (en.isValid()) {
-                    n.setCoor(c.proj != null && !handlerOK ? c.proj.eastNorth2latlon(en) : handler.getCoor(en, fields));
+                    n.setCoor(c.proj != null && !handlerOK ? c.proj.eastNorth2latlon(en) : handler != null ? handler.getCoor(en, fields) : null);
                 } else {
                     Main.warn("Skipping line "+lineNumber+" because no valid coordinates have been found at columns "+c);
Index: /applications/editors/josm/plugins/opendata/test/unit/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsReaderTest.java
===================================================================
--- /applications/editors/josm/plugins/opendata/test/unit/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsReaderTest.java	(revision 33049)
+++ /applications/editors/josm/plugins/opendata/test/unit/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsReaderTest.java	(revision 33049)
@@ -0,0 +1,37 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.opendata.core.io.tabular;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLStreamException;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.plugins.opendata.core.io.NonRegFunctionalTests;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+/**
+ * Unit tests of {@link OdsReader} class.
+ */
+public class OdsReaderTest {
+
+    /**
+     * Setup test.
+     */
+    @Rule
+    public JOSMTestRules rules = new JOSMTestRules().preferences();
+
+    /**
+     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/13821">#13821</a>
+     * @throws IOException if an error occurs during reading
+     */
+    @Test
+    public void testTicket13821() throws IOException, XMLStreamException, FactoryConfigurationError {
+        try (InputStream is = TestUtils.getRegressionDataStream(13821, "1_set_v_0.6_2016_06_21_06_00_23_a.ods")) {
+            NonRegFunctionalTests.testGeneric("#13821", OdsReader.parseDataSet(is, null, null));
+        }
+    }
+}
