C# - 使用OpenXML如何读取excel文件上的空格

时间:2012-03-19 14:34:35

标签: c# openxml

我正在寻找一些解决方案,但未找到一个,目前我在使用OpenXML读取excel文件时遇到问题。对于完美的数据,不会有任何问题,但是对于带有空格的数据,列似乎向左移动,产生错误,指出索引不正确,因为它实际上向左移动。我找到了一个解决方案,你可以把它放在介于两者之间的单元格中,但是当我尝试它时,一个错误说一个对象引用没有设置为一个对象的实例,同时用这个代码读取某个单元格(源代码来自于这里插入单元格How do I have Open XML spreadsheet "uncollapse" cells in a spreadsheet?

public static string GetCellValue(SpreadsheetDocument document, Cell cell)
{
    SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
    string value = cell.CellValue.InnerXml;

    if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
    {
        return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
    }
    else if (cell == null)
    {
        return null;
    }
    else
    {
        return value;
    }
}

我可以将空白单元格空白而不将数据向左移动的任何其他方式吗?

所有帮助将不胜感激! :)

谢谢!

1 个答案:

答案 0 :(得分:3)

在Open XML中,xml文件不包含空白单元格的条目,这就是跳过空白单元格的原因。我遇到了同样的问题。唯一的解决方案是应用一些逻辑。

例如:

当我们读取一个单元格时,我们可以通过以下代码获取其ColumnName(A,B,C等)

string cellIndex = GetColumnName( objCurrentSrcCell.CellReference );

其中

 public static string GetColumnName(string cellReference)
        {
            // Create a regular expression to match the column name portion of the cell name.
            Regex regex = new Regex("[A-Za-z]+");
            Match match = regex.Match(cellReference);
            return match.Value;
        }

您可以将这些单元格存储在Hashtable中,其中key可以是单元格 ColumnName ,value可以是单元格的对象。当在某些基础上连续编写来自散列对象的获取单元或者像......这样的逻辑时

你可以从A循环到Z 并读取特定键的单元格,如

if(objHashTable.Contains(yourKey))
{
    Cell objCell = (Cell) objHashTable[yourKey];
    //Insertcell or process cell   
}
else
{
   //do process for the empty cell like you may add a new blank cell
   Cell objCell = new Cell();
   //Insert cell or process cell
}

这是使用open xml的唯一方法。在阅读过程中添加空白单元格是浪费时间。您可以根据自己添加更多逻辑 试试这个。这肯定会奏效。或者如果你找到更好的解决方案,请告诉我 祝你有愉快的一天:)