Exemplo n.º 1
0
 static IEnumerable <T> ReadImpl <T>(byte[] data, IXlTableDataFactory <T> factory)
 {
     using (var ms = new MemoryStream(data))
         using (var e = Read(ms, factory))
             while (e.MoveNext())
             {
                 yield return(e.Current);
             }
 }
Exemplo n.º 2
0
 public static IEnumerator <T> Read <T>(Stream stream, IXlTableDataFactory <T> factory)
 {
     if (stream == null)
     {
         throw new ArgumentNullException("stream");
     }
     if (factory == null)
     {
         throw new ArgumentNullException("factory");
     }
     return(ReadImpl(stream, factory));
 }
Exemplo n.º 3
0
 public static IEnumerable <T> Read <T>(byte[] data, IXlTableDataFactory <T> factory)
 {
     if (data == null)
     {
         throw new ArgumentNullException("data");
     }
     if (factory == null)
     {
         throw new ArgumentNullException("factory");
     }
     return(ReadImpl(data, factory));
 }
Exemplo n.º 4
0
        static IEnumerator <T> ReadImpl <T>(Stream stream, IXlTableDataFactory <T> factory)
        {
            using (var reader = new BinaryReader(stream))
            {
                if (XlTableDataType.Table != (XlTableDataType)reader.ReadUInt16())
                {
                    throw new FormatException();
                }
                var size = reader.ReadUInt16();
                if (size != 4)
                {
                    throw new FormatException();
                }
                var rows = reader.ReadUInt16();
                var cols = reader.ReadUInt16();
                yield return(factory.Table(rows, cols));

                var cells = rows * cols;
                while (cells > 0)
                {
                    var type = (XlTableDataType)reader.ReadUInt16();
                    size = reader.ReadUInt16();
                    if (type == XlTableDataType.String)
                    {
                        while (size > 0)
                        {
                            var str = Encoding.Default.GetString(reader.ReadBytes(reader.ReadByte()));
                            yield return(factory.String(str));

                            cells--;
                            size -= (ushort)(1 + checked ((byte)str.Length));
                        }
                    }
                    else
                    {
                        int count;
                        Func <BinaryReader, IXlTableDataFactory <T>, T> rf;
                        switch (type)
                        {
                        case XlTableDataType.Float:
                            if (size % 8 != 0)
                            {
                                throw new FormatException();
                            }
                            count = size / 8;
                            rf    = (r, f) => f.Float(r.ReadDouble());
                            break;

                        case XlTableDataType.Skip:
                            if (size != 2)
                            {
                                throw new FormatException();
                            }
                            count = reader.ReadUInt16();
                            rf    = (r, f) => f.Skip;
                            break;

                        case XlTableDataType.Blank:
                            if (size != 2)
                            {
                                throw new FormatException();
                            }
                            count = reader.ReadUInt16();
                            rf    = (r, f) => f.Blank;
                            break;

                        case XlTableDataType.Error:
                            if (size % 2 != 0)
                            {
                                throw new FormatException();
                            }
                            count = size / 2;
                            rf    = (r, f) => f.Error(r.ReadUInt16());
                            break;

                        case XlTableDataType.Bool:
                            if (size % 2 != 0)
                            {
                                throw new FormatException();
                            }
                            count = size / 2;
                            rf    = (r, f) => f.Bool(r.ReadUInt16() != 0);
                            break;

                        case XlTableDataType.Int:
                            if (size % 2 != 0)
                            {
                                throw new FormatException();
                            }
                            count = size / 2;
                            rf    = (r, f) => f.Int(r.ReadUInt16());
                            break;

                        default: throw new FormatException();
                        }

                        for (var j = 0; j < count; j++)
                        {
                            yield return(rf(reader, factory));
                        }

                        cells -= count;
                    }
                }
            }
        }