Я забываю, как сделать этот каждый раз также, таким образом, я просто обертываю две остроты, в которых я нуждаюсь в небольшом классе:
public class Utility
{
/// <summary>
/// Takes the full name of a resource and loads it in to a stream.
/// </summary>
/// <param name="resourceName">Assuming an embedded resource is a file
/// called info.png and is located in a folder called Resources, it
/// will be compiled in to the assembly with this fully qualified
/// name: Full.Assembly.Name.Resources.info.png. That is the string
/// that you should pass to this method.</param>
/// <returns></returns>
public static Stream GetEmbeddedResourceStream(string resourceName)
{
return Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
}
/// <summary>
/// Get the list of all emdedded resources in the assembly.
/// </summary>
/// <returns>An array of fully qualified resource names</returns>
public static string[] GetEmbeddedResourceNames()
{
return Assembly.GetExecutingAssembly().GetManifestResourceNames();
}
}
Я бы начал со свойства UsedRange, а затем для каждой ячейки в последней строке UsedRange do Cell.End (xlUp). Это должно дать вам последнюю ячейку для каждого столбца, ячейка с максимальным индексом строки является последней ячейкой в вашем истинном используемом диапазоне.
Свойство UsedRange может отображаться неправильно, поскольку, когда ячейки очищаются, но не удаляются, свойство UsedRange не обновляется. Чтобы снова сделать свойство UsedRange действительным, просто выберите все строки и столбцы после последней ячейки (то есть все пустые ячейки) и перейдите в режим редактирования-> удалить.
Я использовал Sheet.UsedRange сам по себе, но заметил, что некоторые ячейки в конце диапазона были пустыми, но все же включены в диапазон.
Это работает, однако для эффективности вы можете лучше смотреть с последней строки в диапазоне и вести обратный отсчет, чтобы увидеть, где заканчиваются ваши данные (в отличие от этого фрагмента, который начинается с первой строки!)
int count = 0;
E.Range excelRange = sheet.UsedRange;
object[,] valueArray = (object[,])excelRange.get_Value(E.XlRangeValueDataType.xlRangeValueDefault);
if (valueArray.GetUpperBound(0) > 1)
{
for (int i = 0; i < valueArray.GetUpperBound(0) + 2; i++)
{
if (valueArray[i + 2, 1] == null)
break;
else
count++;
}
}
Я просмотрел несколько веб-сайтов с использованием библиотеки ExcelPackage.
Кроме того, на странице codeplex есть вопрос - как получить количество строк / столбцов?
Похоже, что это не поддерживается. К сожалению, документация также недоступна.
Вам нужно будет выполнить итерацию по строкам / столбцам (учитывая максимальное количество строк / столбцов, которое может содержать электронная таблица) и проверить, содержит ли ячейка какое-либо значение.
См. Эту ссылку - http: //web.archive. org / web / 20110123164144 / http: //nayyeri.net/use-excelpackage-to-manipulate-open-xml-excel-files (исходная ссылка мертва)
Я выполнил следующий цикл, чтобы решить проблему. Он работает нормально, только если вы заранее знаете, сколько столбцов будет. В противном случае потребуется еще одна итерация цикла.
int totalCells = 0;
int totalRows = -1;
do
{
totalRows++;
} while (worksheet.Cell(totalRows + 1, 1).Value != @"");
totalCells = totalRows * 12;