2

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

(Microsoft excel 15.0 对象库)

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

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

4

3 回答 3

10

如果您知道您的所有用户都将拥有 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 年,从未根据不同的版本更改我的代码。

于 2013-09-18T14:05:13.803 回答
1

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

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

EPPlus 将 DataTable 导出到 excel 的示例,来自这个 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

于 2013-09-18T13:50:38.867 回答
1

感谢您的帮助@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
于 2013-09-19T05:34:53.210 回答