将Excel导出到C#

我必须移植商业人士用来计算最终价格到C#的excel文件,这样我才能在Asp.Net应用程序中使用这个algorithm。 这是我第一次不会这样做的,但是今天却打到了我。 也许Excel可以导出到C#。 我不在乎它是否看起来丑陋,但这仍然是一个开始。

是否有一些Excel插件,我可以标记一些input和输出单元格,这个添加它会将其导出到C#?

编辑

我们的客户有Excel文件,雇员可以修改一些领域,并在另一个领域看到最终的价格。 Excel文件没有任何VB,但使用标准的math函数来计算价格。

想象一下用excel文件计算实时保险价格。

  • Excel文件有空单元公司雇主必须填写:客户年龄,不良习惯,保险价格,保险期限,折扣等
  • Excel文件有许多常量单元格。 常数是最有可能的系数(例如保险合同签订年份的价格系数,价格越低的年份越多)
  • Excel文件有许多具有中间值的单元格
  • Excel文件有一个输出单元,最终保险价格为整个期间

我所要做的是将使用excel文件进​​行的计算移植到C#中。

严格来说,“将Excel导出到C#”并没有什么意义。 这是因为你一般希望从Excel中导出数据 ,C#是一种编程语言 。 也许你正在寻找的问题是:“如何让Excel数据可用于用C#编写的程序?

我在C#Excel Interop Use上使用这种写法作为从用C#编写的应用程序读取Excel数据的起点。 这可能是一个很好的开始了解如何使Excel数据在C#中可见的地方。

另一种解释您的问题的方法是,您要将Excel工作簿中的Visual Basic for Applications(VBA)代码转换为C#。 如果是这种情况,你有几个select:

  • 如果代码量不是很多,那么将algorithm和过程从VBA简单地转换为C#就可以了。
  • 这是一个非常丑陋的方式,但是您可以将VBA代码导入到Visual Studio中,并将其上传到VB.NET。 然后,您可以使用reflection器将代码反映到C#。 当然,这是假定VBA代码并不紧密地耦合到单独的Excel对象(工作表,行,单元格,范围等)。 如果它与我所见过(或写过)的Excel“业务应用程序”类似,那不太可能。
  • 对于绝对巨大的应用程序来说,你可能会考虑VB6到.NET的迁移解决scheme,比如VB Migration Partner 。 我不确定这些解决scheme如果有紧密耦合的代码,将会如何工作,但是如果工作簿非常庞大,那么可能需要考虑一下。

如果你的意思是:

  • 我有一个Excel VBA应用程序,我希望移植到C#

那么这个问题可能会有一些帮助:

  • 是否有可能将VBA转换为C#?

你不能真正从一个小表单创build代码。 您宁愿要一个读取excel文件的.NET API。 其中有几个。 这是我使用的: http : //exceldatareader.codeplex.com/

我从来没有使用过,但你可能想看看这个:

http://www.calc4web.com/

它似乎是做你想做的,只用C ++而不是C#,但重点是,你得到一些代码,然后可以编译和使用(或如果你真的需要它是C#翻译)。

在这个问题的答案中:

从Excel中了解/build模公式

Joe Erickson给出了他的产品Spreadsheet Gear的链接,但是我从来没有用过。

如果您的公司具有SharePoint 2007或2010,则可能需要查看Excel Services ,该服务可让您通过SharePoint Web部件在Excel工作簿中使用计算。 不知道您是否能够将该Web部件公开给其他ASP.NET应用程序,但可能值得研究

尝试使用此代码,可能会帮助

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) { } }