2013-09-18 3 views
1

Недавно я разработал приложение Windows Form, которое имеет несколько datagrids. Мой клиент должен экспортировать данные в Excel. Они используют различные версии Excel (т.е. 2003,2007,2010,2013), но я использую офис 2013. Я использовал Excel 2013 ссылкиПрограмма, которая работает во всех версиях excel

(Microsoft Excel библиотека 15,0 объекта)

в моей программе. Недавно мой клиент сообщил, что опция экспорта не работает. Из моего исследования кажется, что мое приложение отлично работает для тех, кто использует Office 2013, но не работает для предыдущих версий Office.

Что я могу сделать, чтобы убедиться, что мое приложение работает в более старых версиях Excel?

ответ

9

Если вы знаете, все пользователи будут иметь первенствовать, вы может преобразовать ваши ссылки excel в «Object» вместо жестко заданных объектов excel, а затем удалить ссылки DLL из вашего проекта. Это будет работать во всех версиях офиса, если вы не используете какую-либо новую функцию, которая не находится в более старых версиях.

Например, вместо этого:

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

Попробуйте это:

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

Все работает одинаково (за исключением не IntelliSence) для конкретизации применения первенствовать за исключением:

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

Я сделал это таким образом в течение 15 лет, не меняя свой код на основе разных версии.

+3

+1 Обратите внимание, что это называется «поздняя привязка». " –

+0

Спасибо за ваш ответ. я попробую это .. дайте знать, если какая-либо помощь требуется. –

+0

Работа! я полностью потерял рассудок. Я использовал этот метод (позднее привязка) много раз в VB6 .. –

1

У вас есть возможность работать с вашим приложением, даже если его нет. Вы можете использовать собственные библиотеки excel, есть бесплатные библиотеки .NET, которые вы можете использовать для этой цели.

Для формата XLS вы можете использовать NPOI и EPPlus для XLSX. Недостатком этого подхода является то, что вам придется изменить существующий код, если вы решите пойти этим путем.

EPPlus пример экспорта DataTable, чтобы преуспеть, из этого 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

+0

Благодарим за отзыв.Есть ли какие-либо образцы кода, которые вы можете предоставить (я новичок в этом) –

+0

обновил мой ответ, но если вы не хотите менять свой существующий код, ответ от Steve - это способ пойти –

+0

Я работал над образцами, которые работали отлично .. Но я не в ситуации, чтобы изменить весь код моего проекта .. Может быть, я использую этот метод в предстоящем проекте .. Большое спасибо за ваше время :) –

1

Спасибо за вашу помощь @Steve и @Antonio Бакула

Вот мой позднего связывания код, который будет работать на всех версиях Эксель ..

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 

Освободить объект первенствовать когда экстракция делается.

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 
Смежные вопросы