2012-06-30 30 views
6

我有一个wpf员工创建窗口,我可以在其中创建名字,姓氏等基本信息,这会在我的REST Web服务中创建员工。举个例子:Excel文档内容到webservice

客户端:

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

Web服务端:

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

所有在那边很好,但是我希望 “进口” 的员工从Excel电子表格的详细信息,不确定如果导入是正确的单词,但我想采取在这样的电子表格中包含的名字和姓氏,并将它们添加到客户端wpf应用程序的Web服务。

我该怎么办呢?我有我的打开文件对话框:

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

所以,我打开我的excel电子表格,然后我将如何去走的是内部内容,并将其发送到Web服务?真的停留在代码或如何去关于它:/

只是寻找一种自动添加工作人员的方式,而不是手动输入名称,但作为员工Excel文档可以命名为任何我想要的打开文件对话框。里面的结构将始终是相同的名字,然后是姓氏。

+0

这绝不会回答你的问题......但将数据存储在数据库中会不会容易得多? – Pynner

回答

4

首先,这里是包含要导入的工作人员我的测试Excel文件: enter image description here

(列“A”,如果第一个名字,列“B”是姓和列“C”是密码...)

好了,假设你的代码中调用Web服务的作品,这里是我的版本的Import_Click方法(和通用方法来保存新员工):

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

注意:我删除了c中的MessageBox所有这些都可以通过Web服务来确保如果列表很长时您不会对它感到烦恼,但是如果您需要确认每个员工的创建情况,您可以自由地“取消”这个服务。在所教的同一行中,没有证实创建已成功发生。我需要更多细节来创建一个体面的验证过程。 同样非常重要的是,这不会验证您保存的员工是否已经存在于列表中。如果多次重新运行此导入过程,它可能(也可能会)创建重复条目。

干杯

+1

哇真的很好!你明白我所问的一切,并以优雅的方式雄辩地回答! +1人! –

+1

大声笑我的荣幸。 此外,我意识到有一个小内存(或资源管理)问题。不是什么大问题,但是如果要多次执行此过程,则可能需要去除其余的“EXCEL.EXE”进程保持打开状态。我只是注意到了它。 – JFTxJ

+2

此外,请注意,我的代码按照原样编写,将停止在excel文件的第一行,其中不包含“first name”列中的任何文本。 – JFTxJ