2010-08-10 154 views
2

我必須移植商業人員用來計算C#最終價格的excel文件,以便我可以在Asp.Net應用程序中使用此算法。這是我第一次不會做的事情,但今天它打擊了我。也許Excel可以導出到C#。我不在乎它是否看起來醜陋,但這仍然是一件開始。將Excel導出到C#

是否有一些Excel插件,我可以標記一些輸入和輸出單元格,並添加它會將它導出到C#?

編輯

我們的客戶擁有的Excel文件,其中聘用過的員工可以修改某些字段,看看最終的價格在另一個領域。 Excel文件沒有任何VB,但使用標準的數學函數來計算價格。

想象一下用於計算實時保險價格的excel文件。

  • Excel文件有空白單元格公司僱主必須填寫:客戶年齡,不良的生活習慣,保價,保險期限,折扣等
  • Excel文件有許多細胞常數。常數最有可能係數(如保險合同簽訂年限的價格係數,價格越低越好)
  • Excel文件包含許多具有中間值的單元格
  • Excel文件有一個輸出單元格整個期間的最終保險價格

我所要做的就是將使用excel文件進​​行的計算移植到C#中。

+1

我想你需要給我們更多的細節。你的意思是你想要將Excel電子表格中的數據導出爲可以在C#應用程序中使用的格式? – 2010-08-10 13:46:30

+0

我認爲OP想要在他的電子表格中採用*計算邏輯*,目前使用公式實現,並生成等效的C#實現。 – jtolle 2010-08-10 17:45:40

回答

3

嚴格地說,「將Excel導出到C#」沒有多大意義。這是因爲您通常希望從Excel中導出的數據是數據,而C#是編程語言。也許你正在尋找的問題是,「如何讓Excel數據可用於用C#編寫的程序?」

我使用this write-up on C# Excel Interop Use作爲從用C#編寫的應用程序中讀取Excel數據的起點。這可能是一個很好的開始瞭解如何使Excel數據在C#中可見的地方。

解釋您的問題的另一種方法是,您要將Excel工作簿中的Visual Basic for Applications(VBA)代碼轉換爲C#。如果是這種情況,你有幾種選擇:

  • 如果不是大量的代碼,它很可能是最容易簡單地轉換的算法和程序,一個從VBA到C#的時間。
  • 這是一種非常難看的方式,但是您可以將VBA代碼導入Visual Studio並將其上轉換爲VB.NET。然後,您可以使用reflector將代碼反映到C#中。當然,這裏假定VBA代碼沒有緊密耦合到單獨的Excel對象(工作表,行,單元格,範圍等);如果它與我見過(和書寫)的Excel「商業應用程序」類似,那不太可能。
  • 絕對是巨大的應用程序與解耦代碼,你可能會考慮VB6到.NET的遷移解決方案,如VB Migration Partner。如果您的代碼緊密結合,我不確定這些解決方案的工作效果如何,但如果工作簿非常龐大,可能需要考慮一下。
2

如果你的意思是:

  • 我有,我想移植到C#

一個Excel VBA程序那麼這個問題可能是有些幫助:

+1

我沒有想到,也許OP是想將VBA轉換爲C#。接得好。 – 2010-08-10 13:56:50

1

我從來沒有使用過它,但你可能想看看這個:

http://www.calc4web.com/

看來做你想做的,只能用C++而不是C#是什麼,但問題是,你能然後可以編譯和使用一些代碼(或者如果您確實需要將它轉換爲C#)。

在這個問題的答案:

Understanding/Modeling formulas from Excel

喬埃裏克森給了一個鏈接到他的產品,電子表格齒輪,但我從來沒有使用,要麼。

1

如果您的公司擁有SharePoint 2007或2010,則可能需要查看Excel Services,它允許您通過SharePoint Web部件在Excel工作簿中使用計算。不知道您是否可以公開該Web部件其他ASP.NET應用程序或沒有,但它可能是值得研究

0

嘗試使用此代碼,它可能會幫助

public static void DataSetsToExcel(DataSet dataSet, string filepath) 
    { 
     try 
     { 
      string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=Excel 12.0 Xml;"; 
      string tablename = ""; 
      DataTable dt = new DataTable(); 
      foreach (System.Data.DataTable dataTable in dataSet.Tables) 
      { 
       dt = dataTable; 
       tablename = dataTable.TableName; 
       using (OleDbConnection con = new OleDbConnection(connString)) 
       { 
        con.Open(); 
        StringBuilder strSQL = new StringBuilder(); 
        strSQL.Append("CREATE TABLE ").Append("[" + tablename + "]"); 
        strSQL.Append("("); 
        for (int i = 0; i < dt.Columns.Count; i++) 
        { 
         strSQL.Append("[" + dt.Columns[i].ColumnName + "] text,"); 
        } 
        strSQL = strSQL.Remove(strSQL.Length - 1, 1); 
        strSQL.Append(")"); 

        OleDbCommand cmd = new OleDbCommand(strSQL.ToString(), con); 
        cmd.ExecuteNonQuery(); 

        for (int i = 0; i < dt.Rows.Count; i++) 
        { 
         strSQL.Clear(); 
         StringBuilder strfield = new StringBuilder(); 
         StringBuilder strvalue = new StringBuilder(); 
         for (int j = 0; j < dt.Columns.Count; j++) 
         { 
          strfield.Append("[" + dt.Columns[j].ColumnName + "]"); 
          strvalue.Append("'" + dt.Rows[i][j].ToString().Replace("'", "''") + "'"); 
          if (j != dt.Columns.Count - 1) 
          { 
           strfield.Append(","); 
           strvalue.Append(","); 
          } 
          else 
          { 
          } 
         } 
         if (strvalue.ToString().Contains("<br/>")) 
         { 
          strvalue = strvalue.Replace("<br/>", Environment.NewLine); 
         } 
         cmd.CommandText = strSQL.Append(" insert into [" + tablename + "](") 
          .Append(strfield.ToString()) 
          .Append(") values (").Append(strvalue).Append(")").ToString(); 
         cmd.ExecuteNonQuery(); 
        } 
        con.Close(); 
       } 
      } 
     } 
     catch (Exception ex) 
     {     
     } 
    }