我的程序将数据从 Excel 导入/导出到我的数据库/从我的数据库导出数据。您必须选择所需的excel文件并打开文件对话框,然后单击"发送"按钮。
编辑:问题是当我执行导入方法时,它使我的表单显示"无响应"消息。CargarNumero() 方法为每个 INSERT 进行选择和更新(此表有 7K 行)。
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();
}
您需要以一种形式引用另一种形式。您可以在 A 的事件处理程序中创建表单 B 并显示它。您希望在 A 中可见的数据(从 B 开始),您可以填充到列表中,或者其他任何内容并检索它。
另一种方法是使用自定义事件,这些事件将在表单之间发出信号,表明来自 Eventarguments 的数据需要发生某些事情
我在这个线程中找到了解决方案。如果其他人需要帮助。
https://stackoverflow.com/a/11027023/6223629