C#创建/修改/读取.xlsx文件

问题描述:

我正在寻找一种方法来创建,修改,读取C#中的.xlsx文件,无需安装Excel或在给用户下载之前在服务器上创建文件。C#创建/修改/读取.xlsx文件

我发现NPOI http://npoi.codeplex.com/看起来很大,但支持的.xls不是原来的.xlsx

我发现ExcelPackage http://excelpackage.codeplex.com/看起来很大,但有在服务器上创建的文件,然后才能被发送到用户的额外开销。 有没有人知道解决这个问题的方法?

我发现EPPlus http://epplus.codeplex.com但我不确定这是否需要在服务器上创建文件才能发送给用户?

我对这个很新,所以任何指导/例子等,将非常感激。

+0

...你使用一个Silverlight来回nt结束...或一个winforms应用程序?否则,我不确定任何方法会真的让你创建文件客户端。 – 2012-03-05 15:48:48

+0

我不想在客户端上创建文件。我想在服务器的内存中创建文件,然后将文件传输到客户端。 – Baxter 2012-03-05 15:59:36

随着EPPlus它不需要创建文件,你可以做所有的流,这里是将数据表导出到Excel文件并送达回客户端ASP.NET的ashx处理程序的一个例子:

public class GetExcel : IHttpHandler 
    { 
    public void ProcessRequest(HttpContext context) 
    { 
     var dt = DBServer.GetDataTable("select * from table"); 
     var ms = GetExcel.DataTableToExcelXlsx(dt, "Sheet1"); 
     ms.WriteTo(context.Response.OutputStream); 
     context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     context.Response.AddHeader("Content-Disposition", "attachment;filename=EasyEditCmsGridData.xlsx"); 
     context.Response.StatusCode = 200; 
     context.Response.End(); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
     return false; 
     } 
    } 

    public static MemoryStream DataTableToExcelXlsx(DataTable table, string sheetName) 
    { 
     var result = new MemoryStream(); 
     var pack = new ExcelPackage(); 
     var ws = pack.Workbook.Worksheets.Add(sheetName); 

     int col = 1; 
     int row = 1; 
     foreach (DataRow rw in table.Rows) 
     { 
     foreach (DataColumn cl in table.Columns) 
     { 
      if (rw[cl.ColumnName] != DBNull.Value) 
      ws.Cells[row, col].Value = rw[cl.ColumnName].ToString(); 
      col++; 
     } 
     row++; 
     col = 1; 
     } 
     pack.SaveAs(result); 
     return result; 
    } 
    } 

+0

这不需要Excel(2010)吗? – 2012-03-05 16:05:56

+0

我相信它没有Excel工作。 – Scroog1 2012-03-05 16:56:25

尝试当你说客户端上的文件的创建使用此代码导出到Excel中的数据,可以将其将协助

public static void DataSetsToExcel(DataSet dataSet, string filepath) 
    { 
     try 
     { 
      string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=Excel 12.0 Xml;"; 
      string tablename = ""; 
      DataTable dt = new DataTable(); 
      foreach (System.Data.DataTable dataTable in dataSet.Tables) 
      { 
       dt = dataTable; 
       tablename = dataTable.TableName; 
       using (OleDbConnection con = new OleDbConnection(connString)) 
       { 
        con.Open(); 
        StringBuilder strSQL = new StringBuilder(); 
        strSQL.Append("CREATE TABLE ").Append("[" + tablename + "]"); 
        strSQL.Append("("); 
        for (int i = 0; i < dt.Columns.Count; i++) 
        { 
         strSQL.Append("[" + dt.Columns[i].ColumnName + "] text,"); 
        } 
        strSQL = strSQL.Remove(strSQL.Length - 1, 1); 
        strSQL.Append(")"); 

        OleDbCommand cmd = new OleDbCommand(strSQL.ToString(), con); 
        cmd.ExecuteNonQuery(); 

        for (int i = 0; i < dt.Rows.Count; i++) 
        { 
         strSQL.Clear(); 
         StringBuilder strfield = new StringBuilder(); 
         StringBuilder strvalue = new StringBuilder(); 
         for (int j = 0; j < dt.Columns.Count; j++) 
         { 
          strfield.Append("[" + dt.Columns[j].ColumnName + "]"); 
          strvalue.Append("'" + dt.Rows[i][j].ToString().Replace("'", "''") + "'"); 
          if (j != dt.Columns.Count - 1) 
          { 
           strfield.Append(","); 
           strvalue.Append(","); 
          } 
          else 
          { 
          } 
         } 
         if (strvalue.ToString().Contains("<br/>")) 
         { 
          strvalue = strvalue.Replace("<br/>", Environment.NewLine); 
         } 
         cmd.CommandText = strSQL.Append(" insert into [" + tablename + "](") 
          .Append(strfield.ToString()) 
          .Append(") values (").Append(strvalue).Append(")").ToString(); 
         cmd.ExecuteNonQuery(); 
        } 
        con.Close(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 

     } 
    }