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

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

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

我发现ExcelPackage http://excelpackage.codeplex.com/这看起来不错,但有额外的开销创build服务器上的文件,才可以发送给用户。 有谁知道这个方法吗?

我发现EPPlus http://epplus.codeplex.com但我不确定如果这需要在服务器上创build一个文件,然后才能发送给用户?

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

使用EPPlus并不需要创build文件,您可以使用stream来完成所有的工作,下面是一个ASP.NET的ashx处理程序示例,它将数据导出到excel文件并将其提供回客户端:

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; } } 

尝试使用此代码将数据导出为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) { } }