Foros del Web » Programación para mayores de 30 ;) » .NET »

Duda cargar fichero ado.net

Estas en el tema de Duda cargar fichero ado.net en el foro de .NET en Foros del Web. Buenos dias, Tengo el siguiente código que me ayuda mucho en lo que quiero hacer el otro dia abrí un post para que me dierais ...
  #1 (permalink)  
Antiguo 28/11/2009, 07:03
 
Fecha de Ingreso: noviembre-2009
Mensajes: 26
Antigüedad: 15 años
Puntos: 0
Duda cargar fichero ado.net

Buenos dias,

Tengo el siguiente código que me ayuda mucho en lo que quiero hacer el otro dia abrí un post para que me dierais alguna idea de como importar excels a ms access y he encontrado un codigo que me va casi perfecto, el único problema es que este lee los archivos directamente:


Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
' inicializar el array para los encabezados de columna
Dim aCol() As String = {"Nombre", "Apellido", "Teléfono"}
' cargar el archivo csv en el ListView
'( control listview, path csv, vector, delimitador)
Cargar_Csv(lv, "datos.csv", aCol, ",")

lo que me gustaria es que yo pudiera escoger el archivo en question, ya que hay muchos y no tienen el mismo nombre... podríais hecharme una mano?

Gracias de antemano
Saludos,
Vicpal
  #2 (permalink)  
Antiguo 28/11/2009, 10:44
Avatar de eperedo  
Fecha de Ingreso: septiembre-2009
Ubicación: Perú
Mensajes: 654
Antigüedad: 15 años, 2 meses
Puntos: 16
Respuesta: Duda cargar fichero ado.net

Te refieres a que no siempre será el archivo datos.csv sino que tu harás la elección desde una carpeta?

Si es así puedes usar el control OpenFileDialog.
Código vb.net:
Ver original
  1. Dim ofd As New OpenFileDialog()
  2. ofd.ShowDialog() 'Muestra el cuadro de dialogo para elegir el archivo
Con esto puedes recuperar el nombre del archivo
Código vb.net:
Ver original
  1. Dim ruta_csv As String = ofd.SafeFileName

Cualquier duda avisas
__________________
Eduardo Peredo
Wigoin
  #3 (permalink)  
Antiguo 29/11/2009, 04:06
 
Fecha de Ingreso: noviembre-2009
Mensajes: 26
Antigüedad: 15 años
Puntos: 0
Respuesta: Duda cargar fichero ado.net

Mil gracias,
Lo prouebo e informo! :)


GRACIAS!
  #4 (permalink)  
Antiguo 01/12/2009, 12:55
 
Fecha de Ingreso: noviembre-2009
Mensajes: 26
Antigüedad: 15 años
Puntos: 0
Respuesta: Duda cargar fichero ado.net

Buenas noches... :)

Parece que no es tan facil como pensaba, el caso es que el código está preparado para cargar una sola columna tipo

carlos,peres,4659887


lo mio es mas complicado, a parte de tener cabecera, mi excel, cada campo tiene su columna... no se si será muy complicado perdirselo al código... podeis ayudarme?


gracias de antemano...

pego el codigo del windowsapllication :)


Option Explicit On

Imports System.Array
Imports System.IO
Imports System.Data.OleDb

Public Class Form1

Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
' inicializar el array para los encabezados de columna
Dim aCol() As String = {"fecha_import", "incidentfile", "VIM", "type", "fecharegistro", "nombre_archivo"}
Dim ofd As New OpenFileDialog()
ofd.ShowDialog()
End Sub

Private Sub Cargar_Csv( _
ByVal lv As ListView, _
ByVal sPathCsv As String, _
ByVal aColumnHeader As String(), _
ByVal sDelimitador As String)
Try

' verificar que la ruta sea correcta
If File.Exists(sPathCsv) = False Then
MsgBox("No se encontró el archivo: " & sPathCsv)
Exit Sub
End If

With lv

.Columns.Clear() ' eliminar todos los encabezados
.Items.Clear() ' eliminar todos los items cargados

' recorre el vector y añade las cabeceras
For i As Integer = 0 To UBound(aColumnHeader)
.Columns.Add(aColumnHeader(i)).ToString()
Next
.View = View.Details ' vista detalle

' Abre el archivo para leer cada línea
Dim sr As New StreamReader(sPathCsv)
Dim aDatos() As String ' vector para el cvs

' recorrer todas las líneas hasta el final del archivo
Do While (sr.Peek >= 0)
' leer la línea y separar los datos con split
aDatos = sr.ReadLine.Split(sDelimitador)

' listview: Añadir los items y SubItems
''''''''''''''''''''''''''''''''''''''''''''''''
Dim Item As New ListViewItem(aDatos(0).ToString)
For i As Integer = 1 To UBound(aDatos)
With Item
.SubItems.Add(aDatos(i).ToString)
End With
Next
.Items.Add(Item)
Loop
sr.Close() ' cierra el streamReader
End With
' error
Catch ex As Exception
MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
End Try
End Sub

Private Sub Button2_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click

Try

If lv.Items.Count = 0 Then
MsgBox("No hay datos para agregar", MsgBoxStyle.Information)
Exit Sub
End If

' Inicializar y abrir la conexión a la base de datos
Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=datos.mdb")
cn.Open()

' inicializar el comando para insertar los registros
Dim Comando As New OleDbCommand()
Comando.Connection = cn ' asigna la conexión al OleDbCommand

' Recorrer los items
With lv
For i As Integer = 0 To .Items.Count - 1
' sql
Comando.CommandText = "INSERT INTO " & _
"tContactos(Nombre,Apellido,Telefono) " & _
"Values('" & .Items(i).Text & _
"','" & .Items(i).SubItems(1).Text & _
"','" & .Items(i).SubItems(2).Text & _
"')"
' Ejecutar el sql
Comando.ExecuteNonQuery()
Next
MsgBox("Listo", MsgBoxStyle.Information, "Exportar a Access")
End With
' cierra la conexión
cn.Close()
' errores
Catch ex As Exception
MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
End Try
End Sub

Private Sub Form1_Load( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Button1.Text = "Leer Csv en Listview"
Button2.Text = "Exportar a Ms Aceess"
End Sub

Private Sub lv_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lv.SelectedIndexChanged

End Sub
End Class
  #5 (permalink)  
Antiguo 01/12/2009, 13:17
Avatar de eperedo  
Fecha de Ingreso: septiembre-2009
Ubicación: Perú
Mensajes: 654
Antigüedad: 15 años, 2 meses
Puntos: 16
Respuesta: Duda cargar fichero ado.net

No entiendo... tu duda es cómo elegir un archivo csv o cómo leerlo/trabajarlo dentro de .NET??

Saludos.
__________________
Eduardo Peredo
Wigoin
  #6 (permalink)  
Antiguo 01/12/2009, 13:34
 
Fecha de Ingreso: noviembre-2009
Mensajes: 26
Antigüedad: 15 años
Puntos: 0
Respuesta: Duda cargar fichero ado.net

:) perdón, me cuesta un poco explicarme...

Ahora ya lee el archivo perfectamente, pero el código esta preparado para leer texto plano es decir campos separados por comas, y mi cvs tiene su cabecera con sus columnas, mi pregunta es si puedo usar este mismo codigo o ADO no me da la posibilidad de cargar un csv con columnas y datos...

gracias por la paciencia y por ayudarme!
  #7 (permalink)  
Antiguo 01/12/2009, 15:04
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 16 años
Puntos: 5
Respuesta: Duda cargar fichero ado.net

Lo que tu estas usando para leer tu excel (csv) es un datareader....

hay otra forma mas facil de leer un excel. te doy aca unejemplo que esta en C# (es facil transformarlo a VB)

Código:
            Excel._Application xlApp;
            Excel._Workbook xlLibro;
            Excel._Worksheet xlHoja;
            Excel.Sheets xlHojas;
            Excel.Range xlRango = null;

            xlApp = new Excel.Application();
            xlLibro = xlApp.Workbooks.Open(sArchivo, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            xlHojas = xlLibro.Sheets;
            xlHoja = (Excel._Worksheet)xlHojas[sHojaTrabajo];

            xlApp.Visible = false;
            xlApp.ScreenUpdating = false;
            xlApp.DisplayAlerts = false;
Para usar este ejemplo, debes agregar una referencia a tu proyecto (interop.Excel)

la variable sArchivo, contiene el path y nombre del excel a leer.
despues de esto, para comprobar que tu excel trae todas las columnas necesarias, debes recorrer el objeto excel creado con una sentencia for como esta:

Código:
for (Int32 iFila = 1; iFila < xlHoja.UsedRange.Rows.Count; iFila++)
{
..... aca analizas las celdas del archivo 

// por ejemplo, con esto lees el valor de una celda

                        object oObject = ((Microsoft.Office.Interop.Excel.Range)xlHoja.Cells[iFila, iColumna]).Value2;
                        if (oObject == null)
                        {
                            continue;
                        }
}

ahora respecto de poder elegir un archivo.... como te comentaba eperedo anteriormente, puedes utilizar el OpenFileDialog... esto te entrega como resultado, el path del archivo.
como adicional, puedes incluso ser mas especifico, y poner codigo en tu aplicacion para seleccionar una de las hojas dentro de tu libro.

espero te haya sido de ayuda
Saludos
Plch
  #8 (permalink)  
Antiguo 02/12/2009, 11:54
 
Fecha de Ingreso: noviembre-2009
Mensajes: 26
Antigüedad: 15 años
Puntos: 0
Respuesta: Duda cargar fichero ado.net

Buenas tardes de nuevo,

Esta es la comversión que he hecho con un tool de la red, y bueno, visual también me ha ayudado, creo que es correcta, pero tengo dos problemillas :) primero pego el código:

Código:
Private Sub Cargar_Csv(_
        Dim xlApp As Excel._Application
        Dim xlLibro As Excel._Workbook
        Dim xlHoja As Excel._Worksheet
        Dim xlHojas As Excel.Sheets
        Dim xlRango As Excel.Range = Nothing
        With
            .xlApp = New Excel.Application()
            .xlLibro = xlApp.Workbooks.Open(sArchivo, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, _
            Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, _
            Missing.Value, Missing.Value, Missing.Value)
            .xlHojas = xlLibro.Sheets
            .xlHoja = DirectCast(xlHojas(sHojaTrabajo), Excel._Worksheet)
            .xlApp.Visible = False
            .xlApp.ScreenUpdating = False
            .xlApp.DisplayAlerts = False

    End Sub
Bien, sArchivo y sHojaTrabajo, me dice que no se han declarado, y no se si es que me falta alguna referencia, podeis hecharme una mano?

Por otro lado, entiendo que el datareader es esta parte del código la cual voy a sustituir....

Código:
  Private Sub Cargar_Csv( _
        ByVal lv As ListView, _
        ByVal sPathCsv As String, _
        ByVal aColumnHeader As String(), _
        ByVal sDelimitador As String)
        Try

            ' verificar que la ruta sea correcta
            If File.Exists(sPathCsv) = False Then
                MsgBox("No se encontró el archivo: " & sPathCsv)
                Exit Sub
            End If
Es así? perdonad, no pretendo que me lo hagais todo, pero si necesito ayuda, acabo de empezar, y la parte gráfica la llevo bastante bién, pero el código me lleva un poco de cabeza...

gracias por la paciencia y por la ayuda! :)

Saludos
  #9 (permalink)  
Antiguo 02/12/2009, 12:05
Avatar de eperedo  
Fecha de Ingreso: septiembre-2009
Ubicación: Perú
Mensajes: 654
Antigüedad: 15 años, 2 meses
Puntos: 16
Respuesta: Duda cargar fichero ado.net

Según la propia explicación de Porlachucha (vaya nick eh! XD)
Cita:
Para usar este ejemplo, debes agregar una referencia a tu proyecto (interop.Excel)
la variable sArchivo, contiene el path y nombre del excel a leer.
Reemplazalo por la ruta de tu archivo.

sTrabajo puede ser el nombre de la hoja en la que se trabajará, bueno no estoy muy seguro de eso.

__________________
Eduardo Peredo
Wigoin
  #10 (permalink)  
Antiguo 02/12/2009, 12:45
 
Fecha de Ingreso: noviembre-2009
Mensajes: 26
Antigüedad: 15 años
Puntos: 0
Respuesta: Duda cargar fichero ado.net

ui! ui! ui! perdón... sArchivo me queda claro, como me dijiste eperedo, recuperando el nombre del archivo cuando lo cargue ya tengo el sArchivo, a ver si se declarar la variable y recuperar el nombre, sino... :( os pregunto....

Por otro lado es correcto sustitur un control por el que me ha pasado porlachucha?

gracias de nuevo....
  #11 (permalink)  
Antiguo 02/12/2009, 14:29
 
Fecha de Ingreso: noviembre-2009
Mensajes: 26
Antigüedad: 15 años
Puntos: 0
Respuesta: Duda cargar fichero ado.net

Holas,

Este es el código que estoy intentado hacer jejeej, no se si fufará... :( de todos modos, el nombre del archivo puede ser diferente, y me gustaria que así fuera... si recupero la ruta, como separo el nombre del archivo de la ruta?... aiiins, que chungo por favor... no hay ningun codigo ya escrito para esto? ... :(


Código:
    

Public Class Form1
    Private Sub Button1_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
        ' inicializar el array para los encabezados de columna
        Dim aCol() As String = {"fecha_import", "incidentfile", "VIM", "type", "fecharegistro", "numeroincidencia", "operatorhf", "RA", "fixed_cost", "cost_kms", "type_cost", "days", "cost_replace", "ve,icle_recovery", "acommodation", "home_jur", "jurney", "vehicle_storage", "taxi", "Other", "Tot_no_vat", "Tot_vat", "comments", "nombre_archivo"}
        Dim ofd As New OpenFileDialog()
        ofd.ShowDialog()
        Dim ruta_csv As String = ofd.SafeFileName
    End Sub

Private Sub Cargar_Csv( _
        ByVal xlApp As Excel._Application)
        Dim Button1 As System.Object
        Dim xlLibro As Excel._Workbook
        Dim xlHoja As Excel._Worksheet
        Dim xlHojas As Excel.Sheets
        Dim xlRango As Excel.Range = Nothing
        Dim ruta_csv As String = Nothing
        With Button1
            .xlApp = New Excel.Application()
            .xlLibro = xlApp.Workbooks.Open(ruta_csv, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, _
            Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, _
            Missing.Value, Missing.Value, Missing.Value)
            .xlHojas = xlLibro.Sheets
            .xlHoja = DirectCast(xlHojas(), Excel._Worksheet)
            .xlApp.Visible = False
            .xlApp.ScreenUpdating = False
            .xlApp.DisplayAlerts = False
        End With

    End Sub
graxxx
  #12 (permalink)  
Antiguo 04/12/2009, 02:21
 
Fecha de Ingreso: noviembre-2009
Mensajes: 26
Antigüedad: 15 años
Puntos: 0
Respuesta: Duda cargar fichero ado.net

ui! que ha pasado? he hecho algo mal? :(
  #13 (permalink)  
Antiguo 04/12/2009, 07:41
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 16 años
Puntos: 5
Respuesta: Duda cargar fichero ado.net

como separo el nombre del archivo de la ruta?...

hay varias formas de lograr esto...
en un ciclo for, buscas llos indices en los que aparece la secuencia \\ en el path. cuando estos caracteres dejen de aparecer, la ultima posicion, te marca el fin del path, y el comienzo del nombre.

algo asi

Código:
for (icont = 0; icont < path.length; icont++)
{
    int iPos = path.IndexOf("\\");
    iUltPos = iPos; // guarda la posicion de la ultima ocurrencia encontrada
    if (iPos == 0)
    {
         // en iUltPos esta el indice de donde termina el path, y donde comienza el nombre del archivo... 
        sNombreArchivo = path.SubString(iUltPos, patrh.length - 1);
         break;
     }
}
Saludos
PLCH

pd: el codigo es C#
Pd2: el nick obedece a un cierto grado de frustracion al momento de querer registrarme en una pagina hace algunos años
  #14 (permalink)  
Antiguo 14/12/2009, 13:44
 
Fecha de Ingreso: noviembre-2009
Mensajes: 26
Antigüedad: 15 años
Puntos: 0
Respuesta: Duda cargar fichero ado.net

Buenas Porlachucha,

Necesito un poco más de ayuda, te he mandado un mensaje privado, a ver si puedes ayudarme...

gracias de antemano
Saludos,
  #15 (permalink)  
Antiguo 15/12/2009, 12:33
 
Fecha de Ingreso: noviembre-2009
Mensajes: 26
Antigüedad: 15 años
Puntos: 0
Respuesta: Duda cargar fichero ado.net

Buenas de nuevo...
sigo encabezonado, tengo que definir las variables, pero no se que tipo de archivo són.. estas són las que yo he definido:

Código:
Private Sub Cargar_Csv( _
        ByVal xlApp As Excel._Application)
        Dim Path As String
        Dim icont As System.Object
        Dim Button1 As System.Object
        Dim xlLibro As Excel._Workbook
        Dim xlHoja As Excel._Worksheet
        Dim xlHojas As Excel.Sheets
        Dim xlRango As Excel.Range = Nothing
        For icont = 0 To Path.Length - 1
        Next
        Dim iPos As Integer = Path.IndexOf("\")
y me da error:

Error 1 No se ha declarado el nombre 'iUltPos'.

y este sigue dandome error en xlHojas, supongo que tiene que ver con lo anterior...

Error 2 No se ha especificado ningún argumento para el parámetro 'Index' de 'Public ReadOnly Default Property _Default(Index As Object) As Object'

a ver si podeis orientarme...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:45.