Mein Programm importieren und exportieren Daten von/zu einem Excel zu/von meiner Datenbank. Sie müssen die gewünschte Excel-Datei auswählen und den Dateidialog öffnen und dann auf Senden klicken.Wie vermeidet man "nicht reagiert" Nachricht in einem Formular in einem großen Import von Excel nach SQL-Server
Edit: Das Problem ist, dass, wenn ich importieren Methode, es macht mein Formular zeigt "nicht reagiert" Nachricht. Die CargarNumero() -Methode führt eine Auswahl und eine Aktualisierung für jedes einzelne INSERT durch (diese Tabelle hat 7K Zeilen).
Import
private void importarDatos()
{
DB con = new DB(path);
string tabNombre = "";
string tabApellidos = "";
string tabID = "";
SqlDecimal tabImporte = 0;
int porc = 0;
string year = "";
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(txtFilePath.Text);
Excel._Worksheet xlWorksheet = (Excel._Worksheet)xlWorkbook.Sheets[1];
Excel.Range xlRange = xlWorksheet.UsedRange;
xlRange = xlWorksheet.get_Range("A1", Missing.Value);
xlRange = xlRange.get_End(Excel.XlDirection.xlToRight);
xlRange = xlRange.get_End(Excel.XlDirection.xlDown);
string downAddress = xlRange.get_Address(
false, false, Excel.XlReferenceStyle.xlA1,
Type.Missing, Type.Missing);
xlRange = xlWorksheet.get_Range("A1", downAddress);
object[,] values = (object[,])xlRange.Value2;
int rowCount = values.GetLength(0);
int colCount = values.GetLength(1);
CargaProgreso cp = cargarProgreso();
cp.Show();
if ((cboYear.Visible) && (!cboYear.Text.Equals("")))
{
year = cboYear.Text;
}
else
{
year = DateTime.Now.Year.ToString();
}
for (int i = 2; i <= rowCount; i++)
{
for (int j = 1; j <= colCount; j++)
{
if (j == 1)
{
tabNombre = values[i, j].ToString();
}
else if (j == 2)
{
tabApellidos = values[i, j].ToString();
}
else if (j == 3)
{
tabID = values[i, j].ToString();
}
else
{
tabImporte = Convert.ToDecimal(values[i, j].ToString());
}
}
string query = "INSERT...";
try
{
porc = Convert.ToInt32(i * 100/rowCount);
cp.Progreso.Value = porc;
con.Consulta(query);
Thread.Sleep(1);
con.Cerrar();
cargarNumero();
}
catch (Exception ex)
{
MessageBox.Show("Error en la importación " + ex);
}
}
cp.Close();
MessageBox.Show("Importación de datos completada");
}
Export
private void exportarDatos(Excel.Application xlApp, Excel.Workbook xlWorkbook)
{
SaveFileDialog sfd = new SaveFileDialog();
string ruta = "*";
sfd.InitialDirectory = ruta;
sfd.DefaultExt = "xlsx";
sfd.Filter = "Excel Files |*.xls;*.xlsx;*.xlsm;*.xlsb";
DB con = new DB(path);
int porc = 0;
CargaProgreso cp = cargarProgreso();
cp.Text = "Exportando a Excel...";
SqlDataAdapter da = new SqlDataAdapter("*", con.Conexion);
System.Data.DataTable dt = new System.Data.DataTable();
da.Fill(dt);
DataColumnCollection dcCollection = dt.Columns;
if (!Directory.Exists(ruta))
{
DirectoryInfo di = Directory.CreateDirectory(ruta);
}
DialogResult dialogResult = MessageBox.Show("¿Desea guardar la Copia de seguridad?", "Copia de seguridad", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
if (sfd.ShowDialog() == DialogResult.OK)
{
for (int i = 1; i < (dt.Rows.Count + 1); i++)
{
for (int j = 1; j < (dt.Columns.Count + 1); j++)
{
if (i == 1)
{
xlApp.Cells[i, j] = dcCollection[j - 1].ToString();
}
xlApp.Cells[i + 1, j] = dt.Rows[i - 1][j - 1].ToString();
}
porc = Convert.ToInt32(i * 100/dt.Rows.Count);
cp.Progreso.Value = porc;
}
cp.Close();
xlWorkbook.SaveCopyAs(sfd.FileName);
xlWorkbook.Saved = true;
xlWorkbook.Close();
MessageBox.Show("Copia de Seguridad creada en " + sfd.FileName);
}
}
con.Cerrar();
cp.Close();
}
Nun können Sie Ihre Änderungen nicht sehen, weil Sie cExcel.Close aufrufen, wenn Sie Ausgang aus dem ersten Code. – Steve
Mein Formular (b) hat nur 2 Etiketten und 2 Textbos, um den Fortschritt des Datenimports anzuzeigen. In beiden Fällen wird das Formular angezeigt, aber wo ich das Problem habe, zeigt es weder die Beschriftungen noch die Textfelder (tatsächlich zeigt es nicht einmal die Formateigenschaften der Elemente wie Hintergrundfarbe usw.). – PoteKing