diff --git a/oox/source/drawingml/chart/datasourcecontext.cxx b/oox/source/drawingml/chart/datasourcecontext.cxx
index 3ef0a85..895d6fa 100644
--- a/oox/source/drawingml/chart/datasourcecontext.cxx
+++ b/oox/source/drawingml/chart/datasourcecontext.cxx
@@ -81,12 +81,22 @@ ContextWrapper DoubleSequenceContext::onCreateContext( sal_Int32 nElement, const
     return false;
 }
 
-void DoubleSequenceContext::onEndElement( const OUString& rChars )
+static bool
+isExternalRef (OUString const& string)
+{
+    return !string.compareToAscii ("[", 1);
+}
+
+void
+DoubleSequenceContext::onEndElement( const OUString& rChars )
 {
     switch( getCurrentElement() )
     {
         case C_TOKEN( f ):
-            mrModel.maFormula = rChars;
+            if (!isExternalRef (rChars))
+                /* External refs are broken, and moreover they prevent
+                   using the numCache data.  */
+                mrModel.maFormula = rChars;
         break;
         case C_TOKEN( formatCode ):
             mrModel.maFormatCode = rChars;
diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx
index 29be098..6d145eb 100644
--- a/sc/source/ui/unoobj/chart2uno.cxx
+++ b/sc/source/ui/unoobj/chart2uno.cxx
@@ -56,6 +56,8 @@
 #include <com/sun/star/table/CellAddress.hpp>
 #include <com/sun/star/text/XText.hpp>
 #include <comphelper/extract.hxx>
+#include <comphelper/processfactory.hxx>
+#include <com/sun/star/beans/NamedValue.hpp>
 
 #include <vector>
 #include <list>
@@ -2184,6 +2186,75 @@ uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArgum
     return !aTokens.empty();
 }
 
+static beans::PropertyValue
+createPropertyValue (char const* key, int value)
+{
+    beans::PropertyValue p;
+    p.Name = OUString::createFromAscii (key);
+    p.Value <<= value;
+    return p;
+}
+
+#define OUSTRING_CSTR( str ) \
+    rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US ).getStr()
+
+//URG, C&P FROM
+//#include <oox/helper/containerhelper.hxx>
+namespace ContainerHelper {
+template< typename Type >
+::com::sun::star::uno::Sequence< Type > vectorToSequence( const ::std::vector< Type >& rVector )
+{
+    if( rVector.empty() )
+        return ::com::sun::star::uno::Sequence< Type >();
+    return ::com::sun::star::uno::Sequence< Type >( &rVector.front(), static_cast< sal_Int32 >( rVector.size() ) );
+}
+}
+
+void
+split (OUString const& string, OUString const& separator, std::vector<uno::Any>& v)
+{
+	sal_Int32 pos = 0;
+	sal_Int32 next = string.indexOf (separator);
+	
+	while (next > -1)
+	{
+		OUString s = string.copy (pos, next - pos);
+		pos = next + separator.getLength ();
+		next = string.indexOf (separator, pos);
+        v.push_back (uno::makeAny (s));
+	}
+	OUString s = string.copy (pos);
+	v.push_back (uno::makeAny (s));
+}
+
+static uno::Sequence<uno::Any>
+AnyVectorToUnoParameter (char const* key, std::vector<uno::Any> value)
+{
+    beans::NamedValue data;
+    data.Name = OUString::createFromAscii (key);
+    data.Value <<= ContainerHelper::vectorToSequence (value);
+    uno::Sequence <uno::Any> parameters (1);
+    parameters[0] <<= data;
+    return parameters;
+}
+
+static bool
+isSeriesString (OUString const& string)
+{
+//    return string.equalsAsciiL ("{", 1) && string.endsWithAsciiL ("}", 1);
+    return !string.compareToAscii ("{", 1) && string.endsWithAsciiL ("}", 1);
+}
+
+static uno::Reference<chart2::data::XDataSequence>
+SeriesStringToCachedDataSequence (OUString const& string)
+{
+    OSL_TRACE ("%s: aRangeRepresentation: %s", __PRETTY_FUNCTION__, OUSTRING_CSTR (string));
+    uno::Reference< lang::XMultiServiceFactory > factory (comphelper::getProcessServiceFactory (), uno::UNO_QUERY);
+    std::vector<uno::Any> v;
+    split (string.copy (1, string.getLength () - 2), OUString::createFromAscii (";"), v);
+    return uno::Reference<chart2::data::XDataSequence> (factory->createInstanceWithArguments (OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.comp.chart.CachedDataSequence")), AnyVectorToUnoParameter ("DataSequence", v)), uno::UNO_QUERY);
+}
+
 uno::Reference< chart2::data::XDataSequence > SAL_CALL
     ScChart2DataProvider::createDataSequenceByRangeRepresentation(
     const ::rtl::OUString& aRangeRepresentation )
@@ -2197,6 +2268,10 @@ uno::Reference< chart2::data::XDataSequence > SAL_CALL
     if(!m_pDocument || (aRangeRepresentation.getLength() == 0))
         return xResult;
 
+    OUString range = aRangeRepresentation;
+    OSL_TRACE ("%s: aRangeRepresentation: %s", __PRETTY_FUNCTION__, OUSTRING_CSTR (aRangeRepresentation));
+    if (isSeriesString (aRangeRepresentation))
+        return SeriesStringToCachedDataSequence (aRangeRepresentation);
     vector<ScSharedTokenRef> aRefTokens;
     ScRefTokenHelper::compileRangeRepresentation(aRefTokens, aRangeRepresentation, m_pDocument);
     if (aRefTokens.empty())

