Laden...

[gelöst] savedialog öffnet doppelt

Erstellt von polofreak vor 17 Jahren Letzter Beitrag vor 17 Jahren 7.469 Views
polofreak Themenstarter:in
181 Beiträge seit 2006
vor 17 Jahren
[gelöst] savedialog öffnet doppelt

Hi zusammen ich will aus einem Datagridview in Excel speichern! Es kommen aber immer 2 Savedialoge, was mach ich falsch??


        private void btnExport_Click(object sender, EventArgs e)
        {
            Excel.ApplicationClass excel = new Excel.ApplicationClass();
            excel.Application.Workbooks.Add(true);
            int cIndex = 0;
            foreach (DataGridViewColumn col in dataGridView1.Columns)
            {
                cIndex++;
                excel.Cells[1, cIndex] = col.Name;
            }
            int rIndex = 0;
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                rIndex++;
                cIndex = 0;
                foreach (DataGridViewColumn col in dataGridView1.Columns)
                {
                    cIndex++;
                    if(row.Cells[col.Name].Value!=null)
                    excel.Cells[rIndex + 1, cIndex] = row.Cells[col.Name].Value.ToString();
                }
            }
            SaveFileDialog fileChooser = new SaveFileDialog();
            fileChooser.CheckFileExists = false;

            fileChooser.Filter = "GraphML files (*.xls)|*.xls";
            fileChooser.InitialDirectory = "\\c:";
            fileChooser.RestoreDirectory = true;
            DialogResult result = fileChooser.ShowDialog();
            string filename;

            if (result == DialogResult.Cancel) return;
            filename = fileChooser.FileName;
            if (filename == "" || filename == null)
                MessageBox.Show("ungültiger Dateiname", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            else
            {
                excel.Save(filename);
                MessageBox.Show(filename + " erfolgreich exportiert", "Analyse exportiert", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
        }

vielen Dank schon im Voraus

2.921 Beiträge seit 2005
vor 17 Jahren

Kommt der 2. SaveDialog vielleicht von excel.Save?

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

polofreak Themenstarter:in
181 Beiträge seit 2006
vor 17 Jahren

na kann schon sein. aber wenn ich excel.save aufrufe MUSS ich einen Dateinamen übergeben, und wenn der Savedialog von Excel.Save käme wüsste ich ja in der Zeile den Dateinamen noch nicht!

oder seh ich das falsch??

1.549 Beiträge seit 2004
vor 17 Jahren

du kannst doch einfach einen Namen wie Unbenant1 oder so mitgeben

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

polofreak Themenstarter:in
181 Beiträge seit 2006
vor 17 Jahren

also ich hab alles raus genommen bis auf Excel.Save da kommt schon der Dialog her, aber ich habe als filename "default.xls" angegeben und im Dialog stand wieder nur Tabelle1.xls was kann ich denn dann da angeben? Bzw. wie kann ich diese extrem langsame Saveroutine umgehen??

void Application.Save(object filename)

polofreak Themenstarter:in
181 Beiträge seit 2006
vor 17 Jahren

keiner ne Idee? 🙁

Das ist voll scheiße, bei Excel.Save kommt der Dialog hinter dem Fenster der Applikation, man sieht es also gar nicht und wenn man es am schluss schließt, dann fragt er ob man speichern will, obwohl das file nicht mal angefasst wurde.

Wie macht man das denn ordentlich?

M
104 Beiträge seit 2005
vor 17 Jahren

Hallo polofreak,

habe ich das richtig verstanden? Du brauchst Excel nur, um die Daten als *.xls zu speichern. Wenn Du hier einen anderen Weg gehen könntest, sollte das Problem aus der Welt sein:

Erzeuge aus Deinem Programm heraus eine csv-Datei (Separator ist das ; oder TAB). Diese kannst Du in Excel oder vielen anderen halbwegs moderen (nach 1980 entwickelten) Programmen einlesen.

Gruß
Morpheus

S
1.047 Beiträge seit 2005
vor 17 Jahren

benutz mal die Methode SaveAs wobei du als parameter einen dateinamen angibst. dann kommt auch kein dialog.

der dialog bei save kommt, da dein dokument noch keinen namen hat... du hast es ja neu erstellt.

polofreak Themenstarter:in
181 Beiträge seit 2006
vor 17 Jahren

Hi vielen Dank für eure Tips, doch leider kann ich beides nicht anwenden. CSV geht nicht weil ich das auch noch schön formatieren will und so, und das ist anhand des CSV schlecht möglich, und das SaveAs dachte ich ist die Lösung doch leider gibt es das nicht! es gibt Save und SaveWorkspace. Leider.

vielleicht hat ja noch jemand ne andere Idee, aber bis hierhin schon mal ganz arg viel dankschö!!

S
1.047 Beiträge seit 2005
vor 17 Jahren

und das SaveAs dachte ich ist die Lösung doch leider gibt es das nicht! es gibt Save und SaveWorkspace

Das liegt auch daran das du die völlig falschen Objekte benutzt

excel.Application.Workbooks.Add

gibt dir ein Workbook zurück
damit solltest du arbeiten und das besitzt auch ein methode SaveAs

Ich würd die Vorschlagen diesbezüglich mal die Hilfe von Excel anzuschauen wie das Objektmodell aussieht und welche Objekte bzw. Methoden du benutzen solltest.

Das geht alles Richtung Office Interop eventuell auch dort mal rein schaun in Bezug auf Umgang mit den einzelnen Objekten. Kann dir passieren das Excel im Speicher bleibt obwohl du Quit machst etc.

Am Besten dazu mal im Forum suchen. =)

polofreak Themenstarter:in
181 Beiträge seit 2006
vor 17 Jahren

aber der richtige Weg war es!! Nur muss man erst ein neues Workbook anlegen auf dem kann man dann save oder saveAs oder sogar savecopyas aufrufen!!

VIELEN DANK!!

polofreak Themenstarter:in
181 Beiträge seit 2006
vor 17 Jahren

achso hier noch die Lösung wie ich sie jetzt hab und wie sie funktioniert!


            Excel.ApplicationClass excel = new Excel.ApplicationClass();

            Excel.Workbook workbook = excel.Workbooks.Add(System.Reflection.Missing.Value);
            int cIndex = 0;
            foreach (DataGridViewColumn col in dataGridView1.Columns)
            {
                cIndex++;
                excel.Cells[1, cIndex] = col.Name;
            }
            int rIndex = 0;
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                rIndex++;
                cIndex = 0;
                foreach (DataGridViewColumn col in dataGridView1.Columns)
                {
                    cIndex++;
                    if (row.Cells[col.Name].Value != null)
                        excel.Cells[rIndex + 1, cIndex] = row.Cells[col.Name].Value.ToString();
                }
            }
            SaveFileDialog fileChooser = new SaveFileDialog();
            fileChooser.CheckFileExists = false;

            fileChooser.Filter = "Excel files (*.xls)|*.xls";
            fileChooser.InitialDirectory = "\\c:";
            fileChooser.RestoreDirectory = true;
            DialogResult result = fileChooser.ShowDialog();
            string filename;

            if (result == DialogResult.Cancel) return;
            filename = fileChooser.FileName;
            if (filename == "" || filename == null)
                MessageBox.Show("ungültiger Dateiname", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            else
            {
                 workbook.SaveAs(filename,Excel.XlFileFormat.xlExcel7,null,null,false,false,Excel.XlSaveAsAccessMode.xlNoChange,null,null,null,null); 
                MessageBox.Show(filename + " erfolgreich exportiert", "Analyse exportiert", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 excel.Visible = true; 
            }
        }

S
1.047 Beiträge seit 2005
vor 17 Jahren

Original von polofreak
Nur muss man erst ein neues Workbook anlegen auf dem kann man dann save oder saveAs oder sogar savecopyas aufrufen!!

du hast bereits ein neues angelegt gehabt über

excel.Application.Workbooks.Add(true);

nur hast du nicht mit der rückgegebenen referenz gearbeitet, sondern direkt mit dem excel object...
das funktionert auch, da das excelobjekt einige properties hat die sic hauf das aktuelle worksheet bzw workbook beziehen... nur fehlen halt bestimmte methoden etc.

aber freut mich das du es hinbekommen hast 🙂

deine lösung war also sogut wie richtig. nur kleiner formfehler 🙂