webForumDet fria alternativet

Hjälp med Asp.net problem !

.NETur .NET

4 svar · 352 visningar · startad av Tobbster

Medlem sedan mars 2001309 inlägg
Frågan#1

Kan någon hjälpa mig med det här ! jag försöker att via ASP.net skapa en kopia av en excelfil på server och sedan fylla kopian med data .filen ska sedan skickas till klienten och där efter tasbort på servern. Koden jag har skrivit är den under. Problemet är att den funkar typ 1 gång av 10. Kan någon hjälpa mig med hur jag ska skriva den för att det ska fungera !

Problem.

1. Ibland skapas ingen fil på servern

2. när allt går som det ska och filen är kopierad till klienten och bortagen på servern är klient kopian readonly.

Jag blir inte klock på det här snälla hjälp mig någon kunnig......

Nedan är de tre subbar jag har skrivit !


 Private Sub ExportToExcel(ByVal unit As String) 

       Dim ExcelWasNotRunning As Boolean 
       Dim ea As Excel.Application 
       Dim wb As Excel.Workbook 
       Dim ws_A As Excel.Worksheet 
       Dim ws_B As Excel.Worksheet 
       Dim Ws_N As Excel.Worksheet 
       Dim Ws_S As Excel.Worksheet 
       Dim r As Excel.Range 

       System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US") 

       On Error Resume Next 
       ea = GetObject(, "Excel.Application") 
       If Err().Number <> 0 Then ExcelWasNotRunning = True 

       Err().Clear() ' Clear Err object in case error occurred. 

       If (ExcelWasNotRunning) Then 
           ea = CreateObject("Excel.Application") 
       End If 

       wb = ea.Workbooks.Open(Server.MapPath("\Nekudabamall\Nekudabamall.xls")) 

       Dim FileNR, filname As String 
       Dim upperbound, lowerbound As Integer 
       upperbound = 1000 
       lowerbound = 4 
       FileNR = CStr(Int((upperbound - lowerbound + 1) * Rnd() + lowerbound)) ' Generate random value between 1 and 1000. 

       filname = "Nyckeltal" & FileNR & ".xls" 
       wb.SaveAs(Server.MapPath("\Nekudabamall\" & filname)) 

       wb.Close() 

       'If Not File.Exists(Server.MapPath("\Nekudabamall\" & filname)) Then 
       'MsgBox("filname " & filname & " finns inte") 
       ' End If 

       wb = ea.Workbooks.Open(Server.MapPath("\Nekudabamall\" & filname)) 

       ws_A = wb.Worksheets 
       ws_B = wb.Worksheets 
       Ws_S = wb.Worksheets 
       Ws_N = wb.Worksheets 

       Ws_N = wb.Worksheets("Nyckeltal") 

       r = Ws_N.Range("A4:A5") 
       r(1, 4) = Dpd_Unit.SelectedItem.Text 
       r(1, 5) = Txt_Ansvarig.Text 

       r = Nothing 

       r = Ws_N.Range("A8:A8") 
       r(1, 4) = SetBusinessRatio(CInt(unit), "Prospect-A") 
       r(2, 4) = SetBusinessRatio(CInt(unit), "Prospect-B") 
       r(3, 4) = SetBusinessRatio(CInt(unit), "Suspect") 
       r(7, 4) = SetProspectValue(CInt(unit)) 
       r(8, 4) = SetWeighProspectValue(CInt(unit)) 
       r(10, 4) = SetAvgTerminateDate(CInt(unit), "Prospect-A") 
       r(11, 4) = SetAvgTerminateDate(CInt(unit), "Prospect-B") 

       r = Nothing 

       ws_A = wb.Worksheets("A-Prospects") 

       r = ws_A.Range("A8:I8") 
       r(1, 1) = 1111111 
       r(1, 2) = "2002-01-01" 
       r(1, 3) = "Saab Aviocomp" 
       r(1, 4) = "Brandväggsjobb" 
       r(1, 5) = "Tobias Wester" 
       r(1, 6) = "NX_Test" 
       r(1, 7) = 1111111 
       r(1, 8) = "2002-01-01" 

       r = Nothing 

       ws_B = wb.Worksheets("B-Prospects") 

       r = ws_B.Range("A8:I8") 
       r(1, 1) = 22222222 
       r(1, 2) = "2002-02-02" 
       r(1, 3) = "Saab Aviocomp" 
       r(1, 4) = "Brandväggsjobb" 
       r(1, 5) = "Anders ahlström" 
       r(1, 6) = "NX_Test" 
       r(1, 7) = 22222222 
       r(1, 8) = "2002-02-02" 

       r = Nothing 

       Ws_S = wb.Worksheets("Suspect") 

       r = Ws_S.Range("A8:I8") 
       r(1, 1) = 22222222 
       r(1, 2) = "2002-02-02" 
       r(1, 3) = "Saab Aviocomp" 
       r(1, 4) = "Brandväggsjobb" 
       r(1, 5) = "Anders ahlström" 
       r(1, 6) = "NX_Test" 
       r(1, 7) = 22222222 
       r(1, 8) = "2002-02-02" 

       wb.Save() 

       wb = Nothing 
       Ws_N = Nothing 
       ws_A = Nothing 
       ws_B = Nothing 
       Ws_S = Nothing 
       r = Nothing 

       ea.Quit() 
       ea = Nothing 
       GC.Collect() 

       fileCopy("Nyckeltal.xls", filname) 

       DeleteFile(filname) 

   End Sub

Delet subben


 Private Sub DeleteFile(ByVal FileName As String) 
       System.IO.File.Delete(Server.MapPath("\Nekudabamall\" & FileName)) 
   End Sub

FileCopy subben


   Private Sub fileCopy(ByVal SaveAsfilname As String, ByVal filname As String) 
       ' clear the current output content from the buffer 
       Response.Clear() 

       ' add the header that specifies the default filename for the 

       'Download/SaveAs dialog 
       Response.AddHeader("Content-Disposition", "filename=" & SaveAsfilname) 

       Response.AddHeader("Content-Length", filname.Length.ToString()) 

       ' specify that the response is a stream that cannot be read by the 
       ' client and must be downloaded 
       Response.ContentType = "application/octet-stream" 
       ' send the file stream to the client 
       Response.WriteFile(Server.MapPath("\Nekudabamall\" & filname)) 

       Response.Flush() 

       Response.Close() 

   End Sub
Medlem sedan aug. 2001458 inlägg
#2

Du har problem med resurshanteringen i ditt program. Har inte lusläst din kod, men här är några generella tips.

När man använder en resurs (i ditt fall excel-objektet), vill man stänga den vid avslut. Det finns en konstruktion för det i .Net, try-finally, som du borde använda. Syftet är att man öppnar en resurs (fil, socket, excel-instans via com-interop etc.) och är garanterad att den stängs.

    Private Sub Foo()
        Dim stream As StreamWriter
        Try
            stream = New StreamWriter("c:\test.txt")
            stream.WriteLine("test")
        Finally
            ' Du är garanterad att finally-satsen körs (om inte
            ' konstruktorn till streamwritern kastat exception)
            stream.Close()
         End Try
    End Sub

På det här sättet vet du att resursen stängs, även om du går ur metoden med ett exception. Läs om Close() Dispose() och IDisposable i MSDN på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemidisposableclassdisposetopic.asp?frame=true och http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconfinalizedispose.asp?frame=true. På samma sätt borde du göra med ditt excel-objekt istället för att som nu göra .Save() och sätta till Nothing. Genom att sätta till Nothing säger du åt GCn att "det här objektet är färdiganvänt, städa bort det när du vill". Vad händer då?

När du gör GC.Collect() säger MSDN att

All objects, regardless of how long they have been in memory, are considered for collection

Det är troligt att ditt excel-objekt fortfarande håller i filen även när GC.Collect() körts. Det finns även en GC.WaitForPendingFinalizers() som du kan läsa om i MSDN. Observera att det är oftast är dålig kodning att tvinga garbage collection. Det dödar prestanda och du kommer förmodligen göra felaktiga antaganden i din kod. (Att forcera garbage collection i test-syfte och för att lära sig är förstås helt ok). Det finns fall då man tvingar fram GC av prestandaskäl men då ska man vara väldigt säker på vad man gör.

Så du vill förmodligen göra wb.Close() i din finally-sats.

Tänk på:
- Alla gånger du sätter "r = Nothing" är helt onödiga, jag skulle ta bort dessa.
- Du instansierar ea vid varje anrop. Överväg att ha en pool av sådana instanser istället för att skapa en ny varje gång. Det kommer troligtvis döda prestanda att skapa om dessa. (Dock tycker jag du ska göra detta först när du fått allt annat att fungera - en sak i taget)
- Du har en funktion ExportToExcel som är läskigt lång och gör många saker. Överväg att dela in den i logiska del-metoder, typ

    Private Sub ExportToExcel(ByVal unit As String)
        Dim wb As Excel.Workbook
        Try
            wb = ...
            DoStuffWithExcel(wb)
            DoOtherStuff(wb, filnamn)
        Finally
            wb.Close()
        End Try
    End Sub
Medlem sedan mars 2001309 inlägg
#3

Tack developer det var presic vad jag behövde lite inspiration från någon kunnig ! Jag återkommer om jag inte får det att funka efter lite trixande, ´det blir efter helgen !

Är det någon mer som har lite kloka saker att säga så är jag mycket tacksamm !

Medlem sedan mars 2001309 inlägg
#4

Snälla hjälp mig någon som kan !

Nu ser min kod ut så här !

PROBLEMEN

1. Problemen är att ibland statas en ny process av excel för varje gång jag trycker på min knapp.

2.IBland skapas inte den temporärafilen på servern.

3.Ibland funkar allt utmärkt vilket man inte kan tycka är något problem men det är det när det inte är hela tiden det funkar !

'Första funktionen är för att kopiera en mall av excel document
',Så att även om två användare loggar in samtidigt och försöker 'använda funktionen så får dom varsin kopia att jobba med.

Du som kan det här får hjärna hjälpa mig och skicka en fungerande kod vilket förmodligen inte är så svårt om man är haj på programmering ,jag ger snart upp :( .

 
    Private Function Copymall() As String
        Dim ea As Excel.Application
        Dim wb As Excel.Workbook
        Dim FileNR, filname As String
        Dim upperbound, lowerbound As Integer

        Try
            upperbound = 1000
            lowerbound = 4
            FileNR = CStr(Int((upperbound - lowerbound + 1) * Rnd() + lowerbound)) ' Generate random value between 1 and 1000.
            filname = "Nyckeltal" & FileNR & ".xls"

            System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")

            ea = CType(GetObject(, "Excel.Application"), Excel.Application)

        Catch ex As Exception When Err().Number <> 0
            Err().Clear() ' Clear Err object in case error occurred.

            ea = CType(CreateObject("Excel.Application"), Excel.Application)

        Finally
            wb = ea.Workbooks.Open(Server.MapPath("\Nekudabamall\Nekudabamall.xls"))

            wb.SaveAs(Server.MapPath("\Nekudabamall\" & filname))
            wb.Close()
            ea.Quit()
            GC.Collect()

        End Try

        Return filname
    End Function

'Själva instoppandet av datan i Excel kopian !


    Private Sub ExportToExcel(ByVal unit As String, ByVal filename As String)
        Dim ExcelWasNotRunning As Boolean
        Dim ea As Excel.Application
        Dim wb As Excel.Workbook
        Dim ws_A As Excel.Worksheet
        Dim ws_B As Excel.Worksheet
        Dim Ws_N As Excel.Worksheet
        Dim Ws_S As Excel.Worksheet
        Dim r As Excel.Range
        Dim filname As String

        Try
            ea = GetObject(, "Excel.Application")
            filname = filename
            wb = ea.Workbooks.Open(Server.MapPath("\Nekudabamall\" & filname))

            Ws_N = wb.Worksheets("Nyckeltal")

            r = Ws_N.Range("A4:A5")
            r(1, 4) = Dpd_Unit.SelectedItem.Text
            r(1, 5) = Txt_Ansvarig.Text

            r = Ws_N.Range("A8:A8")
            r(1, 4) = SetBusinessRatio(CInt(unit), "Prospect-A")
            r(2, 4) = SetBusinessRatio(CInt(unit), "Prospect-B")
            r(3, 4) = SetBusinessRatio(CInt(unit), "Suspect")
            r(7, 4) = SetProspectValue(CInt(unit))
            r(8, 4) = SetWeighProspectValue(CInt(unit))
            r(10, 4) = SetAvgTerminateDate(CInt(unit), "Prospect-A")
            r(11, 4) = SetAvgTerminateDate(CInt(unit), "Prospect-B")

            ws_A = wb.Worksheets("A-Prospects")

            r = ws_A.Range("A8:I8")
            r(1, 1) = 1111111
            r(1, 2) = "2002-01-01"
            r(1, 3) = "Saab Aviocomp"
            r(1, 4) = "Brandväggsjobb"
            r(1, 5) = "Tobias Wester"
            r(1, 6) = "NX_Test"
            r(1, 7) = 1111111
            r(1, 8) = "2002-01-01"

            ws_B = wb.Worksheets("B-Prospects")

            r = ws_B.Range("A8:I8")
            r(1, 1) = 22222222
            r(1, 2) = "2002-02-02"
            r(1, 3) = "Saab Aviocomp"
            r(1, 4) = "Brandväggsjobb"
            r(1, 5) = "Anders ahlström"
            r(1, 6) = "NX_Test"
            r(1, 7) = 22222222
            r(1, 8) = "2002-02-02"

            Ws_S = wb.Worksheets("Suspect")

            r = Ws_S.Range("A8:I8")
            r(1, 1) = 22222222
            r(1, 2) = "2002-02-02"
            r(1, 3) = "Saab Aviocomp"
            r(1, 4) = "Brandväggsjobb"
            r(1, 5) = "Anders ahlström"
            r(1, 6) = "NX_Test"
            r(1, 7) = 22222222
            r(1, 8) = "2002-02-02"

        Finally
            wb.Save()
            ea.Quit()
            wb = Nothing
            Ws_N = Nothing
            ws_A = Nothing
            ws_B = Nothing
            Ws_S = Nothing
            r = Nothing
            GC.Collect()

        End Try

    End Sub

'För att skicka/Kopierafilen till klienten !


    Private Sub fileCopy(ByVal SaveAsfilname As String, ByVal filname As String)

        Try
            ' clear the current output content from the buffer
            Response.Clear()

            ' add the header that specifies the default filename for the

            'Download/SaveAs dialog
            Response.AddHeader("Content-Disposition", "filename=" & SaveAsfilname)

            ' specify that the response is a stream that cannot be read by the
            ' client and must be downloaded
            Response.ContentType = "application/octet-stream"
            ' send the file stream to the client
            Response.WriteFile(Server.MapPath("\Nekudabamall\" & filname), True)

        Finally
            Response.End()
        End Try

    End Sub

'Borttagning av excelkopian på servern!

    Private Sub DeleteFile(ByVal FileName As String)
        System.IO.File.Delete(Server.MapPath("\Nekudabamall\" & FileName))
    End Sub

Anropen av funktionerna och subbarna !

Private Sub Cmd_ExportSuspect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cmd_ExportSuspect.Click
        Dim filename As String

        filename = Copymall()

        ExportToExcel(Dpd_Unit.SelectedItem.Value, filename)

        fileCopy("Nyckeltal.xls", filename)

        DeleteFile(filename)

    End Sub
Medlem sedan mars 2001309 inlägg
#5

Nu funkar det utmärkt efter lite små justeringar !

145 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)