none
Exportar a excel en un webpart sp2010 RRS feed

  • Pregunta

  • Estimados pruebo unos codigos para exportar un gridview a excel pero no me funcionan en un webpart, he probado por ejemplo:

    http://carmencitasanchez.wordpress.com/2006/09/05/ejemplo-de-exportar-a-excel-un-gridview/

    Y no me funciona, haber si me pueden ayudar con unos link en donde exista un codigo que si funcione en webpart.

    Saludos.


    Gracias, MCA.
    jueves, 28 de julio de 2011 16:51

Respuestas

  • Hola
    como dice Juan Carlos, lo ideal sería generar el excel con Open XML y luego renderizarlo en el cliente. Mira el ejemplo:
    MemoryStream stream = CreateExcel(GetIncidencias(firstDate.SelectedDate, lastDate.SelectedDate));
    HttpContext.Current.Response.BufferOutput = true;
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
    HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "SolicitudesRechazadas.xlsx"));
    HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.End();
    
        MemoryStream CreateExcel(List<IncidenciaMes> incidenciasList)
        {
          var memoryStream = new MemoryStream();
          using (var excel = SpreadsheetDocument.Create(memoryStream, SpreadsheetDocumentType.Workbook, true))
          {
            CreateParts(excel, incidenciasList);
          }
          return memoryStream;
        }
    
    
        public static void CreateParts(SpreadsheetDocument excel, List<IncidenciaMes> incidenciasList)
        {  //workbook area      
          var workbookPart = excel.AddWorkbookPart();
          //workbook content
          CreateWorkbookPartContent(workbookPart);
          //workbookstyle contet
          //worksheet area 
          var worksheetPart = workbookPart.AddNewPart<WorksheetPart>("rId1");
          GenerateWorksheetContent(worksheetPart, incidenciasList);
        }
    
    
        public static void CreateWorkbookPartContent(WorkbookPart workbookPart)
        {
          var workbook = new Workbook(); // se crea el libro de trabajo
          var sheets = new Sheets(); // se crea la colección de hojas
          var sheet = new Sheet { Name = "Incidencias Mensuales", SheetId = 1, Id = "rId1" }; // se crea la hoja en cuestion
          sheets.Append(sheet);
          workbook.Append(sheets);
          workbookPart.Workbook = workbook;
        }
    
    

    Algo así


     

    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server
    viernes, 29 de julio de 2011 7:26

Todas las respuestas

  • Hola,

    ¿cuál es el problema que estás teniendo? ¿Nos pones el código?

    No deberías de tener muchos problemas, tan solo sería generar el Excel y con el objeto Response del context enviárselo al usuario.

     


    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server
    jueves, 28 de julio de 2011 18:41
  • Estimado te envio el ultimo codigo que he probado y que no me ha resultado:
    <br/>  StringBuilder sb = new StringBuilder();
    
      StringWriter sw = new StringWriter(sb);
    
      HtmlTextWriter htw = new HtmlTextWriter(sw);
    
      HtmlForm form = new HtmlForm();
    
      GridView1.EnableViewState = false;
    
      GridView1.RenderControl(htw); //Me lanza el error: El codigo de usuario no controlo HttpException<br/> 
    //El control 'xxxxxxxxxxxx' de tipo 'GridView' debe colocarse dentro de una etiqueta de formulario con runat=server.<br/>  Response.Clear();
    Response.Buffer = true; Response.ContentType = "application/vnd.ms-excel"; Response.AddHeader("Content-Disposition", "attachment;filename=data.xls"); Response.Charset = "UTF-8"; Response.ContentEncoding = Encoding.Default; Response.Write(sb.ToString()); Response.End();
    Saludos.


    Gracias, MCA.
    jueves, 28 de julio de 2011 19:22
  • hola

    no creo que sea un problema de SharePoint, te recomienso que pruebes ese código en una aplicación web con Visual Studio y testees que funciona correctamente.

     

    De todas formas, entiendo que GridView1 es un control que existe en el formulario de tu web part, si no es así puede ser que el problema sea ese.

     


    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server
    jueves, 28 de julio de 2011 19:28
  • Estimado te comento que el control si existe en el webpart, lo pruebo en una app asp.net normal y te cuento.

    Saludos.


    Gracias, MCA.
    jueves, 28 de julio de 2011 19:36
  • Hola,

    Además de esta forma que estás valorando para generar el Excel y que obliga a que el clietne tenga instalado Microsoft Excel, creo que no estaría mal que pensases en generar el Excel al vuelo desde tu WebPart...tienes dos opciones:

    • Usar los servicios de Excel.
    • Usar la API de Open XML.

    Saludos


    ------------------------------------------------------------
    Juan Carlos González Martín MVP de SharePoint Server
    Director revista CompartiMOSS: http://www.gavd.net/servers/compartimoss/compartimoss_main.aspx
    Blog: http://geeks.ms/blogs/ciin
    Twitter: @jcgm1978
    ------------------------------------------------------------
    jueves, 28 de julio de 2011 19:50
  • El codigo que puse funciona en una app asp.net tradicional, el problema es que me pide el metodo:

    public override void VerifyRenderingInServerForm(Control control)

    {   }

    Pero en un webpart me envia este error, 'xxxxx.(System.Web.UI.Control)': no se encontro ningun miembro adecuado que invalidar y no me lo deja usar.


    Saludos. -- Gracias, M.Carrasco.
    jueves, 28 de julio de 2011 20:21
  • Hola
    como dice Juan Carlos, lo ideal sería generar el excel con Open XML y luego renderizarlo en el cliente. Mira el ejemplo:
    MemoryStream stream = CreateExcel(GetIncidencias(firstDate.SelectedDate, lastDate.SelectedDate));
    HttpContext.Current.Response.BufferOutput = true;
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
    HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "SolicitudesRechazadas.xlsx"));
    HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.End();
    
        MemoryStream CreateExcel(List<IncidenciaMes> incidenciasList)
        {
          var memoryStream = new MemoryStream();
          using (var excel = SpreadsheetDocument.Create(memoryStream, SpreadsheetDocumentType.Workbook, true))
          {
            CreateParts(excel, incidenciasList);
          }
          return memoryStream;
        }
    
    
        public static void CreateParts(SpreadsheetDocument excel, List<IncidenciaMes> incidenciasList)
        {  //workbook area      
          var workbookPart = excel.AddWorkbookPart();
          //workbook content
          CreateWorkbookPartContent(workbookPart);
          //workbookstyle contet
          //worksheet area 
          var worksheetPart = workbookPart.AddNewPart<WorksheetPart>("rId1");
          GenerateWorksheetContent(worksheetPart, incidenciasList);
        }
    
    
        public static void CreateWorkbookPartContent(WorkbookPart workbookPart)
        {
          var workbook = new Workbook(); // se crea el libro de trabajo
          var sheets = new Sheets(); // se crea la colección de hojas
          var sheet = new Sheet { Name = "Incidencias Mensuales", SheetId = 1, Id = "rId1" }; // se crea la hoja en cuestion
          sheets.Append(sheet);
          workbook.Append(sheets);
          workbookPart.Workbook = workbook;
        }
    
    

    Algo así


     

    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server
    viernes, 29 de julio de 2011 7:26
  • Estimado para utilizar este codigo hay que poner algun using o referencia o instalar algo en VS como para que funcione.

     


    Saludos. -- Gracias, M.Carrasco.
    viernes, 29 de julio de 2011 13:48
  • Si, necesitas las API de Open XML

    http://openxmldeveloper.org/

     


    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server
    viernes, 29 de julio de 2011 13:56
  • Es el SDK de Microsoft?, este http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5124
    Saludos. -- Gracias, M.Carrasco.
    viernes, 29 de julio de 2011 14:10
  • Si, es el de Microsoft.
    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server
    viernes, 29 de julio de 2011 14:12
  • Excelente, estimado pruebo esto y te cuento.

     

    Gracias te pasaste.


    Saludos. -- Gracias, M.Carrasco.
    viernes, 29 de julio de 2011 14:14
  • Estimado, existen dos descargas en la pagina de microsoft, cual de los dos es? el OpenXMLSDKTool o el OpenXMLSDKv2

    Saludos. -- Gracias, M.Carrasco.
    martes, 2 de agosto de 2011 16:37
  • Te recomiendo la última versión 2.0 http://www.microsoft.com/download/en/details.aspx?DisplayLang=en&id=5124

     


    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server
    martes, 2 de agosto de 2011 16:44