Visual Basic.NET - Problemas al exportar un DataSet a Excel

   
Vista:
Imágen de perfil de Toni Nerin

Problemas al exportar un DataSet a Excel

Publicado por Toni Nerin (15 intervenciones) el 03/10/2012 16:46:30
Buenas tardes, amigos,

Tengo una clase que me exporta un DataSet a Excel de forma correcta desde una máquina con Windows 7 Profesional, pero desde otra, teóricamente igual, no hay manera.
Desde esta segunda máquina, y utilizando el paso a paso del Debug, genera perfectamente el Excel.

Os adjunto la clase:

=============================================================================
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports System.Reflection

Imports Microsoft.Office.Interop.Excel

Imports config = System.Configuration
Imports ficheros = System.IO
Imports Variables.cVariables

Namespace Exportar
Public Class ExportarDades

Public Sub New()
End Sub

Public Shared Sub Exportar_a_Excel(ByVal Titol As String, ByVal ExcelName As String, ByVal sheets As String, ByVal DS As DataSet)

' Prevenir conflicte d'idiomes. Si no es posa genera aquest error:
' Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")

Try
Dim _excel As New Application()
Dim _wBook As Workbook = _excel.Workbooks.Add(Missing.Value)

Dim idx As Integer = 0
While idx < DS.Tables.Count

Dim _sheet As Worksheet = DirectCast(_wBook.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value), Worksheet)
_sheet.Name = sheets

' Situació del logo —si el tenim— a: A1
Dim imagen As Object = _sheet.Pictures.Insert("C:\Inetpub\wwwroot\Lluisos\Logos\logo.jpg")
Dim cell = _sheet.Cells(1, 1)

'Centrem l'amplada
Dim ancho As Double = cell.Offset(0, 1).Left - cell.Left
imagen.Left = cell.Left + ancho / 2 - imagen.Width / 2
If imagen.Left < 1 Then imagen.Left = 1
'Centrem l'alçada
Dim alto As Double = cell.Offset(1, 0).Top - cell.Top
imagen.Top = cell.Top + alto / 2 - imagen.Height / 2
If imagen.Top < 1 Then imagen.Top = 1

'Suposem que el logo ocupi cinc files..., munten el títol de l' informe a la fila 6 i donem el format establert.
Dim r As Integer = 6
_sheet.Cells(r, 1) = Titol.ToString
Dim rng As Range = DirectCast(_sheet.Cells(r, 1), Range)
rng.EntireRow.Font.Bold = True
rng.EntireRow.Font.Size = 20
rng.EntireRow.Interior.ColorIndex = 30
rng.EntireRow.Font.ColorIndex = 40

'Dues linies mes i muntem les capçaleres de les columnes i donem el format
r += 2
Dim k = 0
While k < DS.Tables(idx).Columns.Count
_sheet.Cells(r, k + 1) = DS.Tables(idx).Columns(k).ColumnName.ToString()
System.Math.Max(System.Threading.Interlocked.Increment(k), k - 1)
End While
rng = DirectCast(_sheet.Cells(r, DS.Tables(idx).Columns.Count), Range)
rng.EntireRow.Font.Bold = True
rng.EntireRow.Interior.ColorIndex = 40
rng.EntireRow.Font.ColorIndex = 30

'I a partir de aquí, muntem totes les dades del DataSet
r = 0
While r < DS.Tables(idx).Rows.Count
k = 0
While k < DS.Tables(idx).Columns.Count
_sheet.Cells(r + 9, k + 1) = DS.Tables(idx).Rows(r).ItemArray(k)
System.Math.Max(System.Threading.Interlocked.Increment(k), k - 1)
End While
System.Math.Max(System.Threading.Interlocked.Increment(r), r - 1)

End While
System.Math.Max(System.Threading.Interlocked.Increment(idx), idx - 1)
End While

If ficheros.File.Exists(ExcelName) Then
ficheros.File.Delete(ExcelName)
End If

' Sortim del Excel
_excel.ActiveCell.Worksheet.SaveAs(ExcelName, XlFileFormat.xlOpenXMLWorkbook, Missing.Value, Missing.Value, Missing.Value, Missing.Value, _
Missing.Value, Missing.Value, Missing.Value, Missing.Value)
_excel.Workbooks.Close()
_excel.Quit()

' Mostrar el excel
_excel.Visible = True

' Matem el proces si quedés obert
deleteProcess("Excel")
Catch ex As Exception
Dim ss As String = ex.Message

' Matem el proces si quedés obert
deleteProcess("Excel")
End Try

End Sub

Private Shared Sub deleteProcess(ByVal Process As String)

Dim miproceso As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName(Process)

For Each pc As System.Diagnostics.Process In miproceso
pc.Kill()
Next

End Sub

End Class
End Namespace
=============================================================================

¿Cómo podria averiguar el porqué no graba el dichoso Excel?

Cualquier ayuda será bienvenida.
Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder