Это имеет смысл, поскольку Excel не будет хранить значение для ячейки, которая является нулевой.Если вы откроете свой файл с помощью инструмента повышения производительности Open XML SDK 2.0 и просмотрите XML до уровня ячеек, вы увидите, что в этом файле будут находиться только те ячейки, в которых есть данные.
Вы можете вставить пустые данные в диапазон ячеек, которые вы собираетесь обойти, или программно выяснить, была ли пропущена ячейка, и соответствующим образом настроить ваш индекс.
Я создал пример документа Excel сстрока в ячейке ссылки A1 и C1.Затем я открыл документ Excel в инструменте повышения производительности Open XML, и вот XML-файл, который был сохранен:
<x:row r="1" spans="1:3"
xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:c r="A1" t="s">
<x:v>0</x:v>
</x:c>
<x:c r="C1" t="s">
<x:v>1</x:v>
</x:c>
</x:row>
Здесь вы увидите, что данные соответствуют первой строке и что только две ячейки стоятданные сохраняются для этой строки.Сохраненные данные соответствуют A1 и C1, и ни одна ячейка с нулевыми значениями не сохраняется.
Чтобы получить необходимую вам функциональность, вы можете перемещаться по ячейкам, как вы делали выше, но вам нужно будет проверить, на какое значение ссылается ячейка, и определить, были ли пропущены какие-либо ячейки.для этого вам понадобятся две служебные функции, чтобы получить имя столбца из ссылки на ячейку и затем преобразовать имя этого столбца в индекс, основанный на нуле:
private static List<char> Letters = new List<char>() { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ' };
/// <summary>
/// Given a cell name, parses the specified cell to get the column name.
/// </summary>
/// <param name="cellReference">Address of the cell (ie. B2)</param>
/// <returns>Column Name (ie. B)</returns>
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;
}
/// <summary>
/// Given just the column name (no row index), it will return the zero based column index.
/// Note: This method will only handle columns with a length of up to two (ie. A to Z and AA to ZZ).
/// A length of three can be implemented when needed.
/// </summary>
/// <param name="columnName">Column Name (ie. A or AB)</param>
/// <returns>Zero based index if the conversion was successful; otherwise null</returns>
public static int? GetColumnIndexFromName(string columnName)
{
int? columnIndex = null;
string[] colLetters = Regex.Split(columnName, "([A-Z]+)");
colLetters = colLetters.Where(s => !string.IsNullOrEmpty(s)).ToArray();
if (colLetters.Count() <= 2)
{
int index = 0;
foreach (string col in colLetters)
{
List<char> col1 = colLetters.ElementAt(index).ToCharArray().ToList();
int? indexValue = Letters.IndexOf(col1.ElementAt(index));
if (indexValue != -1)
{
// The first letter of a two digit column needs some extra calculations
if (index == 0 && colLetters.Count() == 2)
{
columnIndex = columnIndex == null ? (indexValue + 1) * 26 : columnIndex + ((indexValue + 1) * 26);
}
else
{
columnIndex = columnIndex == null ? indexValue : columnIndex + indexValue;
}
}
index++;
}
}
return columnIndex;
}
Затем вы можете выполнить итерацию по ячейкам и проверитьпосмотрите, что ссылка на ячейку сравнивается с columnIndex.Если оно меньше, чем вы добавляете пустые данные в ваш tempRow, в противном случае просто прочитайте значение, содержащееся в ячейке.(Примечание: я не тестировал приведенный ниже код, но общая идея должна помочь):
DataRow tempRow = dt.NewRow();
int columnIndex = 0;
foreach (Cell cell in row.Descendants<Cell>())
{
// Gets the column index of the cell with data
int cellColumnIndex = (int)GetColumnIndexFromName(GetColumnName(cell.CellReference));
if (columnIndex < cellColumnIndex)
{
do
{
tempRow[columnIndex] = //Insert blank data here;
columnIndex++;
}
while(columnIndex < cellColumnIndex);
}
tempRow[columnIndex] = GetCellValue(spreadSheetDocument, cell);
if (tempRow[i].ToString().IndexOf("Latency issues in") > -1)
{
Console.Write(tempRow[i].ToString());
}
columnIndex++;
}