Excel munkalap frissítése datagridview-val!

Excel munkalap frissítése datagridview-val!
2012-10-08T13:20:31+02:00
2012-10-09T12:24:45+02:00
2022-11-27T01:55:37+01:00
tééé
Egy Excel munkalapot beolvasok egy dataGridView-ba(Ez sikerült is)
public void ImportExcel() { OleDbConnection kapcsolat = new OleDbConnection(); kapcsolat.ConnectionString = "Provider=Microsoft.ACE.OleDb.12.0; Data Source = " + textBox1.Text + "; Extended Properties = "Excel 12.0;HDR=Yes;IMEX=1";"; OleDbCommand command = new OleDbCommand("SELECT * FROM [Munka1$]", kapcsolat); kapcsolat.Open(); OleDbDataAdapter adapter = new OleDbDataAdapter(command); DataSet ds = new DataSet(); adapter.Fill(ds); dataGridView1.DataSource = ds.Tables[0]; }

Na most olyan szeretnék megvalósítani hogy ha a dataGridView celláit módosítom akkor a program bezárásával ezek frissüljenek az Excel munkalapon!
Mutasd a teljes hozzászólást!
How to export DataGridView to excel file
http://dotnetask.com/Resource.aspx?Resourceid=644

A példáknál ciklusban végig lépkedsz a datagridview celláin, majd annak megfelelően beírja az adatokat az excel munkalapon, mindent felülír.

Az, hogy a program bezárásakor, azt gondolom meg tudod oldani, hogy a megfelelő esemény kiváltódásakor hajtódjon végre.
Mutasd a teljes hozzászólást!

  • Ezzel tényleg felülírja!
    Csak egy bajom van hogy én egy openFileDialog-al megnyitok egy Excel munkalapot a datagridview-ba és mikor mentem mindig kiírja hogy "ez a fájl már létezik ezen a helyen kívánja lecserélni!" És ezt kéne megszüntetni csak simán írja felül a a megnyitott Excel munkalapot!

    Sikerült megoldanom!
    Köszi szépen a segítséget!
    Mutasd a teljes hozzászólást!
  • Esetleg ez segíthet, ha előtte kikapcsolod a figyelmeztetéseket:

    xlApp.DisplayAlerts = False;
    Mutasd a teljes hozzászólást!
  • Jaja én is így oldottam meg!
    Mutasd a teljes hozzászólást!
  • Már csak egy baj van vele hogy ha van valami pl.: a munka2 munkalapon akkor annak a tartalmát törli mikor frissítem a munka1-et!!
    Mutasd a teljes hozzászólást!
  • Ehhez látni kellene a kódot is, hogy pontosan mit is csinálsz.
    Mutasd a teljes hozzászólást!
  • igazából annyi a baj hogy egy Excel fájl minden munkalapját kéne frissíteni mert így amit linkeltél az csak 1et módosít a többit meg üres munkalapra frissíti(eltünteti belőle az adatokat).

    public DataTable ExcelTablaKapcsolat(string tablanev, string tabla) { tablanev = lbFileNev.Text; OleDbConnection kapcsolat = new OleDbConnection(); kapcsolat.ConnectionString = "Provider=Microsoft.ACE.OleDb.12.0; Data Source = " + lbFileNev.Text + "; Extended Properties = "Excel 12.0;HDR=No;IMEX=1";"; OleDbCommand command = new OleDbCommand("SELECT * FROM [" + tabla + "]", kapcsolat); kapcsolat.Open(); OleDbDataAdapter adapter = new OleDbDataAdapter(command); DataSet dsExcel = new DataSet(); adapter.Fill(dsExcel); kapcsolat.Close(); return dsExcel.Tables[0]; } public string[] ExcelTablaNevek(string tablanev) { tablanev = lbFileNev.Text; string[] strTablak = new string[100]; Catalog oCatlog = new Catalog(); ADOX.Table oTable = new ADOX.Table(); ADODB.Connection kapcsolat = new ADODB.Connection(); kapcsolat.Open("Provider=Microsoft.ACE.OleDb.12.0; Data Source = " + lbFileNev.Text + "; Extended Properties = "Excel 12.0;HDR=No;IMEX=1";", "", "", 0); oCatlog.ActiveConnection = kapcsolat; if (oCatlog.Tables.Count > 0) { int item = 0; foreach (ADOX.Table tabla in oCatlog.Tables) { if (tabla.Type == "TABLE") { strTablak[item] = tabla.Name; item++; } } } return strTablak; } public void tablanevek(string[] StrTabla) { dtTabla = dt; Tablak = StrTabla; if (!DataTablak) { if (Tablak != null) { for (int tablak = 0; tablak < Tablak.Length; tablak++) { try { cbExceltablak.Items.Add(Tablak[tablak].ToString()); } catch (Exception ex) { } } } } else { if (dtTabla.Rows.Count > 0) { for (int tablak = 0; tablak < dtTabla.Rows.Count; tablak++) { try { cbExceltablak.Items.Add(Tablak[tablak].ToString()); } catch (Exception ex) { } } } } } private void cbExceltablak_SelectedIndexChanged(object sender, EventArgs e) { for (int tablak = 0; tablak < Tablak.Length; tablak++) { int i = tablak; if (cbExceltablak.SelectedIndex == i) { tablaNev = cbExceltablak.Items[i].ToString(); } } if (cbExceltablak.Items.Count > 0) { if (tablaNev != string.Empty) { ValasztottTabla = tablaNev; if ((ValasztottTabla != string.Empty) && (ValasztottTabla != null)) { DataTable dt = ExcelTablaKapcsolat(cbExceltablak.Text, ValasztottTabla); dtgvExcel.DataSource = dt.DefaultView; } } else { MessageBox.Show("Válasszon táblát"); } } } public void ImportExcel() { if (lbFileNev.Text.Trim() != string.Empty) { try { string[] strTables = ExcelTablaNevek(lbFileNev.Text); tablanevek(strTables); cbExceltablak.Visible = true; label1.Visible = true; tsSlinformacio.Visible = true; if (cbExceltablak.Items.Count >= 0) { tsSlinformacio.Text = "Excel munkalapok betöltése sikeresen megtörtént!"; tsSlinformacio.ForeColor = Color.DarkGreen; cbExceltablak.Enabled = true; } else { tsSlinformacio.Text = "Sikertelen betöltés!"; tsSlinformacio.ForeColor = Color.Red; } } catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); } } } public void ExportExcel() { object misValue = System.Reflection.Missing.Value; xlAppExcel = new Excel.Application(); xlWorkBookExcel = xlAppExcel.Workbooks.Add(misValue); xlWorkSheetExcel = xlWorkBookExcel.Worksheets[1]; int i = 0; int j = 0; for (i = 0; i <= dtgvExcel.RowCount - 1; i++) { for (j = 0; j <= dtgvExcel.ColumnCount - 1; j++) { DataGridViewCell cell = dtgvExcel[j, i]; xlWorkSheetExcel.Cells[i + 1, j + 1] = cell.Value; } } xlAppExcel.DisplayAlerts = false; xlWorkBookExcel.SaveAs(opFdMegnyitas.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, false, false, Excel.XlSaveAsAccessMode.xlNoChange, misValue, misValue, misValue, misValue, misValue); xlWorkBookExcel.Close(true, misValue, misValue); xlAppExcel.Quit(); }
    Mutasd a teljes hozzászólást!
  • Szerintem meg nem.

    Amit csinálsz a programban, létrehozol egy új munkafüzetet
    xlWorkBookExcel = xlAppExcel.Workbooks.Add(misValue);

    , majd az első munkalapot
    xlWorkSheetExcel = xlWorkBookExcel.Worksheets[1];

    feltöltöd a datagridview-ból.

    Tehát nem a régi munkafüzetet munkalapjait írod felül.

    Ha több munkalapra szeretnél visszaírni, akkor gondolom ciklusban kellene végiglépkedni az egyes munkalapokon.

    Szóval nem felülírás van. Ha felülírást akarsz, akkor a megnyitott munkafüzetre kell hivatkoznod.
    Mutasd a teljes hozzászólást!
  • Értelek! Szóval:
    nem új munkafüzetet szeretnék létrehozni ha nem a megnyitott munkafüzetre szeretnék felülírást!
    Ez nem akar összejönni!
    Mutasd a teljes hozzászólást!
  • Asszem valahogy így kell megadni az excel appot akkor:

    oExcelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");

    GetActiveObject van ott csak rosszul írja...
    Mutasd a teljes hozzászólást!
  • Fasza!Csak még mindig törli a többi munkalap tartalmát!
    Megnyitom(OK)-->Betölti a munkalapok nevét egy ComboBox-ba(OK)-->A ComBoboxba kiválasztom hogy mely munkalappal akarok dolgozni(OK)-->Betölti azt egy datagridviewbe(OK)-->utána szerkesztem majd mentés és felülírja azt a munkalapot amivel dolgoztam(OK)-->de utána megnyitva az Excel fájlt törli azokról a munkalapokról az adatokat amivel nem dolgoztam!De miért??
    Mutasd a teljes hozzászólást!
  • A fenti kódban erre nem látok magyarázatot, max. csak annyit, hogy mindig az első munkalapot

    xlWorkSheetExcel = xlWorkBookExcel.Worksheets[1]

    írod felül.

    Itt a munkalap nevére kell inkább hivatkozni, amit a comboboxban kiválasztottál:

    xlWorkSheetExcel = xlWorkBookExcel.Worksheets[tablaNev]


    De ha ezt a részt már javítottad másra, akkor passz.
    (Esetleg később lesz időm, majd kipróbálom)

    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd