Principales respuestas
Estoy tratando de importar un documento CSV a un DATAGRIDVIEW en una aplicacion para windows form

Pregunta
-
Buenas tardes, he tratado de importar el contenido de un CSV a un DATAGRIDVIEW , el cual no esta conectado a datos ni a nada. He probado distintos codigos y distintas formas de hacerlo, tambien usando librerias como LumenWorks.Framework.IO.Csv o FileHelpers, pero siempre tengo el mismo problema, y es que se me carga el archivo csv en el DataGridView ( ya que puedo ver que aparecen las filas en mi dataGridView que coinciden exactamente con el tamanio de filas que tengo en el CSV) pero no puedo ver que contiene, es decir veo todo en blanco!
No se como solucionarlo o porqu'e esto ocurre,
Muchisimas gracias a todos
Respuestas
-
Hola Como os dije es un ejemplo que no esta terminado... tengo que limarlo :-)
/// <summary> /// /// </summary> /// <param name="books"></param> /// <param name="sheetName"></param> /// <returns></returns> Excel.Worksheet xlsFindSheet(Excel.Workbook books, string sheetName) { try { foreach(Excel.Worksheet ws in books.Sheets) { if( ws.Name == sheetName) { return ws; } } } catch { } return null; }
En tanto a "cannot convert" ... en el ejemplo estoy buscando un "DateTime", simplemente deberías cambiar el 'type' de 'headToFind' a string. Este argumento es el "texto" que buscaras en el contenido de las columnas/fila 7 en el ejemplo para encontrar un dia concreto...
Imagina esta hoja, en la fila 7 tienes :
6 - Totales - Luines - Martes -
7 - - 14/05/2014 - 15/05/2014En xlsFindColContent, buscas un contenido en la fila 'findRow' empezando en la columna 'startingAt' hasta la columna 'endingAt'
Recuerda adaptar los tipos de datos que tu quieras utilizar.
Saludos,
PepLluis,- Marcado como respuesta Sefvense jueves, 22 de mayo de 2014 7:51
Todas las respuestas
-
Alguien mas que pueda complementar este código:
protected void Page_Load(object sender, EventArgs e) { string directorio = @"C:\DOC\" + DateTime.Now.Year + " " + DateTime.Now.Month + "\\"; string nomArch = directorio + "LIQ18.csv"; GridView1.DataSource = parseCSV(nomArch); GridView1.DataBind(); } public List<string[]> parseCSV(string path) { List<string[]> parsedData = new List<string[]>(); using (StreamReader readFile = new StreamReader(path)) { string line; string[] row; while ((line = readFile.ReadLine()) != null) { row = line.Split(';'); parsedData.Add(row); } } return parsedData; }
Lee el archivo, lo recupera en un List pero a la hora de mostrar solo muestra una especie de estructura del archivo, me imagino que hay que aumentar un par de lineas para que funcione, alguien que lo complemente?
Roy Sillerico
-
Creo que es el mismo fallo que tengo yo...!!!
Solo me muestra la estructura pero no el contenido. Pero yo tengo esto otro :
private void button8_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "|*.csv";
if (openFileDialog.ShowDialog()== DialogResult.OK)
{
bool hasHeaders = true; // o false si no tiene encabezados
char delimiter = ','; // o el delimitador que sea
string filePath = openFileDialog.FileName;
using (var textReader = new StreamReader(filePath))
using (var csvReader = new CsvReader(textReader, hasHeaders, delimiter))
{
var dataTable = new DataTable();
dataTable.Load(csvReader);
dataGridView1.DataSource = dataTable;
}
}
} -
El código que puse hace un momento me funciona de maravilla, pero yo lo manipulo como una matriz cualquiera y lo inserto en una BD de la siguiente manera:
List<string[]> vec2 = parseCSV(nomArch); for (int i = 0; i < vec2.Count; i++) { TLIQ_DETALLE_VENTA entDetalleVenta = new TLIQ_DETALLE_VENTA(); entDetalleVenta.FECHA_DETALLE_VENTA = DateTime.Parse(vec2[i][0]); entDetalleVenta.NIT_CLIENTE_DETALLE_VENTA = long.Parse(vec2[i][1]); entDetalleVenta.NOMBRE_CLIENTE_DETALLE_VENTA = vec2[i][2]; entDetalleVenta.PROCEDENCIA_DETALLE_VENTA = vec2[i][3]; entDetalleVenta.PLACA_DETALLE_VENTA = vec2[i][4]; entDetalleVenta.NRO_FACTURA_DETALLE_VENTA = int.Parse(vec2[i][5]); entDetalleVenta.NRO_AUTORIZACION_DETALLE_VENTA = long.Parse(vec2[i][6]); entDetalleVenta.NRO_CODIGO_CONTROL_DETALLE_VENTA = vec2[i][7]; entDetalleVenta.MONTO_FACTURADO_DETALLE_VENTA = float.Parse(vec2[i][8]); entDetalleVenta.ID_COMBUSTIBLE_DETALLE_VENTA = vec2[i][9]; entDetalleVenta.LITROS_FACTURADO_DETALLE_VENTA = float.Parse(vec2[i][10]); entDetalleVenta.PRECIO_LITRO_DETALLE_VENTA = float.Parse(vec2[i][11]); entDetalleVenta.ID_OPERADOR_DATALLE_VENTA = Session["codEESS"].ToString(); CDetalleVenta objDetalleVenta = new CDetalleVenta(); objDetalleVenta.AgregarDetalleVenta(entDetalleVenta); }
Tal vez puedas manipularlo de una manera parecida.
Roy Sillerico
-
yo en realidad del documento CSV lo que quiero cargar toda la fila 3 en un DataGRIDVIew y de la fila 7 en adelante en otro DataGridView. Pero es que directamente si no puedo cargar el archivo a pelo no se como probar a hacer lo otro.
He intentado poner las columnas y filas detalladamente como haces tu, pero pasa lo mismo... no visualizo nada Pero se que toma los valores porque poniendo el breakpoint en el codigo veo como va cogiendo el valor que tengo en el excell pero luego no lo puedo ver en el DataGridView...
-
-
-
Hola Sefense,
Este es un ejemplo recurrente, que algunas personas necesitan.
Estaba terminando un "helper" para un amigo que me pidió hacerlo a partir de un interop.10 de Excel.Se trata de abrir el .csv por detrás como si fuera un Excel y a partir de hay poder rellenar el DGV de forma personalizada con las columnas/filas que quieras.
Si te interesa, puedo colgar provisionalmente el código en mi blog... mientras termino un ejemplo completo.
Ya me avisaras.
PepLluis, -
-
Aquí tienes... cualquier duda comentamos.
PD. Si lo necesitáis... con un poco de tiempo os lo posteo en C#- Editado Pep Lluis miércoles, 21 de mayo de 2014 13:18
- Propuesto como respuesta Martin Fabregues miércoles, 21 de mayo de 2014 13:22
- Marcado como respuesta Sefvense miércoles, 21 de mayo de 2014 16:47
- Desmarcado como respuesta Sefvense miércoles, 21 de mayo de 2014 17:00
-
Estoy tratando de pasar el codigo a c#
tengo dos fallos : uno en este metodo
principalmente porque no se como definir wb para que no de error..
Function xlsFindSheet(books As Excel.Workbook, sheetName As String) As Excel.Worksheet Try For Each wb In workbook.Sheets If CType(wb, Excel.Worksheet).Name = sheetName Then Return wb End If Next Return Nothing Catch ex As Exception Return Nothing End Try End Function
y el otro en esta linea :
Dim fromColA As Integer = xlsFindColContent(headToFind, rowSecondColTitle, 4, 10)
aqui me dice :
Argument 1: cannot convert from 'System.DateTime' to 'string' Refiriendose a headToFind
y acto seguido me dice que los argumentos no son validos.
Muchas Graaciaas
-
Hola Como os dije es un ejemplo que no esta terminado... tengo que limarlo :-)
/// <summary> /// /// </summary> /// <param name="books"></param> /// <param name="sheetName"></param> /// <returns></returns> Excel.Worksheet xlsFindSheet(Excel.Workbook books, string sheetName) { try { foreach(Excel.Worksheet ws in books.Sheets) { if( ws.Name == sheetName) { return ws; } } } catch { } return null; }
En tanto a "cannot convert" ... en el ejemplo estoy buscando un "DateTime", simplemente deberías cambiar el 'type' de 'headToFind' a string. Este argumento es el "texto" que buscaras en el contenido de las columnas/fila 7 en el ejemplo para encontrar un dia concreto...
Imagina esta hoja, en la fila 7 tienes :
6 - Totales - Luines - Martes -
7 - - 14/05/2014 - 15/05/2014En xlsFindColContent, buscas un contenido en la fila 'findRow' empezando en la columna 'startingAt' hasta la columna 'endingAt'
Recuerda adaptar los tipos de datos que tu quieras utilizar.
Saludos,
PepLluis,- Marcado como respuesta Sefvense jueves, 22 de mayo de 2014 7:51
-
-
Ok Si lo único que quieres hacer es leer un rango de columnas en una fila concreta... lo único que tienes que hacer es crear un dataset con las columnas correspondientes y añadirles una fila con las celdas de cada columna.
Espero que esto te sirva:
public DataTable miSeleccionExcel() { Excel.Worksheet ws = workbook.Sheets["Hola 1"]; DataTable miSeleccion = new DataTable("Resultados"); miSeleccion.Columns.Add("Columna 1"); int desdeLaColumna = 0; int hastaLacolumna = 10; int numeroDeFila = 1; for (int Index = desdeLaColumna; Index < hastaLacolumna; Index++) { miSeleccion.Rows.Add(ws.Cells[numeroDeFila,Index].Value.ToString()); } return miSeleccion; }
Saludos,
PepLluis, -
Hola PepLluis, segun lo que yo tengo, seria por tanto algo asi:
private void button8_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "|*.csv";
if (openFileDialog.ShowDialog()== DialogResult.OK)
{Excel.Worksheet ws = workbook.Sheets["Example"]; //NullReferenceException Was unhandled , Object reference not set to an instance of an object
DataTable miSeleccion = new DataTable();
miSeleccion.Columns.Add("Columna 1");
int desdeLaColumna = 0;
int hastaLacolumna = 10;
int numeroDeFila = 6;
for (int Index = desdeLaColumna; Index < hastaLacolumna; Index++)
{
miSeleccion.Rows.Add(ws.Cells[numeroDeFila, Index].Value.ToString());
}
return;}
Pero como especifico que lo quiero pasar al DataGridView ?
Y me da el error comentado..
Muchisimas gracias por todo.
Un saludo
- Editado Sefvense jueves, 22 de mayo de 2014 11:43
-
Hola Sefvense,
Esto parece un serial.. jajajaja!
En Excel.Worksheets["Example"] le estas pidiendo abrir un sheet llamado "Example" ... si no existe una hoja con ese nombre te dara una excepción pues "ws" será null.Para especificarlo de forma genérica "la primera hoja" deberías indicar : Excel.Worksheets[0];
En el ejemplo al datagridview "datasource" le pasaras un datatable que contiene 10 filas correspondientes a las celdas de la fila 6, de la columna 0 a la columna 10.
Si con lo que te explico no es suficiente, pásame un ejemplo de la hoja y montamos el codigo especifico.
Saludos y Suerte!
PepLluis, -
Si existe, exactamente lo que he hecho ha sido poner directamente el nombre de la hoja, pero es que realmente no me aparecen mas hojas, solo esta que seria la primera. Pero me da ese error, haciendo lo que me dices, me aparece tambien el mismo error.
Y es qe no se, porque a ver Tengo dos Datagridview.
El primer datagridView, solo tiene una fila, y lo que quiero poner en este datagridView es exactamente la fila 3 del doc .csv
Y en el otro DataGridView, quiero poner desde la fila 7 del .CSV hasta que se termine el doc .csv
No necesito buscar nada, y por orta parte, la dimension de las columnas de ambos datagridview tamien estan fijadas.
-
Hola!
Siento que te este causando confusión.
Para realizar lo que explicas, solo tienes que abrir el workbook y recorrer el worksheet fila/columna que me describes.Ya que me dices que "si existe" substituye el nombre por :
Excel.Worksheet ws = workbook.Sheets[0];
Cuando dices que las columnas de DGV ya están fijadas, me confundes, pues el datasource del DGV debería ser el resultante 'datatable'.
En otro caso si ya tienes un 'origen' de datos para los DGV deberías abrir i leer (recorrer) el worksheet y asignar directamente los valores que te directamente a las celdas que describes o al datasource que has asignado previamente.
Saludos,
PepLluis,