Laden...

Excel speichern

Erstellt von w1z4rd2003 vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.443 Views
w1z4rd2003 Themenstarter:in
624 Beiträge seit 2006
vor 13 Jahren
Excel speichern

Hallo,

Mittels untenstehenden Code lese ich die Zelle A1 aus was auch funktioniert.
Danach ändere ich den Wert auf "hallo" und speichere es ab.
Es erscheint auch den Popup der mir fragt ob ich es überschreiben will. Nachdem ich auf ok klicke ändert sich aber die Datei nicht. Das änderungsdatum ist auch noch das alte.

hier der code, was fehlt da noch?


        private void button1_Click(object sender, EventArgs e)
        {
            // benötigte Objekte vorbereiten
            Microsoft.Office.Interop.Excel.Application excel = null;
            Workbook wb = null;
            try
            {
                // Excel starten
                excel = new Microsoft.Office.Interop.Excel.Application(); 
                excel.Visible = false;
             
                string dateiname = "c:\\temp\\excel.xlsx";
                // Datei öffnen
                wb = excel.Workbooks.Open(
                    dateiname,
                    ExcelKonstanten.UpdateLinks.DontUpdate,
                    ExcelKonstanten.ReadOnly,
                    ExcelKonstanten.Format.Nothing,
                    "", // Passwort
                    "", // WriteResPasswort
                    ExcelKonstanten.IgnoreReadOnlyRecommended,
                    XlPlatform.xlWindows,
                    "", // Trennzeichen
                    ExcelKonstanten.Editable,
                    ExcelKonstanten.DontNotifiy,
                    ExcelKonstanten.Converter.Default,
                    ExcelKonstanten.DontAddToMru,
                    ExcelKonstanten.Local,
                    ExcelKonstanten.CorruptLoad.NormalLoad);
                
                // Arbeitsblätter lesen
                Sheets sheets = wb.Worksheets;
             
                // ein Arbeitsblatt auswählen…
                Worksheet ws = (Worksheet)sheets.get_Item("ZZ2export-users");
                // …oder eine Zelle
                Range range = (Range)ws.get_Range("A1", "A1");
                // deren Wert auslesen
                string zellwert = range.Value2.ToString();
                range.Value2 = "hallo";

                wb.Save();

            }
            finally
            {
                wb.Close(false, "excel.xlsx", null);
                excel.Quit();
            }
        }

Gelöschter Account
vor 13 Jahren

Na du öffnest die Datei offensichtlich ReadOnly

excel.Workbooks.Open(
dateiname,
ExcelKonstanten.UpdateLinks.DontUpdate,
ExcelKonstanten.ReadOnly,

Vermutlich tritt eine Exception bei der letzte Zeile auf

wb.Save();

Da du aber nur einen Try Finally Block hast ohne Catch kriegst
du das garnicht mit.

w1z4rd2003 Themenstarter:in
624 Beiträge seit 2006
vor 13 Jahren

Hallo Sebastian.Lange,

Danke für deine Antwort.
Ich hab mal das ReadOnly auf ReadWrite gesetzt und ein try catch gemacht.
Exceptino wirft er keine, er fragt mir beim wb.save ob ich das dokument überschreiben will und wenn ich ja klicke geht er weiter bis zum schluss.

Das dokument wird jedoch nicht geändert. Das Datum bleibt auch noch immer das selbe.

2.891 Beiträge seit 2004
vor 13 Jahren

Hallo w1z4rd2003,

hast du mal den Zugriff über OleDb ausprobiert?
Hier mal ein Snippet:


string fileName = "Mappe-"+DateTime.Now.Ticks+".xlsx";
string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="""+fileName+@""";Extended Properties='Excel 12.0 Xml;HDR=Yes;'";
//string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="""+fileName+@""";Extended Properties=""Excel 8.0;HDR=Yes""";

using (OleDbConnection oleDbConnection = new OleDbConnection(connectionString))
{
	oleDbConnection.Open();

	using (OleDbCommand oleDbCommand = oleDbConnection.CreateCommand())
	{
		oleDbCommand.CommandText = "CREATE TABLE [Tabelle6]([Text] Char,[Zahl] Integer,[Zahl2] Double,[Datum] Date)";
		oleDbCommand.ExecuteNonQuery();
	}
#if false
	using (OleDbCommand oleDbCommand = oleDbConnection.CreateCommand())
		for (int i=0;i<500;i++)
		{
			// Achtung: Tabellenblatt NICHT mit Postfix '$' referenzieren, sonst sind alle Spalten Textspalten!
			oleDbCommand.CommandText = "INSERT INTO [Tabelle6] ([Text],[Zahl],[Zahl2],[Datum]) VALUES ('EinsZweiDrei',456,78.9012345678901234567890,'"+DateTime.Now+"')";
			oleDbCommand.ExecuteNonQuery();
		}
#else
	for (int i=0;i<500;i++)
		using (OleDbCommand oleDbCommand = oleDbConnection.CreateCommand())
		{
			// Achtung: Tabellenblatt NICHT mit Postfix '$' referenzieren, sonst sind alle Spalten Textspalten!
			oleDbCommand.CommandText = "INSERT INTO [Tabelle6] ([Text],[Zahl],[Zahl2],[Datum]) VALUES (?,?,?,?)";	

			// Achtung: Reihenfolge wie '?' im Insert-Befehl. Parameternamen werden nicht berücksichtigt.
			oleDbCommand.Parameters.AddWithValue("Text","EinsZweiDrei");
			oleDbCommand.Parameters.AddWithValue("Zahl",456);
			oleDbCommand.Parameters.AddWithValue("Zahl2",78.9012345678901234567890);
			oleDbCommand.Parameters.AddWithValue("Datum",DateTime.Now.ToString());						

			oleDbCommand.ExecuteNonQuery();
		}
#endif
	//using (OleDbCommand oleDbCommand = oleDbConnection.CreateCommand())
	//{
	//    oleDbCommand.CommandText = "UPDATE [Tabelle6] SET [Text]='Hallo'";
	//    oleDbCommand.ExecuteNonQuery();
	//}
}

Gelöschter Account
vor 13 Jahren

Der speichert nichts obwohl du Ja klickst ? 🤔

Erstmal: Probier mal die Excel.DisplayAlerts = false um die MessageBoxen die nachfragen abzuschalten. Ich nehme an die willst du nicht unbedingt haben.

Alternativ dazu probier mal die Funktion SaveAs des Workbooks
auch ruhig mal mit einem alternativen Dateinamen um zu schauen ob da irgendwas passiert.

Wenn da garnichts geht dann häng das (entkernte) Projekt doch hier mal an.

w1z4rd2003 Themenstarter:in
624 Beiträge seit 2006
vor 13 Jahren

Hallo Sebastian.Lange,

Leider funktioniert es immer noch nicht. Mit SaveAs läufts irgendwie auch nicht.
Ich hab mal das Projekt angehängt.

Im Code ist beschrieben was ich machen möchte.
Ich hab eine Textfile mit Benutzernamen, jeder Benutzername ist auf eine eigene Zeile, dieses textfile lese ich zeile nach zeile und speichere alle Benutzernamen in eine String Liste.
Danch öffne ich das Excel wo ich in der ersten Spalte alle Benutzernamen habe,
in der zweiten Spalte steht jeweils NEIN oder JA zu jedem Benutzername.

was ich jetzt machen mus ist folgendes:
Durchsuchen ob der erste Eintrag(A1) auch in meine String Liste enthalten ist.
Wenn ja (A2) von NEIN zu JA updaten.

Die Logik steht schon, es geht wirklich nur noch um den letzten Schritt.

Lieber Gruss und Danke
w1z4rd2003

w1z4rd2003 Themenstarter:in
624 Beiträge seit 2006
vor 13 Jahren

Hat funktioniert.
Habe mal das excel anstatt aus dem C:\ aus meiner externe hd gelesen und es hat funktioniert.

Anscheinend ein problem mit den berechtigungen auf dem c:, wobei komisch ist dass keine fehler aufgetreten sind.

Aber vielen dank für die Hilfe!!