使用EPPlus打开Excel而不保存到文件

4

现在我正在使用 System.Diagnostics.Process.Start(fileInfo); 打开 Excel,以便在将其保存到文件后打开我的软件包。

是否有可能在不必将文件保存到位置的情况下打开 Excel?我希望用户能够决定是否保存该文件。


无法理解你的问题。如何在没有先保存文件的情况下打开文件?请逐步描述你的场景。 - Ewerton
1
@Ewerton 我知道这听起来很奇怪,但是 Excel interop 就是这样工作的。我在想是否有可能用 EPPlus 实现这个功能。 - rgshenoy
3个回答

4

如果您使用EPPlus(或任何其他直接生成文件的库)自动生成文件,则需要在打开它之前保存它。我建议将其仅保存在临时目录中,然后向用户显示并让他们选择如何处理它。

如果您使用Office Automation生成文件,则可以在保存文件之前向用户显示它。


没错!我希望它显示为Book1.xlsx,而不是somefile.xlsx。除非我保存它,否则可能无法实现这一点。我曾经使用PIAs来做到这一点,但由于速度问题,我现在转用EPPlus,所以无法再做到了。 - rgshenoy
2
问题在于EPPlus(以及大多数类似的库)不使用Excel来生成文件。它们接收您提供的所有数据,然后将文件保存为Excel所期望的格式。它们如何在内存中存储完全取决于它们自己。在写入到xlsx文件之前,Excel对数据一无所知。 - Tim Copenhaver
1
我同意Tim Copenhaver的观点,System.Diagnostics.Process.Start会启动一个新的Office进程,就像用户点击.doc、.xls文件一样。EPPlus使用OpenXML格式来创建和操作文件,实际上,它创建了一个特定的XML文件,并将其保存在磁盘上,扩展名为xlsx,因此Windows将其识别为Excel文件。 - Ewerton

0

我知道现在有点晚了,但我也遇到了同样的问题。

我曾经使用 Microsoft.Office.Interop.Excel 将数据导出到一个 xlsx 文件中而不保存它。这样,最终用户可以将其保存或按需要关闭而不保存,文件名会很好地呈现为 Book1.xlsx

我也转向了 EPPlus 来提高我的导出速度,因此,正如您所经历的那样,无法在未保存之前将打开的文件呈现给最终用户。

我采取的方法是使用 SaveFileDialog 组件,在创建 EPPlus 文件之前提示用户输入名称。这至少允许最终用户确定文件应该保存在哪里,而不是使用“硬编码”目录。

Private Sub btnExportXlsxEPPlus_Click(sender As Object, e As EventArgs) Handles btnExportXlsxEPPlus.Click

    Try
        Dim filInf As FileInfo = New FileInfo(GetFileToSave())

        Using excelPackage As ExcelPackage = New ExcelPackage
            excelPackage.Workbook.Properties.Author = "enLIGHTen"
            excelPackage.Workbook.Properties.Title = "enLIGHTen Report"
            excelPackage.Workbook.Properties.Subject = "enLIGHTen export data"
            excelPackage.Workbook.Properties.Created = Date.Now

            Dim worksheet As ExcelWorksheet = excelPackage.Workbook.Worksheets.Add("Sheet 1")
            worksheet.Cells("A1").Value = "My EPPlus spreadsheet!"
            worksheet.Cells(1, 2).Value = "This is cell B1!"
            excelPackage.SaveAs(filInf)
        End Using

        Using excelPackage As ExcelPackage = New ExcelPackage(filInf)
            Dim firstWorksheet As ExcelWorksheet = excelPackage.Workbook.Worksheets(1)
            Dim namedWorksheet As ExcelWorksheet = excelPackage.Workbook.Worksheets("SomeWorksheet")
            Dim anotherWorksheet As ExcelWorksheet = excelPackage.Workbook.Worksheets.FirstOrDefault(Function(x) x.Name Is "SomeWorksheet")
            Dim valA1 As String = firstWorksheet.Cells("A1").Value.ToString
            Dim valB1 As String = firstWorksheet.Cells(1, 2).Value.ToString
            excelPackage.Save()
        End Using

        Dim proc As Process

        Try
            proc = New Process()
            Process.Start(filInf.FullName)
        Catch ex As Exception
            MsgBox("File cannot be opened", MsgBoxStyle.Information, "Cannot open file")
        End Try
    Catch

    End Try
End Sub

Public Function GetFileToSave()
    Dim strFilename As String = ""
    SaveFileDialog1.Filter = "Excel Workbook (*.xlsx)|*.xlsx"
    If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
        strFilename = SaveFileDialog1.FileName
        Return strFilename
    End If
End Function

0

我认为这个答案会对新开发者有所帮助。 我认为在不保存的情况下查看Excel的最佳选项是Microsoft.Office.Interop.Excel

打开Nuget包控制台Install-Package Microsoft.Office.Interop.Excel

创建Excel文件,这里是官方文档Excel

在填写Excel文件的末尾,只需键入app.Visible = true; app是对象名称


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接