2012-06-30 42 views
6

Tôi có cửa sổ tạo nhân viên wpf, trong đó tôi có thể tạo thông tin cơ bản như tên, họ, v.v. tạo ra các nhân viên trong dịch vụ web REST của tôi. Một ví dụ:Nội dung tài liệu Excel tới webservice

phía Chủ đầu tư:

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

bên 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); 
    } 

Tất cả tốt về phía đó, nhưng Im tìm cách để "nhập khẩu" các chi tiết nhân viên từ một bảng tính excel, không chắc chắn nếu nhập là từ chính xác nhưng tôi muốn lấy tên và họ có trong bảng tính như vậy và thêm chúng vào dịch vụ web từ ứng dụng wpf phía máy khách.

Tôi sẽ làm gì? Tôi có hộp thoại mở tệp của mình:

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

Vì vậy, tôi mở bảng tính excel của mình, sau đó tôi sẽ lấy nội dung bên trong và gửi đến dịch vụ web như thế nào? Thực sự bị kẹt trên mã hoặc cách xử lý: hoặc

Chỉ cần tìm cách tự động thêm nhân viên thay vì nhập tên theo cách thủ công, nhưng thấy tài liệu excel của nhân viên có thể được đặt tên bất cứ thứ gì tôi muốn mở tệp hộp thoại. Cấu trúc bên trong sẽ luôn có cùng tên và họ.

+0

điều này không có cách nào trả lời câu hỏi của bạn ... nhưng sẽ không dễ dàng hơn khi lưu trữ dữ liệu trong DB? – Pynner

Trả lời

4

Thứ nhất, đây là bài kiểm tra tập tin Excel của tôi có chứa các Staff bạn muốn nhập: enter image description here

(Cột 'A' nếu tên đầu tiên, cột 'B' là tên cuối cùng và cột 'C' là mật khẩu ...)

Ok, do đó giả định rằng mã của bạn gọi công trình dịch vụ web của bạn, đây là phiên bản của tôi về phương pháp Import_Click (và một phương pháp chung để tiết kiệm nhân viên mới):

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

lưu ý: Tôi đã loại bỏ MessageBox trong c tất cả để các dịch vụ web để đảm bảo rằng bạn không bị khó chịu bởi nó nếu danh sách dài, nhưng bạn được tự do "unREM" nó nếu bạn cần xác nhận cho mỗi nhân viên tạo ra. Trong cùng một dòng dạy, không có xác nhận rằng việc tạo ra đã xảy ra thành công. Tôi sẽ cần thêm chi tiết để tạo một quá trình xác nhận hợp lệ. Cũng rất quan trọng, điều này không xác thực nếu nhân viên bạn đang tiết kiệm đã tồn tại trong danh sách. Nếu bạn chạy lại quy trình nhập này nhiều lần, nó có thể (và có thể sẽ) tạo các mục trùng lặp.

Chúc mừng

+1

wow thực sự thực sự tốt đẹp! Bạn hiểu tất cả mọi thứ tôi hỏi và với ân sủng hùng hồn trả lời! +1 người! –

+1

LOL Niềm vui của tôi. Ngoài ra, tôi đã nhận ra rằng có một vấn đề bộ nhớ nhỏ (hoặc quản lý tài nguyên). Không phải là một vấn đề lớn, nhưng nếu bạn thực hiện thủ tục này nhiều lần, bạn có thể muốn giết các quá trình "EXCEL.EXE" còn lại vẫn mở. Tôi chỉ nhận thấy nó. – JFTxJ

+2

Ngoài ra, hãy lưu ý rằng mã của tôi, được viết như nguyên bản, sẽ dừng ở dòng đầu tiên trong tệp excel không chứa bất kỳ văn bản nào trong cột "tên đầu tiên". – JFTxJ

Các vấn đề liên quan