2012-06-30 9 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サービス側:Excelスプレッドシートから

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

すべてのこと側の罰金、しかしImが探しに "輸入" スタッフの詳細ではなく、インポートが正しい単語であるかどうかは確かですが、そのようなスプレッドシートに含まれているファーストネームとラストネームを取り出し、それらをクライアント側の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; 
     } 
    } 

だから私は、その後どのように私は、内のコンテンツを取得し、Webサービスに送信するに行くか、私のExcelのスプレッドシートを開きますか?/

名前を手動で入力するのではなく、スタッフを追加する自動化された方法を探していますが、スタッフがExcelのドキュメントに名前を付けることができたのを見て、私は開いたファイルを望んでいましたダイアログボックス。内部の構造は常に同じファーストネームとラストネームになります。最初の名前は、列「B」の姓と列が「」「C」は enter image description here

(カラム:

+0

これは決してあなたの質問に答えてくれます...しかし、DBにデータを保存するのはそれほど簡単ではないでしょうか? – Pynner

答えて

4

まず、ここにインポートするスタッフが含まれている私のテストExcelファイルでありますパスワード...)

オクラホマので、あなたのコードは、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サービスにすべてを渡しますが、スタッフの作成ごとに確認が必要な場合は、それを "unreM"することができます。同じ教え方では、創造が成功したという妥当性検証はありません。まともな検証プロセスを作成するためには詳細が必要です。 また、保存しているスタッフが既にリストに存在する場合、これは非常に重要です。このインポート手順を複数回実行すると、重複したエントリが作成される可能性があります。

乾杯

+1

本当に本当にうれしい!あなたは私が尋ねたすべてを理解し、恵みをもって雄弁に答えました! +1人! –

+1

LOL私の喜び。 また、小さなメモリ(またはリソース管理)の問題があることを認識しました。大したことではありませんが、この手順を複数回実行する場合は、開いたままの残りの "EXCEL.EXE"プロセスを強制終了してください。私はちょうどそれに気づいた。 – JFTxJ

+2

また、私のコードは、そのまま書かれていて、「ファーストネーム」列にテキストを含まないExcelファイルの最初の行で停止することに注意してください。 – JFTxJ

関連する問題