Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#创建/修改/读取.xlsx文件_C#_Excel_Npoi_Epplus_Excelpackage - Fatal编程技术网

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

C#创建/修改/读取.xlsx文件,c#,excel,npoi,epplus,excelpackage,C#,Excel,Npoi,Epplus,Excelpackage,我正在寻找一种方法来创建、修改、读取C#中的.xlsx文件,而无需在服务器上安装Excel或创建文件,然后再让用户下载 我发现NPOI看起来很棒,但支持.xls而不是.xlsx 我发现ExcelPackage看起来很棒,但是在将文件发送给用户之前在服务器上创建文件会增加额外的开销。 有人知道解决这个问题的方法吗 我找到了EPPlus,但我不确定这是否需要在服务器上创建一个文件,然后才能将其发送给用户 我对这一点非常陌生,因此任何指导/示例等都将不胜感激。使用EPPlus不需要创建文件,您可以使用

我正在寻找一种方法来创建、修改、读取C#中的.xlsx文件,而无需在服务器上安装Excel或创建文件,然后再让用户下载

我发现NPOI看起来很棒,但支持.xls而不是.xlsx

我发现ExcelPackage看起来很棒,但是在将文件发送给用户之前在服务器上创建文件会增加额外的开销。 有人知道解决这个问题的方法吗

我找到了EPPlus,但我不确定这是否需要在服务器上创建一个文件,然后才能将其发送给用户


我对这一点非常陌生,因此任何指导/示例等都将不胜感激。

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

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

    }
}
publicstaticvoiddatasetstoexcel(数据集数据集,字符串文件路径)
{
尝试
{
string connString=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=“+filepath+”;扩展属性=excel12.0xml;”;
字符串tablename=“”;
DataTable dt=新的DataTable();
foreach(dataSet.Tables中的System.Data.DataTable数据表)
{
dt=数据表;
tablename=dataTable.tablename;
使用(OleDbConnection con=新OleDbConnection(connString))
{
con.Open();
StringBuilder strSQL=新建StringBuilder();
Append(“创建表”).Append(“[”+tablename+“]);
strSQL.Append(“”);
对于(int i=0;i”)
{
strvalue=strvalue.Replace(“
”,Environment.NewLine); } cmd.CommandText=strSQL.Append(“插入到[”+tablename+“])(“”) .Append(strfield.ToString()) .Append(“)value(”).Append(strvalue.Append(“)”).ToString(); cmd.ExecuteNonQuery(); } con.Close(); } } } 捕获(例外情况除外) { } }
当您说在客户端上创建文件时……您是使用silverlight前端还是winforms应用程序?否则,我不确定任何方法是否真的能让您在客户端创建文件。我不想在客户端创建文件。我想在服务器上的内存中创建文件,然后将文件流式传输到客户端。这不需要Excel(2010)吗?