Office.Interop.Excel - 为什么我需要在服务器上打开Excel?

时间:2015-03-02 18:22:35

标签: vb.net interop office-interop excel-interop

我获得了一个遗留项目,它使用Microsoft.Office.Interop.Excel [11.0.0.0]来导入和导出文件。在服务器上,必须运行MS Excel才能使导入/导出工作。通过运行我的意思是有人必须登录服务器并通过开始菜单打开Excel(是的,它是那么糟糕!)。有谁知道为什么需要保持开放?进口/出口非常不稳定,需要关闭并重新开放,每天两次,因为它不断崩溃。

这是代码,请注意......这太可怕了!

 objExcelApp = New Excel.Application()
            objExcelApp.DisplayAlerts = False
            objExcelBook = objExcelApp.Workbooks.Open(strExcelFileName, Password:="")
            If objExcelBook.Sheets.Count > 0 Then
                objExcelWorkSheet = CType(objExcelBook.Sheets(1), Excel.Worksheet)
                objExcelWorkSheet.Name = gstrDEFAULTSHEETNAME 'Rename the sheet
                objExcelRangeHeader = CType(objExcelWorkSheet.Rows(1), Excel.Range)
                objExcelWorkSheet.Cells.Interior.ColorIndex = Excel.XlColorIndex.xlColorIndexNone

                objExcelRangeFormat = objExcelWorkSheet.UsedRange
                intColumn = objExcelRangeFormat.Columns.Count

                For intColumnCount = 1 To intColumn
                    objColumnRange = CType(objExcelRangeHeader.Columns(intColumnCount), Excel.Range)
                    objColumnRange.EntireColumn.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.White)
                    objColumnRange.EntireColumn.ClearFormats()
                    objColumnRange.EntireRow.ClearFormats()
                Next
                With objExcelWorkSheet
                    .Name = gstrSHEET_EXCEL
                    .Rows.Range("1:1").Font.Bold = True
                    .Rows.Range("1:1").Font.Color = RGB(0, 0, 255)
                    .StandardWidth = 50
                    .Cells.WrapText = True                    
                    .EnableOutlining = True
                End With

            End If


            objCountLink = CType(objExcelBook.LinkSources(), Object)
            If Not IsNothing(objCountLink) Then
                If (objCountLink.ToString.Length > 0) Then
                    lblErrorMessage.Visible = True
                    lblErrorMessage.InnerHtml = "<li> The spreadsheet you trying to import contains external links. Please ensure all links have been removed before attempting to import </li>"
                    objExcelBook.Close()
                    objExcelApp.Workbooks.Close()
                    objExcelApp.Quit()
                    objExcelApp = Nothing
                    Exit Sub
                End If
            End If
            objExcelBook.Save() 'Save the excel
            objExcelBook.Close()
            objExcelApp.Workbooks.Close()
            objExcelApp.Quit()
            objExcelApp = Nothing

1 个答案:

答案 0 :(得分:3)

如果只处理打开的XML文件,请考虑使用Open XML SDK。或者您可以考虑使用为服务器端执行而设计的任何其他商业组件。

Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office在此环境中运行Office时,可能会出现不稳定的行为和/或死锁。

如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。

您可以在Considerations for server-side Automation of Office文章中详细了解相关内容。