C#:OpenXML数值Excel单元格未返回正确的值

C#:OpenXML数值Excel单元格未返回正确的值,c#,excel,openxml,C#,Excel,Openxml,这是我的第一篇博文,如果它看起来不好或者格式很奇怪,我很抱歉 无论如何,我需要找到一种方法来使用OpenXML获取数字(非字符串)单元格的正确值,但是对于一些电子表格,我当前的方法似乎不起作用 对于不同的电子表格,我需要如何编写代码似乎有所不同 一旦我访问了一个Excel文件并打开了其中的一个工作表,我就会得到当前工作表的列数和行数,并开始循环。在这些循环中,下面的代码用于使用单元格引用(使用父循环创建)作为指南将每个单元格添加到数据表中。这是循环代码: //making the cell in

这是我的第一篇博文,如果它看起来不好或者格式很奇怪,我很抱歉

无论如何,我需要找到一种方法来使用OpenXML获取数字(非字符串)单元格的正确值,但是对于一些电子表格,我当前的方法似乎不起作用

对于不同的电子表格,我需要如何编写代码似乎有所不同

一旦我访问了一个Excel文件并打开了其中的一个工作表,我就会得到当前工作表的列数和行数,并开始循环。在这些循环中,下面的代码用于使用单元格引用(使用父循环创建)作为指南将每个单元格添加到数据表中。这是循环代码:

//making the cell index/location of the cell (for example: B10, E17, AE14, ...) based on our row/column indexing so far
cellRef = ConvertColNumToLetter(startColNum + column) + (y + StartRow).ToString();
//getting the specific cell at the cell index of our cellRef
workingCell = cells.Where(c => c.CellReference == cellRef).FirstOrDefault();

//using a try-catch to solve the issue of the program failing whenever the cell has no inner text to take
try
{
    if (workingCell.InnerText == null)
        value = "";
    else
    {
        value = workingCell.InnerText;
    }

    //if the cell's data is a string
    if (workingCell.DataType != null && workingCell.DataType.Value == CellValues.SharedString)
    {
        var stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
        if (stringTable != null)
            value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
        dataRow[colIterator] = value.ToString();
        colIterator++;
    }
    //if the cell's data is numeric
    else if (workingCell.CellValue != null)
    {
        value = workingCell.CellValue.InnerText.ToString();
        dataRow[colIterator] = value;
        colIterator++;
    }
    //if the cell doesn't have any data
    else
    {
        dataRow[colIterator] = "";
        colIterator++;
    }
}
//this will only fail if the cell didn't have any data/the data is null
catch
{
    dataRow[colIterator] = "";
    colIterator++;
}
//根据到目前为止我们的行/列索引制作单元格索引/单元格位置(例如:B10、E17、AE14等)
cellRef=ConvertColNumToLetter(startColNum+列)+(y+StartRow).ToString();
//在cellRef的单元格索引处获取特定单元格
workingCell=cells.Where(c=>c.CellReference==cellRef.FirstOrDefault();
//使用try-catch解决程序在单元格没有内部文本时失败的问题
尝试
{
if(workingCell.InnerText==null)
value=“”;
其他的
{
值=workingCell.InnerText;
}
//如果单元格的数据是字符串
if(workingCell.DataType!=null&&workingCell.DataType.Value==CellValues.SharedString)
{
var stringTable=workbookPart.GetPartsOfType().FirstOrDefault();
if(stringTable!=null)
value=stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
dataRow[colIterator]=value.ToString();
协同畸胎器++;
}
//如果单元格的数据是数字
else if(workingCell.CellValue!=null)
{
value=workingCell.CellValue.InnerText.ToString();
dataRow[colIterator]=值;
协同畸胎器++;
}
//如果单元格没有任何数据
其他的
{
dataRow[colIterator]=“”;
协同畸胎器++;
}
}
//只有当单元格没有任何数据/数据为空时,此操作才会失败
抓住
{
dataRow[colIterator]=“”;
协同畸胎器++;
}
我的代码在遇到99%的电子表格时都能正常工作。我唯一的问题是在一个特定的电子表格上无法正确访问数值,但在所有其他电子表格上似乎都能获得正确的数值

对于普通电子表格,将返回公式中存储的任何数值。例如,下面是一个电子表格中的单元格值:“31313308.87”。当我的程序到达该单元格时,以下是工作单元格的详细信息(工作单元格是当前单元格引用位置的单元格):

正如您所看到的,这是我想要的值,将通过程序并将正确的值存储到datatable中

但给我带来问题的电子表格很奇怪。当我到达一个数值单元格时,我得到的是完全错误的值。打开实际的电子表格,有一个数值为“502028.6”的数值单元格,但我的程序在workingCell的详细信息中得到了以下信息:

我不确定“279907”是从哪里来的,也不确定我应该如何获得正确的值

还有一件奇怪的事。电子表格的下三个值是零,它们在工作单元的CellValue和InnerText中都返回0。电子表格上的下一个值是“-160”,在工作单元的详细信息中显示:

1500在CellValue和InnerText中

同样,这是唯一的电子表格,这是发生在(或至少是唯一一个,我知道的)。程序也会返回正确的字符串值,但在这个特定的电子表格上,我的程序似乎没有拾取任何数值(尽管它工作正常,并且为我迄今为止使用过的数百个其他电子表格返回了正确的数值)

是否有一些简单的解决方案,我只是没有看到?我希望你能给我一些建议,如果你需要更多的信息,我很乐意澄清

提前感谢您的帮助

--编辑:

当我问这个问题时,我忘记了指定,但是不正确的数据(不正确的CellValues和InnerText)实际上被成功地处理到else if语句中,然后添加到datatable中。在向datatable添加值方面,我没有任何问题,但我似乎无法在一个特定的电子表格上为数字单元格获得正确的单元格值和内部文本。您必须修复该异常处理。现在,您可以捕获并尝试处理致命异常—这是您永远不应该尝试做的一件事。实际上,您甚至不应该首先遇到与null相关的异常。下面是我经常链接的两篇关于正确异常处理的文章:|一旦修复了异常处理代码,您就应该拥有实际调试代码所需的最小数据量problem@Christopher我知道异常处理很糟糕,但这还不是最终的项目。我忘了指定,但问题出现在else-if语句中。我没有在我提到的电子表格中发现任何错误,为了找到问题,我调试并查看了程序前进时的变量值。数据实际上是在不使用catch的情况下处理的。它最终被处理到else if语句中并成功添加到datatable中,但值不正确,调试器无法帮助我找到问题。这可能是我的一个愚蠢问题,但您确定文件中的工作表正确吗?像“277907”这样的值是否存在于该工作表/工作簿的其他地方?@DavidZemens这根本不是一个愚蠢的问题。我确实有一个包含文件路径的变量,并将其设置为我想要的特定电子表格