【问题标题】:C# create/modify/read .xlsx filesC# 创建/修改/读取 .xlsx 文件
【发布时间】:2012-03-05 15:37:12
【问题描述】:

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

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

我发现 ExcelPackage http://excelpackage.codeplex.com/ 看起来不错,但在将文件发送给用户之前在服务器上创建文件会产生额外开销。 有谁知道解决这个问题的方法吗?

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

我对此很陌生,因此非常感谢任何指导/示例等。

【问题讨论】:

  • 当您说在客户端创建文件时...您使用的是 silverlight 前端...还是 winforms 应用程序?否则,我不确定任何方法真的可以让您创建文件客户端。
  • 我不想在客户端创建文件。我想在服务器的内存中创建文件,然后将文件流式传输到客户端。

标签: c# excel npoi epplus excelpackage


【解决方案1】:

使用 EPPlus 不需要创建文件,您可以使用流完成所有操作,这里是 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;
    }
  }

【讨论】:

    【解决方案2】:

    【讨论】:

    • 不需要 Excel (2010) 吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-16
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      相关资源
      最近更新 更多