2012-03-05 108 views
3

我正在尋找一種方法來創建,修改,讀取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

回答

15

隨着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; 
    } 
    } 
2

嘗試當你說客戶端上的文件的創建使用此代碼導出到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) 
     { 

     } 
    }