Cómo importar datos a Excel más rápido
Este artículo presentará 3 formas de importar datos a Excel:
1. Método básico: copiar celda por celda
2. Utilice el objeto StreamWriter de secuencia de archivos: Escriba la secuencia en el archivo
3. Método para copiar el objeto: copie los datos en la matriz y luego péguelos directamente en el libro de Excel.
Método básico
Usar el método de copia básico llevará mucho tiempo. Los métodos que utilizan secuencias de archivos o copian objetos serán mucho más rápidos que los métodos básicos.
Debes agregar una referencia al objeto COM de Excel a tu aplicación. Voy a declarar dos objetos, Ex de tipo Excel.Application. Ws es del tipo Excel.Worksheet y luego establezca Ws en la primera hoja de trabajo del libro.
Escribiremos código para recorrer los títulos de cada columna de la tabla para mostrar los títulos.
Usamos columnas (índices) para recuperar el título de la columna, el atributo Caption o ColumnName.
Para todos los datos, usaremos dos bucles, uno para fila y otro para columna
Código
Aplicación Microsoft.Office.Interop.Excel. = nuevo Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Worksheet Ws;
Ex.Workbooks.Add(Microsoft.Office .Interop .Excel.XlWBATemplate.xlWBATWorksheet);
Ws= (Microsoft.Office.Interop.Excel.Worksheet)Ex.Worksheets[1];
int Fila = 0;
int Col = 0;
int i = 0;
int j = 0;
pb.Maximum = Ds.Tables[ 0] .Rows.Count;
Fila = 1;
Col = 1;
//'Para encabezado
lblCount. Text = "Generando encabezado.";
this.Refresh();
for (i = 0; i <= Ds.Tables[0].Columns.Count - 1; i++)
{
Ws.Cells[Row, Col] = Ds.Tables[0].Columns[i].Caption;
Col += 1;
}
Fila = 2;
Col = 1;
pb1.Maximum = Ds.Tables [0]. Columns.Count;
lblCount.Text = "Preparándose para exportar datos.";
for (i = 0; i <= Ds.Tables[0]. Rows.Count - 1; i++)
{
//
//PARA TODOS LOS DATOS
//
pb1 .Value = 0;
for (j = 0; j <= Ds.Tables[0].Columns.Count - 1; j++)
{ p>
Ws.Cells[Row, Col] = Ds.Tables[0].Rows[i][j].ToString();
Col += 1;
pb1 .Value += 1;
}
//'Si los datos son más de 65500, establezca ws en la siguiente hoja
if (Fila == 65500) p>
{
Fila = 1;
Ws = (Microsoft.Office.Interop.Excel.Worksheet)Ex.Worksheets[2];
}
Col = 1;
Fila += 1;
lblCount.Text = i + 1 + " : Exportado";
lblCount.Refresh();
pb.Value += 1;
}
pb.Value = 0;
Ex.Visible = true;
MessageBox.Show(Ds.Tables[0].Rows.Count + " : Registros exportados. ");
Ex.Visible = verdadero;
Ej.Salir();
Ejemplo = nulo;
Ws = nulo;
Usar StreamWriter: p>
Este método es más corto y más rápido para importar datos a cualquier tipo de archivo
En este método, usaré el espacio de nombres System.IO y mediante programación iré al .xls especificado. o .doc y otras extensiones para crear directamente una ruta de archivo.
La codificación comienza con la ruta al archivo donde se crea el archivo de Excel y se almacenan los datos. Ahora, declare un objeto IO.StreamWriter con una ruta especificada. En este método, los valores de fila/columna de cada fila se agregan a la cadena con "|" como delimitador. El archivo creado ahora contiene datos de una sola columna separados por "|" (formato CSV).
Código
string filePath = "c:\\SystemIO_Exported_Data_AsOn_" + DateTime.Now.ToShortDateString() + ".xls";
//Stream Writer objeto para escribir la secuencia en el archivo
StreamWriter escritor = new StreamWriter(File.Create(filePath));
string str = string.Empty;
/ /'For Encabezado
lblCount.Text = "Generando encabezado.";
this.Refresh();
for (int i = 0; i < = Ds.Tables[0].Columns.Count - 1; i++)
{
str += Ds.Tables[0].Columns[i].Caption +Constants. vbTab;
}
//Escribe la secuencia en el archivo agregando una nueva línea a la secuencia
str += Microsoft.VisualBasic.Constants.vbNewLine;
escritor.Write(str);
escritor.Flush();
pb.Maximum = Ds.Tables[0].Rows.Count + 1; p> p>
foreach (DataRow dRow en Ds.Tables[0].Rows)
{
str = "";
for ( int col = 0; col <= Ds.Tables[0].Columns.Count - 1; col++)
{
cadena STR1 = "";
char c = Strings.Chr(32);
//char[] sep = " ";
string[] str2 = null;
str2 = dRow [col].ToString().Split(' ');
for (int z = 0; z <= str2.Length - 1; z++)
{
//reemplazando todos los espacios y tabulaciones con '|' (signo de tubería)
string y = str2[z].ToString().Replace(Strings.Chr(32), ' ').Replace(Strings .Chr(13), ' ').Replace(Strings.Chr(10), ' ').Replace(Strings.Chr(9), ' ').Replace("|", " ");
STR1 += y + " ";
}
str += STR1 + "| ";
pb.Value += 1;
}
str += Constants.vbNewLine;
escritor.Write(str);
escritor.Flush(); p> p>
pb.Value = 0;
}
//Cerrar el objeto de escritura de flujo
escritor.Close(); p>
pb.Value = 0;
MessageBox.Show("Datos exportados exitosamente.");
Método de copia del objeto:
Este es otro Un método para importar datos a Excel.
En el código, creamos una matriz bidimensional: object[,] rawData = new object[dt.Rows.Count + 1, dt.Columns.Count] para contener los datos en la tabla de datos.
p>Una vez que los datos se almacenan en una matriz, los pegará en una hoja de cálculo de Excel mediante el método get_Range().value de la hoja de cálculo de Excel.
Código
if (Ds.Tables.Count > 3)
{
MessageBox.Show("Hay más de 3 tabla de datos. Los datos no se pueden exportar.","tip");
return;
}
intsheetIndex = 0;
Microsoft.Office.Interop.Excel.Application Ex = nuevo Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Worksheet Ws;
Microsoft.Office.Interop.Excel.Workbook Wb = Ex.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
Ws = (Microsoft.Office.Interop.Excel.Worksheet) )Ej.Worksheets[1];
// Copia cada DataTable como una nueva Hoja
foreach (System.Data.DataTable dt en Ds.Tables)
{
//En caso de error, reanudar siguiente
int col = 0;
int row = 0;
// Copiar el DataTable a una matriz de objetos
object[,] rawData = new object[dt.Rows.Count + 1, dt.Columns.Count];
lblCount.Text = "Copiando columnas Name.";
this.Refresh();
// Copia los nombres de las columnas a la primera fila de la matriz de objetos
pb1.Maximum = dt .Columns.Count + 1;
pb1.Value = 0;
para (col = 0; col <= dt.Columns.Count - 1; col++)
{
datosraw[0, col] = d
t.Columns[col].ColumnName.ToUpper();
pb1.Value += 1;
}
lblCount.Text = "Copiando datos" ;
this.Refresh();
pb1.Value = 0;
// Copia los valores a la matriz de objetos
pb.Maximum = dt.Rows.Count + 1;
pb.Value = 0;
for (col = 0; col <= dt.Columns.Count - 1 ; col++ )
{
para (fila = 0; fila <= dt.Rows.Count - 1; fila++)
{
rawData[fila + 1, col] = dt.Rows[fila].ItemArray[col];
pb.Value += 1;
}
pb.Value = 0;
pb1.Value += 1;
}
pb.Value = 0;
pb1. Value = 0;
lblCount.Text = "";
this.Refresh();
// Calcula la letra de la columna final
string finalColLetter = string.Empty;
finalColLetter = ExcelColName(dt.Columns.Count);
//Generar nombre de columna de Excel (ID de columna)
sheetIndex += 1;
Ws = (Microsoft.Office.Interop.Excel.Worksheet)Wb.Worksheets[sheetIndex];
Ws.Name = dt.TableName;
p>cadena excelRange = cadena.Format("A1:{0}{1}", finalColLett
er, dt.Rows.Count + 1);
Ws.get_Range(excelRange, Type.Missing).Value2 = rawData;
Ws = null;
}
Wb.SaveAs("C:\\ExportedDataUsingObjectPastingMethod.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel .XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
Wb.Close(true, Type.Missing, Type.Missing);
Wb = null;
// Liberar el objeto Aplicación
Ex.Quit();
Ex = null;
// Recopila los objetos sin referencia
GC.Collect();
Interaction.MsgBox("Exportado exitosamente.", MsgBoxStyle.Information, "Tip");
Utilizo una función para encontrar los nombres de las columnas de la hoja de cálculo de Excel