【问题标题】:Program that works in all version of excel适用于所有版本的excel的程序
【发布时间】:2013-09-23 07:19:43
【问题描述】:

我最近开发了一个包含多个数据网格的 Windows 窗体应用程序。我的客户需要将数据导出到 Excel 中。他们使用不同版本的 Excel(即 2003、2007、2010、2013),但我使用的是 Office 2013。我使用了 excel 2013 参考

(Microsoft excel 15.0 对象库)

在我的程序中。最近,我的客户报告说导出选项不起作用。根据我的调查,我的应用程序似乎适用于使用 Office 2013 但不适用于以前的 Office 版本的用户。

我可以做些什么来确保我的应用程序在旧版本的 Excel 中工作?

【问题讨论】:

    标签: vb.net excel officedev


    【解决方案1】:

    如果您知道您的所有用户都将拥有 excel,您可以将您的 excel 引用转换为“对象”而不是硬编码的 excel 对象,然后从您的项目中删除 DLL 引用。这适用于所有版本的 office,只要您不使用旧版本中没有的一些新功能。

    例如,而不是这个:

    Dim _xlApp As Excel.Application
    Dim _xlBook As Excel.Workbook
    

    试试这个:

    Dim _xlApp As Object 'Excel.Application
    Dim _xlBook As Object 'Excel.Workbook
    

    除了 excel 应用程序的实例化之外,一切都一样(除了没有智能):

    _xlApp = CreateObject("Excel.Application") 'New Excel.Application
    

    我已经这样做了 15 年,从未根据不同版本更改我的代码。

    【讨论】:

    • 感谢您的回复。我会试试这个..让你知道是否需要任何帮助。
    • 工作!我完全失去了理智..我在VB6中多次使用这种方法(后期绑定)..
    【解决方案2】:

    即使根本没有安装 Excel,您的应用程序也有一种工作方式。您可以使用本机 excel 库,有免费的 .NET 库可用于此目的。

    对于 XLS 格式,您可以对 XLSX 使用 NPOIEPPlus,这种方法的缺点是如果您决定采用这种方式,则必须更改现有代码。

    将 DataTable 导出到 excel 的 EPPlus 示例,来自此 SO question

    using (ExcelPackage pck = new ExcelPackage(newFile))
    {
      ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Accounts");
      ws.Cells["A1"].LoadFromDataTable(dataTable, true);
      pck.Save();
    }
    

    NPOI 示例请看这里:

    http://dotnetslackers.com/DataSet/re-511450_Export_an_ADO_NET_DataTable_to_Excel_using_NPOI.aspx

    【讨论】:

    • 感谢您的回复..您可以提供任何代码示例(我是新手)
    • 更新了我的答案,但如果您不想更改现有代码,那么史蒂夫的回答就是要走的路
    • 我处理的示例效果很好.. 但我无法更改我项目的整个代码.. 可能我在即将到来的项目中使用这种方法.. 非常感谢您的时间 :)
    【解决方案3】:

    感谢@Steve 和 @Antonio Bakula 的帮助

    这是我的后期绑定代码,适用于所有版本的 excel ..

     Try
                Dim app As Object
                Dim xlbook As Object
                Dim xlsheet As Object
                app = CreateObject("Excel.Application")
                xlbook = app.Workbooks.Add()
                xlsheet = xlbook.ActiveSheet
                app.Visible = True
                Dim iX As Integer
                Dim iY As Integer
                Dim iC As Integer
                Dim iz As Integer
                For iC = 0 To DataGridView1.Columns.Count - 1
                    xlsheet.Cells(1, iC + 1).Value = DataGridView1.Columns(iC).HeaderText
                Next
                iz = 1
                For iX = 0 To DataGridView1.Rows.Count - 1
                    For iY = 0 To DataGridView1.Columns.Count - 1
                        Dim a As String = DataGridView1(iY, iX).Value
                        If a <> Nothing Then xlsheet.Cells(iz + 1, iY + 1).value = DataGridView1(iY, iX).Value.ToString
                    Next
                    iz = iz + 1
                Next
    
                MsgBox("Export Done", MsgBoxStyle.Information, "MODEL AND WARRANTY")
    
                app.Visible = True
                app.UserControl = True
                releaseobject(app)
                releaseobject(xlbook)
                releaseobject(xlsheet)
            Catch ex As Exception
                MessageBox.Show(ex.ToString())
            End Try
    

    提取完成后释放 excel 对象。

    Sub releaseobject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        End Try
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多