我最近开发了一个Windows Form应用程序,它有几个数据网格。我的客户需要将数据导出到 Excel 中。他们使用不同版本的Excel(即2003,2007,2010,2013),但我使用的是Office 2013。我使用了 excel 2013 参考
(Microsoft Excel 15.0 对象库)
在我的程序中。最近,我的客户报告说导出选项不起作用。从我的调查来看,我的应用程序似乎适用于那些使用Office 2013但不适用于以前的Office版本的人。
如何确保我的应用程序在旧版本的 Excel 中运行?
如果您知道所有用户都将拥有 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 年,从未根据不同的版本更改我的代码。
即使根本没有安装 excel,您的应用程序也有一种方法可以工作。您可以使用本机 excel 库,有免费的 .NET 库可用于此目的。
对于XLS格式,您可以使用NPOI和EPPlus for XLSX,这种方法的缺点是,如果您决定采用这种方式,则必须更改现有代码。
EPPlus 将数据表导出到 excel 的示例,来自这个 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巴库拉的帮助
这是我的后期绑定代码,它将适用于所有版本的 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