【问题标题】:Run Microsoft Excel application from MemoryStream从 MemoryStream 运行 Microsoft Excel 应用程序
【发布时间】:2017-09-26 18:53:02
【问题描述】:

有人知道,是否可以从未保存的文件中打开 Microsoft Excel?例如来自内存流?

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";


using (var ms = new MemoryStream())
{
    //IS IT POSSIBLE TO OPEN EXCEL BUT FROM UNSAVED MEMORYSTREAM?
    //Process.Start(EXCEL MS HERE);
}

或者,将文件保存到某个临时文件夹,然后通过 Excel 打开它,但用户需要“保存”和“另存为”操作。


主要目标:使用准备好的工作表从 C# 代码打开 Microsoft Excel 应用程序,并说用户必须像此文档是新文档一样保存它。

【问题讨论】:

  • VBA for Excel 对您来说可能是一个很好的起点。
  • 这真的会打开 Excel @Trey 吗?
  • 你是在使用 ClosedXML 库还是为了这个?
  • @KSib 不,抱歉误读了代码,该代码是从流中创建新工作表,而不是打开 excel。

标签: c# excel com closedxml


【解决方案1】:

您将使用 Excel 互操作来执行此操作。

using Excel = Microsoft.Office.Interop.Excel;

Excel.Application excel = new Excel.Application();
excel.Visible = true;
Excel.Workbook workbook = excel.Workbooks.Add(Excel.XlSheetType.xlWorksheet);
Excel.Worksheet sheet = workbook.Sheets[1];

sheet.Cells[1, 1] = "Hello World!";

这将在用户计算机上打开 Excel,而不保存工作簿。然后,用户可以选择更改所需的任何内容,然后手动保存工作簿。

【讨论】:

  • 看起来正是我想要的。但我也可以以某种方式预先确定这些名称吗:click here
  • 可以设置sheet.Name
  • 我也可以设置窗口名称here,使用:excel.Windows[1].Caption = "Sample"; 但对我来说最重要的部分是File NameSave 对话框中。
  • 我不确定您如何做到这一点。可能值得为此提出一个单独的问题。
【解决方案2】:

不,没有办法直接从内存中打开工作簿。但是,Application.Workbooks.Open 支持 URL,因此您可以创建一个进程内 HTTP 服务器并以这种方式提供服务。对于大多数目的来说,这可能是矫枉过正。

通常,当我想发送预打包的文档时,我会将文档作为独立文件发送,或者将它们从内存写入临时位置。无论哪种情况,您都希望阻止用户将文件保存在源位置。您可以通过两种方式做到这一点:

  1. (首选)将您的文档作为模板 (.xltx) 而非文档发送,然后使用 Application.Workbooks.Add

    Application.Workbooks.Add "X:\path\to\template.xltx"

  2. 通过将文件设置为只读或使用Application.Workbooks.OpenReadOnly 参数以只读模式打开文档。只读文档可以编辑但不能保存。

    Application.Workbooks.Open "X:\path\to\document.xlsx", , True

【讨论】:

    【解决方案3】:

    我不知道您是否可以通过 MemoryStream 加载 Excel 文件,但您可以执行以下操作:

    1. 在内存中创建 Excel 工作簿
    2. 使用ChangeFileAccessmethod(或您拥有的任何等效项)将工作簿设置为只读。因此,如果他们想要一份副本,就需要保存它。
    3. 将 Excel 工作簿保存到临时目录
    4. 使用Process.Start(...) 以新创建的 Excel 工作簿的参数启动 excel.exe。
    5. 使用Process.WaitForExit(),直到用户完成他们需要做的任何事情
    6. 当 excel 应用程序关闭时,让您的程序删除临时文件。这将是直接在Process.WaitForExit() 之后的代码

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多