我正在寻找一些解决方案,但未找到一个,目前我在使用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;
}
}
我可以将空白单元格空白而不将数据向左移动的任何其他方式吗?
所有帮助将不胜感激! :)
谢谢!
答案 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的唯一方法。在阅读过程中添加空白单元格是浪费时间。您可以根据自己添加更多逻辑 试试这个。这肯定会奏效。或者如果你找到更好的解决方案,请告诉我 祝你有愉快的一天:)