2011-01-19 102 views
4

从Web应用程序中,是否有一种将LINQ对象列表导出到Excel文件的简单方法?有没有好的图书馆可以做到这一点?将LINQ对象列表导出到Excel文件

+1

可能重复[如何使用LINQ to实体的数据导出到Excel?](http://stackoverflow.com/questions/2202606/how-to-export-data-to-excel-using-linq -to-entity) – 2011-01-19 15:50:13

+0

我会想象你将不得不使用ado.net,看看一些类似的问题http://stackoverflow.com/questions/3486278/c-export-to-excel,http:// stackoverflow .COM /问题/ 151005 /创建-Excel的XLS-和XLSX文件,从-C。干杯 – msarchet 2011-01-19 15:52:17

回答

0

因此,在指定Excel时,您要提交一个行/列范例(而不是xml)。所以你必须指定属性如何映射到列。

除此之外,您使用Ole DB provider写入Excel文件。循环遍历你的对象,使用一个stringbuilder为每个对象生成一个INSERT语句,然后在你的工作表上执行它。像蛋糕一样容易。

4

退房VB团队的视频从ASP.Net链接,贝丝·马西实际上做了一个非常类似的演示,可能做你想要什么:

http://www.asp.net/linq/videos/how-do-i-create-excel-spreadsheets-using-linq-to-xml

您可能会发现其他人在同一系列有用,他们在这里大约4/5上下页:

http://www.asp.net/web-forms/data

还有一个叫做LINQ到Excel的项目,该项目是在这里 - http://code.google.com/p/linqtoexcel/

或者你可以使用的OpenXML的图书馆做这样的事情,在这里就是这样一个例子 - http://msdn.microsoft.com/en-us/library/bb508943(v=office.12).aspx

的Excel也可以打开XML文件直接,因此你可以使用XML序列化或任何其他的只是创建一个XML输出方法,并在Excel中打开它。

13

这是Excel导出我基于上面的VB视频链接结束了。它接受任何对象列表(它不包括实体框架对象上的导航属性和集合)并将它们导出到Excel。它在约4秒内输出约35K记录。

public void ExportToExcel<T>(List<T> list) 
    { 
     int columnCount = 0; 

     DateTime StartTime = DateTime.Now; 

     StringBuilder rowData = new StringBuilder(); 

     PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     rowData.Append("<Row ss:StyleID=\"s62\">"); 
     foreach (PropertyInfo p in properties) 
     { 
      if (p.PropertyType.Name != "EntityCollection`1" && p.PropertyType.Name != "EntityReference`1" && p.PropertyType.Name != p.Name) 
      { 
       columnCount++; 
       rowData.Append("<Cell><Data ss:Type=\"String\">" + p.Name + "</Data></Cell>"); 
      } 
      else 
       break; 

     } 
     rowData.Append("</Row>"); 

     foreach (T item in list) 
     {     
      rowData.Append("<Row>"); 
      for (int x = 0; x < columnCount; x++) //each (PropertyInfo p in properties) 
      {      
       object o = properties[x].GetValue(item, null); 
       string value = o == null ? "" : o.ToString();      
       rowData.Append("<Cell><Data ss:Type=\"String\">" + value + "</Data></Cell>"); 

      } 
      rowData.Append("</Row>"); 
     } 

     var sheet = @"<?xml version=""1.0""?> 
        <?mso-application progid=""Excel.Sheet""?> 
        <Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet"" 
         xmlns:o=""urn:schemas-microsoft-com:office:office"" 
         xmlns:x=""urn:schemas-microsoft-com:office:excel"" 
         xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"" 
         xmlns:html=""http://www.w3.org/TR/REC-html40""> 
         <DocumentProperties xmlns=""urn:schemas-microsoft-com:office:office""> 
          <Author>MSADMIN</Author> 
          <LastAuthor>MSADMIN</LastAuthor> 
          <Created>2011-07-12T23:40:11Z</Created> 
          <Company>Microsoft</Company> 
          <Version>12.00</Version> 
         </DocumentProperties> 
         <ExcelWorkbook xmlns=""urn:schemas-microsoft-com:office:excel""> 
          <WindowHeight>6600</WindowHeight> 
          <WindowWidth>12255</WindowWidth> 
          <WindowTopX>0</WindowTopX> 
          <WindowTopY>60</WindowTopY> 
          <ProtectStructure>False</ProtectStructure> 
          <ProtectWindows>False</ProtectWindows> 
         </ExcelWorkbook> 
         <Styles> 
          <Style ss:ID=""Default"" ss:Name=""Normal""> 
           <Alignment ss:Vertical=""Bottom""/> 
           <Borders/> 
           <Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""/> 
           <Interior/> 
           <NumberFormat/> 
           <Protection/> 
          </Style> 
          <Style ss:ID=""s62""> 
           <Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000"" 
            ss:Bold=""1""/> 
          </Style> 
         </Styles> 
         <Worksheet ss:Name=""Sheet1""> 
          <Table ss:ExpandedColumnCount=""" + (properties.Count() + 1) + @""" ss:ExpandedRowCount=""" + (list.Count() + 1) + @""" x:FullColumns=""1"" 
           x:FullRows=""1"" ss:DefaultRowHeight=""15""> 
           " + rowData.ToString() [email protected]" 
          </Table> 
          <WorksheetOptions xmlns=""urn:schemas-microsoft-com:office:excel""> 
           <PageSetup> 
            <Header x:Margin=""0.3""/> 
            <Footer x:Margin=""0.3""/> 
            <PageMargins x:Bottom=""0.75"" x:Left=""0.7"" x:Right=""0.7"" x:Top=""0.75""/> 
           </PageSetup> 
           <Print> 
            <ValidPrinterInfo/> 
            <HorizontalResolution>300</HorizontalResolution> 
            <VerticalResolution>300</VerticalResolution> 
           </Print> 
           <Selected/> 
           <Panes> 
            <Pane> 
             <Number>3</Number> 
             <ActiveCol>2</ActiveCol> 
            </Pane> 
           </Panes> 
           <ProtectObjects>False</ProtectObjects> 
           <ProtectScenarios>False</ProtectScenarios> 
          </WorksheetOptions> 
         </Worksheet> 
         <Worksheet ss:Name=""Sheet2""> 
          <Table ss:ExpandedColumnCount=""1"" ss:ExpandedRowCount=""1"" x:FullColumns=""1"" 
           x:FullRows=""1"" ss:DefaultRowHeight=""15""> 
          </Table> 
          <WorksheetOptions xmlns=""urn:schemas-microsoft-com:office:excel""> 
           <PageSetup> 
            <Header x:Margin=""0.3""/> 
            <Footer x:Margin=""0.3""/> 
            <PageMargins x:Bottom=""0.75"" x:Left=""0.7"" x:Right=""0.7"" x:Top=""0.75""/> 
           </PageSetup> 
           <ProtectObjects>False</ProtectObjects> 
           <ProtectScenarios>False</ProtectScenarios> 
          </WorksheetOptions> 
         </Worksheet> 
         <Worksheet ss:Name=""Sheet3""> 
          <Table ss:ExpandedColumnCount=""1"" ss:ExpandedRowCount=""1"" x:FullColumns=""1"" 
           x:FullRows=""1"" ss:DefaultRowHeight=""15""> 
          </Table> 
          <WorksheetOptions xmlns=""urn:schemas-microsoft-com:office:excel""> 
           <PageSetup> 
            <Header x:Margin=""0.3""/> 
            <Footer x:Margin=""0.3""/> 
            <PageMargins x:Bottom=""0.75"" x:Left=""0.7"" x:Right=""0.7"" x:Top=""0.75""/> 
           </PageSetup> 
           <ProtectObjects>False</ProtectObjects> 
           <ProtectScenarios>False</ProtectScenarios> 
          </WorksheetOptions> 
         </Worksheet> 
        </Workbook>"; 

     System.Diagnostics.Debug.Print(StartTime.ToString() + " - " + DateTime.Now); 
     System.Diagnostics.Debug.Print((DateTime.Now - StartTime).ToString()); 

     string attachment = "attachment; filename=Report.xml"; 
     HttpContext.Current.Response.ClearContent(); 
     HttpContext.Current.Response.AddHeader("content-disposition", attachment); 
     HttpContext.Current.Response.Write(sheet); 
     HttpContext.Current.Response.ContentType = "application/ms-excel"; 
     HttpContext.Current.Response.End(); 

    }