SpreadsheetGear API сам по себе не решит вашу проблему здесь. Если у ваших пользователей есть возможность удалять (или вставлять, или переупорядочивать) столбцы, и вы не можете узнать, какие столбцы были затронуты, учитывая приведенный выше сценарий рабочей таблицы, вам просто не повезло.
Чтобы учесть такие операции, вам необходимо добавить некоторую форму «метаданных» в столбцы таблицы, которые позволят вам отслеживать это. Как вы заметили, если у вас есть что-то вроде следующего, где строка [заключенная в скобки] представляет заголовок столбца ...
[ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ]
1 2 3 4 5 6 7
... и пользователь удаляет столбцы D и E, вы остаетесь с помощью следующего:
[ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ]
1 2 3 6 7
Чтобы обнаружить это, вы можете ввести какое-то известное значение где-нибудь в каждом столбце, для которого вы можете проверить его существование, например, свою собственную строку «заголовка» в строке 1 рабочего листа, например:
[ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ]
Col A Col B Col C Col D Col E Col F Col G
1 2 3 4 5 6 7
Если столбцы D и E будут удалены, например ...
[ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ]
Col A Col B Col C Col F Col G
1 2 3 6 7
... тогда вы, вероятно, сможете обнаружить при l oop над каждым столбцом в первой строке и сравните его со своим собственным списком известных имен заголовков (т. е. «Col A», «Col B» и т. д. c.) и обработайте его соответствующим образом. Если ваши пользователи также могут вставлять столбцы или изменять порядок столбцов, вам, возможно, потребуется повысить гибкость этой процедуры для обработки таких случаев.
Вместо зависимости от наличия некоторой части информации в ячейке в каждой столбец, если у вас есть возможность предоставить вашему клиенту файл «шаблона», для которого он может заполнить данными, более надежным решением может быть установка каждого столбца на привязанное к нему определенное имя. Например, приведенный ниже код SpreadsheetGear будет давать имена столбцам от A до D:
using SpreadsheetGear;
...
IWorkbook workbook = Factory.GetWorkbook();
IWorksheet worksheet = workbook.Worksheets["Sheet1"];
worksheet.Names.Add("ProductColumn", "=$A:$A");
worksheet.Names.Add("PriceColumn", "=$B:$B");
worksheet.Names.Add("QuantityColumn", "=$C:$C");
worksheet.Names.Add("TotalColumn", "=$D:$D");
workbook.SaveAs(@"c:\path\to\workbook.xlsx", FileFormat.OpenXMLWorkbook);
// Give this workbook to your client to populate with data....
Затем, когда вы вернете заполненный файл, чтобы проверить удаленные столбцы, вы можете сделать следующее:
// Open populated workbook from customer. Columns could have been deleted, inserted or reordered...
IWorkbook workbook = Factory.GetWorkbook(@"c:\path\to\workbook.xlsx");
IWorksheet worksheet = workbook.Worksheets["Sheet1"];
// You'll need a list of known defined names for each column.
List<string> names = new List<string>() { "ProductColumn", "PriceColumn", "QuantityColumn", "TotalColumn" };
foreach (string name in names)
{
// The INames[...] indexer will return null if the name is not found.
IName definedName = worksheet.Names[name];
if (definedName == null)
{
Console.WriteLine($"They deleted column {name}!");
}
}
В итоге, вам понадобится какая-то идентифицирующая информация в каждом столбце самой таблицы для обнаружения таких изменений. Если вы практически не можете контролировать оригинальную рабочую книгу, вам может не повезти обнаружить такие изменения.