2009-12-06 11 views
0

développement Plate-forme: .NET 2.0 Plate-forme: ASP.NET SpreadsheetGear: 2008 Langue: C#Objet Spreadsheetgear.IWorkbook/classeur. Comment puis-je récupérer la longueur du workbok?

est-il un moyen de récupérer la longueur en octets d'un classeur sans le copier/enregistrer à un autre objet?

J'ai parcouru la documentation et plusieurs tentatives sans succès.

Je enregistre le classeur à l'aide de la méthode SaveToStream qui écrit le classeur directement dans le Page.Response.OutputStream qui est ensuite supprimé du navigateur. Mais puisque le type de cet objet est Stream, cette classe abstraite n'implémente pas la propriété Length et la convertir en une classe enfant comme MemoryStream retournera null. Dans les deux cas, l'application va lancer une exception.

J'ai besoin de capturer la longueur en octets afin de l'enregistrer à des fins de révision des performances dans notre application. Mon but est d'éviter de copier ce flux vers un autre objet et, si possible, d'utiliser uniquement des conversions de référence, car nous devons optimiser l'empreinte mémoire du module exporté vers des feuilles de calcul Excel dans l'application.

Répondre

1

Si la propriété Length n'est pas implémentée, vous pouvez copier le flux entier dans un MemoryStream, obtenir la longueur de celui-ci, puis envoyer le flux à partir du flux de mémoire.

L'inconvénient de ceci est que vous devez attendre la fin de la copie entière avant de connaître la longueur, ce qui rompt l'aspect de la diffusion. Donc, à la place, vous pouvez implémenter un nouveau flux qui compte les octets à mesure qu'ils passent et conserve un total cumulé que vous pouvez demander à la fin. Voici comment vous pouvez la mettre en œuvre:

public class LengthLoggingStream : Stream 
{ 
    private Stream stream; 
    public long TotalBytesRead { get; private set; } 
    public long TotalBytesWritten { get; private set; } 

    public LengthLoggingStream(Stream stream) 
    { 
     this.stream = stream; 
    } 

    public override bool CanRead 
    { 
     get { return stream.CanRead; } 
    } 

    public override bool CanSeek 
    { 
     get { return stream.CanSeek; } 
    } 

    public override bool CanWrite 
    { 
     get { return stream.CanWrite; } 
    } 

    public override void Flush() 
    { 
     stream.Flush(); 
    } 

    public override long Length 
    { 
     get { return stream.Length; } 
    } 

    public override long Position 
    { 
     get 
     { 
      return stream.Position; 
     } 
     set 
     { 
      stream.Position = value; 
     } 
    } 

    public override int Read(byte[] buffer, int offset, int count) 
    { 
     int bytesRead = stream.Read(buffer, offset, count); 

     if (bytesRead > 0) 
      TotalBytesRead += bytesRead; 

     return bytesRead; 
    } 

    public override long Seek(long offset, SeekOrigin origin) 
    { 
     return stream.Seek(offset, origin); 
    } 

    public override void SetLength(long value) 
    { 
     stream.SetLength(value); 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     TotalBytesWritten += count; 

     stream.Write(buffer, offset, count); 
    } 
} 

Vous pouvez envelopper le Response.OutputStream avec cette classe, le rincer, puis voir combien d'octets ont été écrits:

LengthLoggingStream loggingStream = new LengthLoggingStream(Response.OutputStream); 
    workbook.SaveToStream(loggingStream, /*other parameters */); 
    log("Bytes written: " + loggingStream.TotalBytesWritten);