适用于所有版本的Excel的程序

我最近开发了一个Windows窗体应用程序,它有几个数据网格。 我的客户需要将数据导出到Excel中。 他们正在使用不同版本的Excel(即2003,2007,2010,2013),但我使用Office 2013.我已经使用Excel 2013的参考

(微软excel 15.0对象库)

在我的程序中。 最近,我的客户报告说,出口选项不起作用。 从我的调查看来,我的应用程序对于那些正在使用Office 2013但不适用于以前的Office版本的用户来说工作正常。

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

如果你知道你所有的用户都有excel,那么你可以将你的excel引用转换为“Object”而不是硬编码的excel对象,然后从你的项目中删除这个DLL引用。 这将工作将所有版本的办公室,只要你不使用一些新的function,是不是在旧版本。

例如,而不是这个:

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年,不用根据不同的版本改变我的代码。

即使没有安装excel,您的应用程序也可以运行。 你可以使用本地的Excel库,有免费的.NET库,你可以用于这个目的。

对于XLS格式,您可以使用NPOI和EPPlus作为XLSX,这种方法的缺点是,如果您决定采取这种方式,您将不得不改变现有的代码。

EPPlus出口DataTable的例子出色,从这个SO 问题 :

 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

感谢您的帮助@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