【问题标题】:Convert excel workbook to memory stream/byte array to download将excel工作簿转换为内存流/字节数组以下载
【发布时间】:2018-06-25 15:53:46
【问题描述】:

我创建了一个 Excel 工作簿。我可以将此 Excel 工作簿直接转换为内存流或字节数组以通过 HTTP 传递吗?我不想保存 Excel 工作簿。我需要通过 Angular js 下载这个 excel 文件。我正在使用 Web API 2

    using Excel = Microsoft.Office.Interop.Excel;
    private MemoryStream ExportDataSetToExcel()
    {
        System.Data.DataTable employeeTable = new System.Data.DataTable("Employee");
        employeeTable.Columns.Add("Employee ID");
        employeeTable.Columns.Add("Employee Name");
        employeeTable.Rows.Add("1", "ABC");
        employeeTable.Rows.Add("2", "DEF");
        employeeTable.Rows.Add("3", "PQR");
        employeeTable.Rows.Add("4", "XYZ");

        ////Create a Department Table
        System.Data.DataTable departmentTable = new System.Data.DataTable("Department");
        departmentTable.Columns.Add("Department ID");
        departmentTable.Columns.Add("Department Name");
        departmentTable.Rows.Add("1", "IT");
        departmentTable.Rows.Add("2", "HR");
        departmentTable.Rows.Add("3", "Finance");

        ////Create a DataSet with the existing DataTables
        DataSet ds = new DataSet("Organization");
        ds.Tables.Add(employeeTable);
        ds.Tables.Add(departmentTable);

        ////Creae an Excel application instance
        Excel.Application excelApp = new Excel.Application();
        excelApp.Visible = true;
        Excel.Workbook excelWorkBook = excelApp.Workbooks.Add();

        foreach (System.Data.DataTable table in ds.Tables)
        {
            ////Add a new worksheet to workbook with the Datatable name
            Microsoft.Office.Interop.Excel.Worksheet excelWorkSheet = excelWorkBook.Sheets.Add();
            excelWorkSheet.Name = table.TableName;

            for (int i = 1; i < table.Columns.Count + 1; i++)
            {
                excelWorkSheet.Cells[1, i] = table.Columns[i - 1].ColumnName;
                excelWorkSheet.Cells[1, i].Font.Bold = true;
            }

            for (int j = 0; j < table.Rows.Count; j++)
            {
                for (int k = 0; k < table.Columns.Count; k++)
                {
                    excelWorkSheet.Cells[j + 2, k + 1] = table.Rows[j].ItemArray[k].ToString();
                    excelWorkSheet.Cells[j + 2, k + 1].Interior.Color = Excel.XlRgbColor.rgbRed;
                }
            }
        }

        MemoryStream ms = new MemoryStream();

        ////excelWorkBook.SaveAs(ms, Type.Missing, Type.Missing, Type.Missing, true, false, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing);
        excelWorkBook.Close();
        excelApp.Quit();
        return ms;
    }

【问题讨论】:

  • 在 Web 应用程序中使用互操作库通常是个坏主意,理想情况下您应该使用 Open XML。我现在找不到证据,但我不认为 Excel.Workbook 类被标记为可序列化,所以如果没有额外的工作自己包装它,你就无法做你想做的事。为什么不能将文件保存到临时位置,然后再读回来?
  • 对于每个用户,我必须将 excel 文件写入磁盘并读回。然后再次删除。我认为这会对性能产生非常糟糕的影响。这就是为什么我想直接将其转换为内存流。
  • 哦,那你倒霉了,互操作是非托管代码的包装器的一个限制。我确信这适用于 Open XML,我有几个 EPPlus 库创建内存流的示例。
  • 请分享,真的很有帮助
  • 搜索c# excel openxml memorystreamc# excel epplus memorystream 让您有很多工作要做。

标签: c# excel asp.net-web-api asp.net-web-api2 memorystream


【解决方案1】:

您不能直接转换。您必须将文件保存到临时路径

public byte[] GetActiveWorkbook(Microsoft.Office.Interop.Excel.Application app)
{
    string path = Path.GetTempFileName();
    try
    {
        app.ActiveWorkbook.SaveCopyAs(path);
        return File.ReadAllBytes(path);
    }
    finally
    {
        if(File.Exists(path))
            File.Delete(path);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    相关资源
    最近更新 更多