2012-06-30 13 views
6

Mam okno tworzenia personelu wpf, w którym mogę utworzyć podstawowe informacje, takie jak imię, nazwisko itp. To tworzy personel w mojej usłudze internetowej REST. Przykład:Zawartość dokumentu Excel do usługi internetowej

po stronie klienta:

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(); 
    } 

strona 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); 
    } 

wszystko jest w porządku po tej stronie, ale Im patrząc na "import" dane personelu z arkusza kalkulacyjnego Excel, nie Upewnij się, że import jest właściwym słowem, ale chcę wziąć imiona i nazwiska zawarte w takim arkuszu i dodać je do usługi sieciowej z aplikacji wpf po stronie klienta.

Jak bym się z tym pogodził? Mam otwarte okno pliku:

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; 
     } 
    } 

Więc otworzyć arkusza kalkulacyjnego Excel następnie jak pójdę o przyjmowanie wewnętrznych treść i przesłanie go do serwisu WWW? Naprawdę utknąłem na kodzie lub jak go obejść:/

Po prostu szukam automatycznego sposobu dodawania członków personelu, zamiast ręcznego wpisywania nazw, ale widząc jako dokument docierający do personelu, można nazwać wszystko, co chciałem otworzyć. Okno dialogowe. Struktura wewnątrz zawsze będzie taka sama jak imię, a następnie nazwisko.

+0

to w żaden sposób nie odpowiada na twoje pytanie ... ale czy przechowywanie danych w DB nie byłoby łatwiejsze? – Pynner

Odpowiedz

4

pierwsze, tu jest moja próba plik Excel, który zawiera Staff chcesz importować: enter image description here

(kolumna „A”, jeżeli imię, kolumna „B” jest nazwisko i kolumna „C” jest hasło ...)

Ok, więc zakładając, że kod nazywając swoje prace usług internetowych, tutaj jest moja wersja metody Import_Click (i ogólny sposób, aby zapisać nowych pracowników):

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(); 
    } 

Uwaga: Usunąłem MessageBox w c wszystko do serwisu internetowego, aby upewnić się, że nie będziesz go denerwować, jeśli lista jest długa, ale możesz ją "cofnąć", jeśli potrzebujesz potwierdzenia dla każdego tworzenia personelu. W tej samej linii nauczania nie ma potwierdzenia, że ​​stworzenie zostało pomyślnie wykonane. Potrzebowałbym więcej szczegółów, aby stworzyć porządny proces walidacji. BARDZO ważne, to nie sprawdza się, jeśli zapisany personel już istnieje na liście. Jeśli powtórzysz tę procedurę importu wiele razy, może (i prawdopodobnie będzie) utworzyć duplikaty wpisów.

Pozdrawiam

+1

wow naprawdę bardzo ładne! Zrozumiałeś wszystko, o co poprosiłem iz wdziękiem elokwentnie odpowiedziałem! +1 ludzie! –

+1

LOL Moja przyjemność. Ponadto zdałem sobie sprawę, że istnieje mały problem z pamięcią (lub zarządzaniem zasobami). Nic wielkiego, ale jeśli masz wykonać tę procedurę kilka razy, możesz chcieć zabić pozostałe procesy "EXCEL.EXE", które pozostają otwarte. Właśnie to zauważyłem. – JFTxJ

+2

Należy również zauważyć, że mój kod, napisany w niezmienionym stanie, zatrzyma się w pierwszym wierszu pliku excel, który nie zawiera tekstu w kolumnie "imię". – JFTxJ

Powiązane problemy