Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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# 将excel工作簿转换为要下载的内存流/字节数组_C#_Excel_Asp.net Web Api_Asp.net Web Api2_Memorystream - Fatal编程技术网

C# 将excel工作簿转换为要下载的内存流/字节数组

C# 将excel工作簿转换为要下载的内存流/字节数组,c#,excel,asp.net-web-api,asp.net-web-api2,memorystream,C#,Excel,Asp.net Web Api,Asp.net Web Api2,Memorystream,我已经创建了一个excel工作簿。我是否可以将此excel工作簿直接转换为内存流或字节数组以通过HTTP传递?我不想保存excel工作簿。我需要通过angular js下载这个excel文件。我正在使用WebAPI2 using Excel = Microsoft.Office.Interop.Excel; private MemoryStream ExportDataSetToExcel() { System.Data.DataTable employe

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

    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;
    }
使用Excel=Microsoft.Office.Interop.Excel;
私有MemoryStream ExportDataSetToExcel()
{
System.Data.DataTable employeeTable=新的System.Data.DataTable(“员工”);
employeeTable.Columns.Add(“员工ID”);
employeeTable.Columns.Add(“员工姓名”);
employeeTable.Rows.Add(“1”、“ABC”);
employeeTable.Rows.Add(“2”,“DEF”);
employeeTable.Rows.Add(“3”,“PQR”);
employeeTable.Rows.Add(“4”,“XYZ”);
////创建部门表
System.Data.DataTable departmentTable=新的System.Data.DataTable(“部门”);
departmentTable.Columns.Add(“部门ID”);
departmentTable.Columns.Add(“部门名称”);
departmentTable.Rows.Add(“1”,“IT”);
部门表。行。添加(“2”,“HR”);
部门表。行。添加(“3”,“财务”);
////使用现有数据表创建数据集
数据集ds=新数据集(“组织”);
ds.Tables.Add(employeeTable);
ds.Tables.Add(部门表);
////Creae一个Excel应用程序实例
Excel.Application excelApp=新的Excel.Application();
excelApp.Visible=true;
Excel.Workbook excelWorkBook=excelApp.Workbooks.Add();
foreach(ds.Tables中的System.Data.DataTable表)
{
////使用Datatable名称将新工作表添加到工作簿
Microsoft.Office.Interop.Excel.Worksheet excelWorkSheet=excelWorkBook.Sheets.Add();
excelWorkSheet.Name=table.TableName;
对于(int i=1;i
您不能直接转换。必须将文件保存到临时路径

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

在web应用程序中使用互操作库通常是一个坏主意,理想情况下应该使用开放式XML。我现在找不到证据,但我不认为
Excel.Workbook
类被标记为可序列化,因此如果没有额外的工作来包装它,您就无法完成您想要的工作。为什么不能将文件保存到一个临时位置,然后重新读取?对于每个用户,我必须将excel文件写入磁盘并重新读取。然后再次删除它。我认为这将对性能产生非常坏的影响。这就是为什么我想直接将其转换为内存流。哦,那你就走运了,这是互操作作为非托管代码包装的一个限制。我相信这将适用于开放式XML,我有几个EPPlus库创建memorystream的示例。请分享,搜索
c#excel openxml memorystream
c#excel EPPlus memorystream
会非常有帮助。