0

它是如何与 excel 一起工作的

decimal LTLPrice = Decimal.Parse(sheet.get_Range("H27").Value.ToString());
decimal mathLTLPrice = Math.Round(LTLPrice, 2);
sheet.get_Range("C29").Value = SumToTextFormatProvider.SumToText(mathLTLPrice, "Lt", "ct");

OleDb 在我的想象中应该是怎样的

myCommand = new OleDbCommand("SELECT * FROM [Sheet1$H27:H27]", MyConnection);
myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
    decimal LTLPrice = Decimal.Parse(myReader.GetString(0));
    decimal mathLTLPrice = Math.Round(LTLPrice, 2);
    myCommand = new OleDbCommand("UPDATE [Sheet1$C29:C29] SET F1='" + SumToTextFormatProvider.SumToText(mathLTLPrice, "Lt", "ct") + "'", MyConnection);
    myCommand.ExecuteNonQuery();
}
myReader.Close();

怎么样

System.InvalidCastException: Specified cast is not valid.
at System.Data.OleDb.ColumnBinding.ValueString()
at System.Data.OleDb.OleDbDataReader.GetString(Int32 ordinal)
at Trains.invoiceForm.invoiceGenerateXls_Click(Object sender, EventArgs e) in D:\Users\Nullified\Documents\Visual Studio 2010\Projects\Trains\Trains\invoiceForm.cs:line 592

错误在这一行

decimal LTLPrice = Decimal.Parse(myReader.GetString(0));

我试过 GetInt32 / GetDecimal 但没有结果。:(

更新

使用 GetDouble 我没有收到错误,但 myReader 返回 0,然后在 excel 中它是“3,49”

4

3 回答 3

2

我有类似的问题,这是我对您的问题的修复:

    decimal LTLPrice = Convert.ToDecimal(myReader.GetValue(0).ToString());

通过抓住“价值”,你不必处理你正在拉动的细节,直到你尝试用它做点什么。

当然,我的问题与您的问题略有不同,因为我只需要将所有内容都转换为字符串。然而,这种方法仍然适用于您,因为 Convert.ToDecimal 将适用于字符串,如果该值当然是可转换的。

于 2013-04-11T12:13:17.987 回答
1

您可以添加此代码

if(myReader.GetString(0) != null)
{
    decimal LTLPrice = Decimal.Parse(myReader.GetString(0).Replace(",",".").Trim());
}   
于 2012-09-24T18:54:08.077 回答
0

发现了问题,我通过 oledb 将数字作为文本存储在 excel 中,尽管事实上如果我们在 excel 中打开 xls 文件,我们仍然可以读取它,并且 excel 会正常计算所有内容,如果是,oledb 无法从 excel 中获取正确的双精度值根据存储为文本的数字计算得出。现在只剩下找到如何在c#中将double存储为excel作为数字,问题就解决了。

于 2012-09-25T06:40:51.257 回答