【问题标题】:Creating Excel File stream using Interop Services for WCF Service使用 WCF 服务的互操作服务创建 Excel 文件流
【发布时间】:2014-06-26 16:07:42
【问题描述】:

在我的应用程序中,我正在尝试创建一个 WCF 服务,该服务接受表格 json 数据并将该 json 数据转换为 Excel 文件流并发送回客户端。因此,为了创建 Excel 文件,我使用了以下使用互操作服务的代码

        object misValue = System.Reflection.Missing.Value;

        var xlApp = new Excel.Application();
        var xlWorkBook = xlApp.Workbooks.Add(misValue);

        var xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.Item[1];
        xlWorkSheet.Cells[1, 1] = "FirstName";
        xlWorkSheet.Cells[1, 2] = "Last Name";
        xlWorkSheet.Cells[1, 3] = "Age";


        xlWorkSheet.Cells[2, 1] = "Stezma";
        xlWorkSheet.Cells[2, 2] = "Seb";
        xlWorkSheet.Cells[2, 3] = "25";

        xlWorkBook.SaveAs("csharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

**这是我的疑问**

  1. 是否建议使用互操作服务来满足此要求,如果没有,我可以使用哪些其他替代方法来创建 excel 文件流。

  2. 如果建议我如何创建创建的 excel 文件的流,当前文件保存在机器的文件夹中。我不想将文件保存到本地文件夹中,如何通过互操作方法获取该文件的流。

【问题讨论】:

标签: c# winforms wcf winforms-interop


【解决方案1】:

Excel 互操作将起作用。但是,您必须小心。您必须使用 System.Runtime.InteropServices.Marshal.ReleaseComObject 手动处置互操作对象。此外,在使用互操作时,您必须避免使用属性/“双点”的属性。

Cleaning up Excel Interop

否则将导致 Excel 应用程序进程拒绝关闭。这会导致严重的内存泄漏,最终导致服务器崩溃!

如果您希望避免互操作带来的所有麻烦,我建议您使用 Visual Studio Tools for Office (VSTO)。它为您处理所有清理工作,同时提供比互操作更多的控制。

但是,VSTO 需要本地 Office 安装。

如果您所做的只是添加数据,您可以使用 Access 的数据库驱动器 ACE 和 OLEDB 访问 Excel 文件。 Writing to Excel with OLEDB

OLEDB 对于数据事务来说既快速又轻量,并将 Excel 视为另一个数据库。但是,它无法调整文件的任何其他方面,例如格式。它还可以在直接 SQL 上运行,因此创建自定义 SQL 字符串可能会很痛苦。

不幸的是,这些方法都没有真正支持“仅流式传输”。当打开一个新的 WorkBook 时,Interop 和 VSTO 将在 temp 文件夹中创建一个 WorkBook。此外,如果 OLEDB 没有找到文件,它只会创建一个新文件。

即使有人在办公桌上手动打开 Excel 文件以执行电子表格工作,Office 也会在临时文件夹中创建一个副本。 “保存”按钮只是用临时副本覆盖原件。

因此,如果“永远不要将文件保存到磁盘,即使是临时文件夹”是一项要求,您将不得不探索第三方工具。

“向客户端发送文件”方法与任何其他文件的方法相同。 Excel 在这方面并不特别。下载方式示例:example

【讨论】:

    猜你喜欢
    • 2018-03-15
    • 2017-09-30
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多