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); } }
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)); }
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)); }
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; } } } }