2012-06-30 11 views
6

Ho una finestra di creazione del personale wpf in cui posso creare informazioni di base come nome, cognome ecc. Questo crea lo staff nel mio servizio web REST. Un esempio:Contenuto del documento Excel sul webservice

lato client:

private void CreateStaffMember_Click(object sender, RoutedEventArgs e) 
    { 
     string uri = "http://localhost:8001/Service/Staff"; 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("<Staff>"); 
     sb.AppendLine("<FirstName>" + this.textBox1.Text + "</FirstName>"); 
     sb.AppendLine("<LastName>" + this.textBox2.Text + "</LastName>"); 
     sb.AppendLine("<Password>" + this.passwordBox1.Password + "</Password>"); 
     sb.AppendLine("</Staff>"); 
     string NewStudent = sb.ToString(); 
     byte[] arr = Encoding.UTF8.GetBytes(NewStudent); 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri); 
     req.Method = "POST"; 
     req.ContentType = "application/xml"; 
     req.ContentLength = arr.Length; 
     Stream reqStrm = req.GetRequestStream(); 
     reqStrm.Write(arr, 0, arr.Length); 
     reqStrm.Close(); 
     HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
     MessageBox.Show("Staff Creation: Status " + resp.StatusDescription); 
     reqStrm.Close(); 
     resp.Close(); 
    } 

lato Web Service:

#region POST 

    [OperationContract] 
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "/Staff")] 
    void AddStaff(Staff staff); 

    #endregion 

    public void AddStaff(Staff staff) 
    { 
     staff.StaffID = (++eCount).ToString(); 
     staff.Salt = GenerateSalt(); 
     byte[] passwordHash = Hash(staff.Password, staff.Salt); 
     staff.Password = Convert.ToBase64String(passwordHash); 
     staffmembers.Add(staff); 
    } 

tutti bene su quel lato, ma Im che cercano di "importare" i dettagli del personale da un foglio excel, non sicuro se l'importazione è la parola corretta ma voglio prendere il nome e il cognome contenuti in tale foglio elettronico e aggiungerli al servizio web dall'applicazione wpf lato client.

Come dovrei farlo? Ho il mio dialogo file aperto:

private void Import_Click(object sender, RoutedEventArgs e) 
    { 
     Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); 

     // Show open file dialog box 
     Nullable<bool> result = dlg.ShowDialog(); 

     // Process open file dialog box results 
     if (result == true) 
     { 
      // Open document 
      string filename = dlg.FileName; 
     } 
    } 

Così apro la foglio di lavoro Excel allora come potrei fare per prendere il contenuto interno ed inviarlo al servizio web? Davvero bloccato sul codice o su come farlo:/

Solo cercando un modo automatico di aggiungere membri dello staff piuttosto che digitare manualmente i nomi, ma visto che il documento excel del personale potrebbe essere chiamato qualsiasi cosa volevo il file aperto la finestra di dialogo. La struttura all'interno sarà sempre lo stesso nome e cognome.

+0

questo in nessun modo risponde alla tua domanda ... ma non sarebbe molto più facile da memorizzare i dati in un DB? – Pynner

risposta

4

In primo luogo, ecco il mio file di Excel di test che contiene il personale che si desidera importare: enter image description here

(colonna 'A' se il nome, colonna 'B' è il cognome e la colonna 'C' è il la password ...)

Ok, supponendo che il codice chiama le tue opere di servizio web, ecco la mia versione del metodo Import_Click (e un metodo generico per salvare nuovo personale):

private void Import_Click(object sender, RoutedEventArgs e) 
    { 
     Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); 

     // Show open file dialog box 
     Nullable<bool> result = dlg.ShowDialog(); 

     // Process open file dialog box results 
     if (result == true) 
     { 
      // Open document 
      string filename = dlg.FileName; 

      Microsoft.Office.Interop.Excel.Application vExcelObj = new Microsoft.Office.Interop.Excel.Application(); 
      try 
      { 
       Workbook theWorkbook = vExcelObj.Workbooks.Open(filename, Type.Missing, true); 

       Worksheet sheet = theWorkbook.Worksheets[1]; // This is assuming that the list of staff is in the first worksheet 

       string vFirstName = "temp"; 
       string vLastName = "temp"; 
       string vPassword = "temp"; 
       int vIndex = 1; 

       while (vFirstName != "") 
       { 
        // Change the letters of the appropriate columns here! 
        // In my example, 'A' is first name, 'B' is last name and 'C' is the password 
        vFirstName = sheet.get_Range("A" + vIndex.ToString()).Value.ToString(); 
        vLastName = sheet.get_Range("B" + vIndex.ToString()).Value.ToString(); 
        vPassword = sheet.get_Range("C" + vIndex.ToString()).Value.ToString(); 

        this.SaveNewStaff(vFirstName, vLastName, vPassword); 

        vIndex++; 

       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error processing excel file : " + ex.Message); 
      } 
      finally { 
       vExcelObj.Quit(); 
      } 
     } 
    } 

    private void SaveNewStaff(string firstName, string lastName, string password) { 
     string uri = "http://localhost:8001/Service/Staff"; 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("<Staff>"); 
     sb.AppendLine("<FirstName>" + firstName + "</FirstName>"); 
     sb.AppendLine("<LastName>" + lastName + "</LastName>"); 
     sb.AppendLine("<Password>" + password + "</Password>"); 
     sb.AppendLine("</Staff>"); 
     string NewStudent = sb.ToString(); 
     byte[] arr = Encoding.UTF8.GetBytes(NewStudent); 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri); 
     req.Method = "POST"; 
     req.ContentType = "application/xml"; 
     req.ContentLength = arr.Length; 
     Stream reqStrm = req.GetRequestStream(); 
     reqStrm.Write(arr, 0, arr.Length); 
     reqStrm.Close(); 
     HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
     //MessageBox.Show("Staff Creation: Status " + resp.StatusDescription); 
     reqStrm.Close(); 
     resp.Close(); 
    } 

Nota: Ho rimosso il MessageBox nel c tutto per il servizio web per assicurarti di non essere infastidito da esso se la lista è lunga, ma sei libero di "NON RIMUOVERE" se hai bisogno di una conferma per ogni creazione del personale. Nella stessa linea di insegnamento, non c'è la convalida che la creazione sia avvenuta con successo. Avrei bisogno di più dettagli per creare un processo di validazione decente. Anche MOLTO importante, questo non convalida se il rigo che stai salvando esiste già nella lista. Se si esegue nuovamente questa procedura di importazione più volte, potrebbe (e probabilmente lo farà) creare voci duplicate.

Acclamazioni

+1

wow davvero molto bello! Hai capito tutto quello che ho chiesto e con grazia ho eloquentemente risposto! +1 gente! –

+1

LOL Il mio piacere. Inoltre, ho capito che c'è un piccolo problema di memoria (o di gestione delle risorse). Non è un grosso problema, ma se si deve eseguire questa procedura più volte, si potrebbe voler uccidere i restanti processi "EXCEL.EXE" che rimangono aperti. L'ho appena notato. – JFTxJ

+2

Inoltre, si noti che il mio codice, scritto così com'è, si fermerà sulla prima riga del file excel che non contiene alcun testo nella colonna "nome". – JFTxJ

Problemi correlati