2016-12-25 7 views
0

Ich möchte Arbeitsmappe erstellen und dann Daten mit EPPlus schreiben. Wenn ich eine neue Arbeitsmappe erstelle, kann sie erfolgreich erstellt werden. Aber wenn ich einige Daten zu diesem Arbeitsblatt schreiben will, es scheiterte und Fehler sagtEPPlus Dispose funktioniert nicht

Der Prozess kann nicht die Datei ‚Dateinamen‘ zugreifen kann, weil es seine von einem anderen Prozess verwendet wird.

Ich habe vorherige ExcelPackage entfernt, aber der Fehler immer noch angezeigt, wenn ich Daten schreibe.

//Create new Workbook 
private void PengisianBaruBW_DoWork(object sender, DoWorkEventArgs e) 
{ 
    this.Invoke(new MethodInvoker(delegate 
    { 
     SetPengisianBtn.Enabled = false; 
    })); 

    FileInfo filePath = new FileInfo("D:\\Data Pengisian SLA Surabaya\\" + day + "_" + date + ".xlsx"); 

    if (File.Exists(filePath.ToString())) 
    { 
     File.Delete(filePath.ToString()); 
    } 

    using (ExcelPackage pck = new ExcelPackage(filePath)) 
    { 
     var schedule = pck.Workbook.Worksheets.Add("Schedule"); 
     var cart = pck.Workbook.Worksheets.Add("Cartridge"); 
     var unsche = pck.Workbook.Worksheets.Add("Unschedule"); 
     var rekap = pck.Workbook.Worksheets.Add("Rekap"); 

     //My Code here 

     pck.SaveAs(filePath); 
     pck.Dispose(); //I have disposed ExcelPakcage here 

    } 
} 


//Write Data to Excel File 
private void PrintScheduleBtn_Click(object sender, EventArgs e) 
{ 
    if (StaffATB.Text != "" && HelperTeamATB.Text != "" && StaffBTB.Text != "" && HelperTeamBTB.Text != "" && StaffCTB.Text != "" && HelperTeamCTB.Text != "" && StaffDTB.Text != "" && HelperTeamDTB.Text != "") 
    { 
     DialogResult dialogResult = MessageBox.Show("Apakah Anda yakin ingin menyimpan jadwal pengisian ?", "", MessageBoxButtons.YesNo); 


     if (dialogResult == DialogResult.Yes) 
     { 
      FileInfo file = new FileInfo("D:\\Data Pengisian SLA Surabaya\\" + day + "_" + date + ".xlsx"); 

      using (ExcelPackage pck = new ExcelPackage(file)) //error here 
      { 
       var rekap = pck.Workbook.Worksheets["Rekap"]; 
       var data = pck.Workbook.Worksheets["Data"]; 

       //my code to write data here 

       pck.SaveAs(file); 
       pck.Dispose(); 

      } 
     } 
    } 
    else 
    { 
     MessageBox.Show("Silakan isi PIC terlebih dahulu !"); 
    } 
} 

Ich habe diesen Code hinzugefügt zu prüfen, ob meine Excel-Datei aktiv ist oder nicht. Aber der Fehler besteht immer noch. Ich setze einen Haltepunkt und ich sehe, dass der Stromwert null ist, was darauf hinweist, dass meine Excel-Datei in der Nähe ist. Aber warum existiert der Fehler noch? Kann mir jemand helfen ?

string file = "D:\\Data Pengisian SLA Surabaya\\" + day + "_" + date + ".xlsx"; 
       var path = Path.Combine(Path.GetTempPath(), "D:\\Data Pengisian SLA Surabaya\\" + day + "_" + date + ".xlsx"); 
       var tempfile = new FileInfo(path); 

       FileStream stream = null; 

       try 
       { 
        stream = tempfile.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
       } 
       catch (IOException) 
       { 

       } 
       finally 
       { 
        if (stream != null) 
         stream.Close(); 
       } 
+1

Sind Sie sicher, dass die Erstellung abgeschlossen ist, wenn Sie auf die Schaltfläche Zeitplan drucken klicken? Weil Sie in einem Hintergrundthread erstellen. Sie müssen Dispose nicht aufrufen, wenn Sie die Instanz in eine using-Anweisung eingeschlossen haben. – rene

Antwort

2

Ich habe Ihr Snippet zum Testen vereinfacht. Es hat alles so funktioniert wie es soll. Sind Sie sicher, dass es keinen anderen Grund für das Problem des Dateizugriffs gibt, wie einen Virenscanner, ein Sicherungsprogramm usw., da Sie auch another question mit dem gleichen grundlegenden Problem haben.

Werfen Sie einen Blick auf den Ausschnitt unten, versuchen Sie es und sehen Sie, ob dieser funktioniert. Wenn nicht, ist das Problem nicht im Code.

FileInfo filePath = new FileInfo("ExcelDemo.xlsx"); 

if (File.Exists(filePath.ToString())) 
{ 
    File.Delete(filePath.ToString()); 
} 

using (ExcelPackage pck = new ExcelPackage(filePath)) 
{ 
    var schedule = pck.Workbook.Worksheets.Add("Schedule"); 
    var cart = pck.Workbook.Worksheets.Add("Cartridge"); 
    var unsche = pck.Workbook.Worksheets.Add("Unschedule"); 
    var rekap = pck.Workbook.Worksheets.Add("Rekap"); 

    pck.SaveAs(filePath); 
} 

using (ExcelPackage pck = new ExcelPackage(filePath)) 
{ 
    var rekap = pck.Workbook.Worksheets["Rekap"]; 
    var schedule = pck.Workbook.Worksheets["Schedule"]; 

    rekap.Cells[4, 1].Value = "Added data"; 
    schedule.Cells[4, 1].Value = "Added data"; 

    pck.SaveAs(filePath); 
} 
+0

Ich habe versucht, Code oben zu verwenden, aber es ist das gleiche. Fehler immer in ExcelPackage pck = neues ExcelPackage (Datei) in PrintScheduleBtn_Click. Kannst du mir helfen ? Ich bin stecken –

+0

Ich denke, das Problem ist nicht im Code, sondern auf dem Server selbst, wie ich bereits erwähnt in meiner Antwort könnte es ein Recht-Problem, Virenscanner, schreibgeschützte Datei usw. – VDWWD

1

Wie bereits erwähnt, sollte der grundlegende Code gut funktionieren. Wenn ich jedoch Ihren Code betrachte, spüre ich, dass Sie eine Art von BackgroundWorker verwenden (der Name von PengisianBaruBW_DoWork deutet darauf hin).

Wenn ja, können Sie Zugriff auf die gleiche Datei von einem anderen Thread ausführen (PengisianBaruBW_DoWork wird parallel mit PrintScheduleBtn_Click ausgeführt).

Um Ihnen mehr zu helfen, sollten Sie hinzufügen, wo (welche Zeile) erhalten Sie diesen Fehler und die Aufrufliste.

[Bearbeiten] Basierend auf zusätzliche Kommentare, denke ich an eines dieser Szenarien:

1) PengisianBaruBW_DoWork wird oft genannt, und manchmal passiert es, die Arbeit mit der Datei zu tun, während PrintScheduleBtn_Click zu versucht, Arbeiten Sie mit der gleichen Datei

2) Eine unbehandelte Ausnahme in _DoWork könnte verschluckt werden und die Datei geöffnet lassen (sehr unwahrscheinlich, da Sie einen Wegwerfkontext haben).

In beiden Fällen, setzen Sie einen Breakpoint am Anfang von _DoWork und einen am Anfang von PrintScheduleBtn_Click und verwenden Sie Schritt über (F10).

+0

Ich habe versucht, Breakpoint setzen in der Fehlerzeile. Ich überprüfe pck und sein Wert ist null. Kannst du mir helfen? –

+0

Ich bekomme Fehler bei der Verwendung von (ExcelPackage pck = neues ExcelPackage (Datei)) von PrintScheduleBtn_Click. Obwohl ich ExcelPackage im vorherigen Prozess (PengisianBaruBW_DoWork) entsorgt habe, ist es das gleiche. Mein Code erhält einen Fehler. Es sagt, dass meine Excel-Datei von einem anderen Programm verwendet wird –