Excel creato da ASP



  • Excel creato da ASP
    di rby data: 23/07/2016 15:33:39

    Non scrivo in VB e non ce l'ho nemmeno installato, ma sono diversi anni che sto scrivendo in ASP classico interfacciato a DB di SQL Server. Riesco a produrre pagine HTML, PDF, e fogli Excel. Ma purtroppo fino a ieri i fogli Excel che producevo non erano altro che delle pagine HTML a cui davo come estensione .xls ed Excel provvedeva a generare il foglio EXCEL. Avevo provato più di una volta a scrivere delle righe ASP (VB lato server) che creassero un foglio Excel in maniera corretta, ma non ci ero mai riuscito. Anzi, già alla fase di creazione dell'Oggetto :
    Set Excel = Server.CreateObject("Excel.Application")
    mi beccavo un errore bloccante che mi impediva di andare oltre. Questo, mi frustrava non poco perché per fogli piuttosto grandi, venivano prodotte pagine HTML che sono circa 10 volte più grandi del documento .xls.
    C'è una analisi sul fatturato di una ditta che creata HTML occupava 84 MB che dopo aver aperto con Excel e salvata come foglio Excel diventava di 5-6 MB .
    Da ieri però sono riuscito a superare l'ostacolo ! ! Per cui ho cominciato a convertire un mio programma. L'operazione per me che non sono un sistemista è stata un pò complessa e presto inserirò un post che spiega tutti i passi che bisogna fare per attivare la scrittura di fogli Excel da ASP. Questo perché nei miei tentativi ho dovuto fare una serie di operazioni, e non credo che tutte sono necessarie. Se qualcuno ne ha bisogno, gli posso inviare un foglio word in cui ho riepilogato quello che ho fatto. Penserei di creare una apposita sezione del forum in cui si parla di fogli Excel gestiti da ASP. Questo perché purtroppo nonostante siano abbastanza simili, sono diversi e chi si trova come me ad utilizzare Asp classico molto spesso si trova davanti a problemi insormontabili.



  • di patel data: 23/07/2016 18:24:23

    l'argomento è senza dubbio interessante anche se non credo che valga la pena aprire una sezione apposita per asp, che credo ormai poco utilizzato in quanto superato dai più recenti linguaggi, comunque la decisione spetta all'amministratore ed al moderatore





  • di Vecchio Frac data: 23/07/2016 21:06:15

    Credo che l'Amministratore non aprirà nuove sezioni del Forum.
    Puoi procedere tranquillamente ad esporre le tue problematiche in thread dedicati e, per quanto sarà nelle nostre capacità, vedremo di aiutarti.





  • di scossa data: 24/07/2016 01:21:42

    cit.: "Da ieri però sono riuscito a superare l'ostacolo ! ! Per cui ho cominciato a convertire un mio programma"

    Boh, sinceramente io da ASP ho prodotto qualche Excel, con formule ed autofilter, con:

    Response.Buffer = true
    
    Response.ContentType = "application/vnd.ms-excel"
    Response.AddHeader "content-disposition", "attachment; filename=" & filename & ".xls"


    ed ovviamente giocando sugli attributi delle varie celle html.

    P.S.: mi viene il dubbio che sul server ASP debba essere registrata una specifica libreria (se non erro MSOWC.dll).

    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Raffaele_53 data: 24/07/2016 18:25:59

    >>>giocando sugli attributi
    Mi piacerebbe capire i Tuoi, non vederli...

    Ps. Appena vedo scossa (leggo), la metà delle volte non capisco un cavolo



  • di rby data: 25/07/2016 16:32:50

    @scossa come dicevo, il problema non era quello di scrivere delle pagine che venissero aperte da Excel (i fogli Html sono aperti senza problemi), bensì quello di scrivere delle celle utilizzando istruzioni come quelle del codice che segue. ma mi si fermava proprio all'inizio in cui il programma chiamava l'oggetto Excel : set Excel = server.CreateObject("Excel.Application").



     
        FoglioCorrente.Range("A1:W1").HorizontalAlignment = 3
        FoglioCorrente.Range("A1:W1").VerticalAlignment = 2
        FoglioCorrente.Range("A1:W1").Font.Size = 13.5
        FoglioCorrente.Range("A1:W1").Font.Name = "Verdana"
        FoglioCorrente.Range("A1:W1").Font.Bold = True
        FoglioCorrente.Range("A1:W1").Merge
        FoglioCorrente.Range("A1:W1").RowHeight = 25
        FoglioCorrente.Range("A1:W1").Interior.ColorIndex = 8
        FoglioCorrente.Range("A1:W1").borders.LineStyle = 0
        FoglioCorrente.Range("A1:W1").borders.Weight = 2
        FoglioCorrente.Range("A1:W1").Value = "Rapportino giornaliero del " & day(now()) & "/" & month(now()) & "/" & year(now()) 



  • di rby data: 25/07/2016 16:40:48

    Allego un Word di quello che ho dovuto fare x superare il problema che mi assillava da diverso tempo.
    Ma come devo fare per allegare un file ?? Non trovo un bottone che mi apre un dialog-box per l'invio !



  • di Vecchio Frac data: 25/07/2016 16:54:57

    In alto (e in basso) a questa pagina, accanto a "Nuova risposta", trovi "Allega un file" :)





  • di rby data: 25/07/2016 17:09:42

    O.K. Ora provo.



  • di scossa data: 25/07/2016 19:25:49

    cit.: "... il problema non era quello di scrivere delle pagine che venissero aperte da Excel ..."

    Ma guarda che l'ASP suggerito non crea pagine html ma proprio un file excel (.xls) con quello che vuoi (formule, autofilter). Più che altro è la scelta obbligata se la creazione di oggetti Office, con
    set Excel = server.CreateObject("Excel.Application")
    sul server è inibita per motivi di sicurezza.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di rby data: 25/07/2016 20:07:34

    @scossa - Ho provato a fare come dicevi, ma era come mi aspettavo. Il programma asp crea una pagina Html che tale rimane. E' Excel che leggendola la fa diventare un foglio excel. Ho fatto l'esempio che allego e mentre Excel mi mostra un foglio regolare, aprendolo con Ultraedit non è altro che una pagina Html.
    Come ho scritto nel mio post iniziale, alcuni miei programmi creano dei fogli mastodontici che in Html superano gli 80 Mega, mentre come fogli Excel solo 4-5 Mega. Poi se il foglio viaggia in internet e non in intranet il problema si ingigantisce. E' per questo che ho cercato di scrivere in Excel in maniera nativa. Prova ad utilizzare :
    set Excel = server.CreateObject("Excel.Application")
    ''' Excel.Visible = 1 ' Questa istruzione fa aprire il foglio excel
    Excel.Visible = 0 ' Invece così con lo apre
    set Cartella = Excel.Workbooks.Add
    set Foglio = Excel.ActiveWorkbook.Sheets
    set FoglioCorrente = Foglio.Item(1)
    FoglioCorrente.Name = "Tabella Parametri"
    .
    .
    .
    e se ti da errore nell'allegato che ho postato prima c'è il modo per superare l'Errore.


    P.S.: Nel codice che ho allegato ho scritto delle righe html che però il browser ha interpretato e fatto diventare tabella anche se in realtà avrebbe dovuto non interpretare l'Html.
     
    <%@ Language=VBScript %>
    <%  option explicit
    
    Response.ContentType = "application/vnd.ms-excel"
    Response.AddHeader "content-disposition", " filename=excelTest.xls"
    %>
    
    Test Col 1 Test Col 2 Test Col 3 Test Col 4 Test Col 6 Test Col 7
    Data Data Data Data Data Data Data



  • di scossa data: 25/07/2016 20:32:26

    cit.: "Ho provato a fare come dicevi, ma era come mi aspettavo. Il programma asp crea una pagina Html che tale rimane."

    Evidentemente non hai fatto tutto quel che serve Ti assicuro che il sistema è quello e funziona.
    Ovviamente io di avevo dato un indizio, poi stava a te approfondire, ad esempio:

    w3schools: ASP ContentType Property



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di rby data: 26/07/2016 00:24:04

    L'esempio che mi hai indicato è sostanzialmente identico a quello che ho eseguito io e che allego. Forse non mi sono spiegato : il problema è che una pagina Html dal punto di vista delle dimensioni è MOLTO PIU' GRANDE DI UN FOGLIO EXCEL. Che il browser apra la pagina con Excel non ne cambia le dimensioni. Solo dopo che lo hai salvato il foglio Excel diventa piccolo. Ma intanto HA VIAGGIATO GRANDE IN INTERNET. E per una persona che sta a Palermo e riceve 80 Mega da un server che sta a Milano e soprattutto se si collega utilizzando una chiavetta è un problema. Comunque io IL MIO PROBLEMA LO HO RISOLTO e questa discussione non è altro che una disquisizione filosofica. Se vuoi continuare ad inviare tabelle Html che fingono di essere dei fogli Excel fai pure. Io volevo solo CONDIVIDERE LA MIA SOLUZIONE. Non cerco di convincerti. Continua pure così, io lo ho fatto per 7 anni anche perché non ho mai trovato molto tempo per risolvere il problema ma finalmente ora ho trovato un metodo migliore e più professionale. Se vuoi fai tu una prova. Esegui l'esempio che ti ho mandato in allegato, oppure quello della pagina W3schools che mi hai indicato, poi invece di aprirlo, salvalo su disco ed aprilo con un editor di testo. Vedrai che non è altro che una pagina Html. Ed è questo che ho fatto per anni e che ora finalmente non sono più costretto a Fare.



  • di Thyke data: 26/07/2016 05:44:04

    io i due file li ho scaricati, normalmente non uso asp...ma non si sa mai, potrebbero venire bene in qualche occasione



  • di rby data: 27/07/2016 13:53:45

    A seguito della soluzione trovata, ho fatto installare sul server di produzione Excel che in questo caso era Excel16 e NON C'E' STATO BISOGNO di fare tutte le operazioni descritte nel mio allegato. Anzi non ho nemmeno trovato l'Oggetto 'Microsoft Excel Application' nella DCOM. Questo mi aveva mandato in crisi perché non avrei saputo più come fare.


  • file xls con asp
    di manuel (utente non iscritto) data: 15/09/2016 19:33:23

    ho letto che avete risolto il problema che il file xls è in formato html
    come avete fatto


  • salva file xls con asp
    di manuel66news data: 15/09/2016 20:14:59

    cerco di essere più chiaro, mi interessa la risposta di rby che ha trovato la soluzione su come salvare i file in formato xls ma non trovo i suoi file allegati.
    può aiutarmi???



  • di rby data: 15/09/2016 22:11:53

    Come avevo detto, è possibile creare un foglio excel in due modi :
    1) si crea un file html creando una tabella e questo non da problemi, solo è abbastanza farragginoso e prolisso oltre al fatto che creando fogli excel abbastanza grandi il risultato diventa smisuratamente enorme;
    2) si può creare il foglio excel utilizzando le istruzioni di office, ma bisogna avere installato sul server Office con excel, e se va in errore la creazione dell'oggetto Set gExcel = CreateObject("Excel.Application") bisogna eseguire le istruzioni che ho scritto nel documento che ho allegato. Nel codice invece è un esempio di come bisogna scrivere le istruzioni che creano le celle in excel

     
    '---------------------------------------------------------------------------------------------------
    Sub Crea_Foglio_Excel
       response.write("Inizio Crea_Foglio_Excel")
       Set gExcel = CreateObject("Excel.Application")
       response.write("Fatta CreateObject(Excel.Application)")
    '''gExcel.Visible = 1                                     '  Questa istruzione fa aprire il foglio excel
       gExcel.Visible = 0                                     '  Invece così con lo apre ma lo crea solamente
       set gCartella        = gExcel.Workbooks.Add
       set gFoglio          = gExcel.ActiveWorkbook.Sheets
       set gFoglioCorrente  = gFoglio.Item(1)
       gFoglioCorrente.Name = "Rap-" & year(now()) & "-" & Month(now()) & "-" & day(now())
       response.write("Fine  Crea_Foglio_Excel")
    End Sub
    ' ==================================================================================================
    '---------------------------------------------------------------------------------------------------
    Sub Stampa_Testata_Concessioni
          response.write("Inizio Stampa_Testata_Concessioni")
        With gFoglioCorrente
    '         Imposto le larghezze delle colonne che devo allargare
             .Range("A1").ColumnWidth = 30
             .Range("G1").ColumnWidth = 12
             .Range("H1").ColumnWidth = 12
             .Range("I1").ColumnWidth = 12
             .Range("O1").ColumnWidth = 12
             .Range("P1").ColumnWidth = 12
             .Range("R1").ColumnWidth = 12
             .Range("T1").ColumnWidth = 12
             .Range("W1").ColumnWidth = 12
    
             .Range("A1:W1").HorizontalAlignment = 3
             .Range("A1:W1").VerticalAlignment = 2
             .Range("A1:W1").Font.Size = 13.5
             .Range("A1:W1").Font.Name = "Verdana"
             .Range("A1:W1").Font.Bold = True
    '         Questa istruzione unisce le celle da A1 a W1
             .Range("A1:W1").Merge
             .Range("A1:W1").RowHeight = 25
             .Range("A1:W1").Interior.ColorIndex = 8
             .Range("A1:W1").borders.LineStyle = 0
             .Range("A1:W1").borders.Weight = 3
             .Range("A1:W1").Value = sNomeDitta&" - Rapportino giornaliero del " & day(now()) & "/" & month(now()) & "/" & year(now()) & ",  Ultima fattura del " &wData_Elaborazione  '''   sNomeDitta & " - Prova 3 Rapportino giornaliero del " & day(now()) & "/" & month(now()) & "/" & year(now()) & ",  Ultima fattura del " &wData_Elaborazione
        End With
        With gFoglioCorrente
             gRiga       = 3
             gColonna    = 0
             .Cells(gRiga, gColonna +2).Value  = "N. Ord."
             .Cells(gRiga, gColonna +3).Value  = "Valore"
             .Cells(gRiga, gColonna +4).Value  = "N. Fatt."
             .Cells(gRiga, gColonna +5).Value  = "M. Ord."
             .Cells(gRiga, gColonna +6).Value  = "Target"
             .Cells(gRiga, gColonna +7).Value  = "Fatturato"
             .Cells(gRiga, gColonna +8).Value  = "Carry"
             .Cells(gRiga, gColonna +9).Value  = "Fatturato+"
             .Cells(gRiga, gColonna +10).Value = "Idx %"
             .Cells(gRiga, gColonna +11).Value = "Fatturato"
             .Cells(gRiga, gColonna +12).Value = "Idx %"
        End With
    End Sub
    ' ==================================================================================================
    '---------------------------------------------------------------------------------------------------
    Sub Chiudi_Foglio_Excel
    '   Questa istruzione impedisce di aprire il Dialog-Box che chiede il nome definitivo del file
    '   va inserita prima della SaveAs
       gExcel.DisplayAlerts = False
    '''gExcel.ActiveWorkbook.SaveAs MapPath("/Peppe.xlsx")                     '  Questa funziona, ma scrive sul path della applicazione
    '''gExcel.ActiveWorkbook.SaveAs "C:inetpubwwwrootPeppe.xlsx" '  Questa invece scrive su di un path assoluto, ma accertarsi di averne accesso
       
       response.write("Nome_File_Excel !! : >"  & Nome_File_Excel & "<")
       gExcel.ActiveWorkbook.SaveAs Nome_File_Excel
    '''   gExcel.SaveAs Nome_File_Excel
    
       gExcel.Quit
       Set gExcel = Nothing
       Set gFoglioCorrente = Nothing
          response.write("Fine   Chiudi_Foglio_Excel")
    End Sub
    ' ==================================================================================================