2008-11-04 33 views
10

Tengo un requisito para permitir que un usuario de esta aplicación web ASP.NET cargue una hoja de cálculo Excel específicamente formateada, complete matrices con datos de la hoja de cálculo y enlace las matrices a un procedimiento almacenado de Oracle para la validación y la inserción en la base de datos. Debo poder leer los datos de la hoja de cálculo de Excel sin poder guardarlos en el disco duro del servidor web. Esta es la parte que no puedo entender cómo hacer. Aquí hay un ejemplo de código simple.Obtener datos de un archivo Excel cargado sin guardar en el sistema de archivos

<%--ASP.NET Declarative--%> 
<asp:FileUpload ID="FileUpload1" runat="server" /> 
<asp:Button ID="Button1" runat="server" Text="Send File" OnClick="Button1_Click" /> 

// C# Code-Behind 
protected void Button1_Click(object sender, EventArgs e) { 
    var postedFile = FileUpload1.PostedFile; 

    // ... Read file in memory and put in format to send to stored procedure ... 

} 

¿Alguien me puede ayudar con esto? Agradezco la consideración de todos.

THX,
Gabe

Respuesta

2

Uso del FileUpload1. FileContent Stream. Supongo que su biblioteca de Excel puede manejar transmisiones directamente.

1

Las bibliotecas COM de Excel no admiten cargar archivos de otra fuente que no sea un archivo. Pero existe una gran cantidad de componentes de terceros, lo que le permite leer/escribir archivos de Excel.

Othervise puede ver una documentación para el formato de archivo XLS en [MS-XLS]: Excel Binary File Format (.xls) Structure Specification.

O puede utilizar una misma forma de procesamiento de archivos de oficina como en Sharepoint Server. Ver Microsoft.Office.Excel.Server.WebServices Namespace.

+0

XLS/BIFF. parece sin embargo ser posible cargar desde la memoria, pero no en alguna una instancia de Excel, pero para ejecutar una nueva aplicación para el usuario. Se crea cargándolo en ISTorage, luego usando OleLoad y luego IOleObject.DoVerb –

0

Esto es algo con lo que he estado jugando recientemente.

Comprobar este post: Write an excel workbook to a memory stream .NET

Apunta a una gran biblioteca de Carlos Aguilar Mares, lo que le permite trabajar con los libros de Excel como XML.

ExcelXMLWriter

usted no necesita Excel instalado en el servidor (que está rompiendo un poco el otorgamiento de licencias de MS de todas formas a medida que accede a este a través de Internet).

Puede cargar el libro de Excel como una corriente usando Workbook.Load(stream)

0

Podría tener sus usuarios cargar un archivo CSV en su lugar? Tratar con un archivo de texto sin formato sería mucho más fácil. Tuve un problema similar antes y les pregunté a los usuarios si estaban bien, me ahorraron mucho trabajo.

Buena suerte.

+0

no, eso no es posible. el cliente ya tiene una hoja de cálculo definida que debo usar. – gabe

8

He encontrado una gran API de código abierto de peso ligero en CodePlex para hacer esto se llama ExcelDataReader.

Puede transformar una secuencia de entrada de un archivo de Excel en un objeto System.Data.DataSet (probablemente analizando usando las especificaciones BIFF).

Aquí está el enlace:

http://www.codeplex.com/ExcelDataReader

Aquí está un ejemplo de código:

<%--ASP.NET Declarative--%> 
<asp:FileUpload ID="FileUpload1" runat="server" /> 
<asp:Button ID="Button1" runat="server" Text="Send File" OnClick="Button1_Click" /> 
<asp:GridView ID="GridView1" runat="server" /> 

// C# Code-Behind 
protected void Button1_Click(object sender, EventArgs e) { 
    // the ExcelDataReader takes a System.IO.Stream object 
    var excelReader = new ExcelDataReader(FileUpload1.FileContent); 
    FileUpload1.FileContent.Close(); 

    DataSet wb = excelReader.WorkbookData; 
    // get the first worksheet of the workbook 
    DataTable dt = excelReader.WorkbookData.Tables[0]; 

    GridView1.DataSource = dt.AsDataView(); 
    GridView1.DataBind(); 
} 
+1

Esa API no exporta un ExcelDataReader. Parece que esto se ha vuelto obsoleto. –

+0

@MatthewJamesDavis Simplemente use los métodos Factory de 'ExcelReaderFactory' – aggsol

Cuestiones relacionadas