Как обнаружить отсутствующие столбцы в SpreadsheetGear - PullRequest
0 голосов
/ 15 января 2020

Предположим, я получаю электронную таблицу с отсутствующими столбцами D и E:

AB C FG

Как определить, что столбцы D и E отсутствуют с помощью SpreadsheetGear?

У меня есть SpreadsheetGear 2012.

re: Можете ли вы более конкретно указать c о том, что означает «отсутствующий»?

Когда вы начнете с новой электронной таблицы, у вас будут все столбцы, подобные этим:

A B C D E F G

Тогда, скажем, пользователь вводит некоторые данные в каждый из столбцов с номерами от 1 до 7 Теперь электронная таблица будет выглядеть так:

A B C D E F G...
1 2 3 4 5 6 7

Тогда предположим, что пользователь удаляет столбцы D и E.

Теперь электронная таблица выглядит следующим образом:

A B C F G...
1 2 3 6 7

Предположим, я использую SpreadsheetGear для чтения таких данных:

S = Work_Sheet_Obj.Cells(Row, 3).Text ' Get Column D
T = Work_Sheet_Obj.Cells(Row, 4).Text ' Get Column E

Поскольку столбцы D и E отсутствуют, я получаю неверные данные.

Я хотел бы иметь возможность обнаружить это столбцы D и E отсутствуют до попытки получить значения данных.

re: Написать формулу.

Я не знаю, как написать предложенную вами формулу. Я бы предпочел использовать методы SpreadsheetGear для обнаружения пропущенных столбцов.

Проблема в том, что кто-то другой вручную создает электронные таблицы, а затем я использую SpreadsheetGear для чтения данных.

Спасибо, Эд

1 Ответ

0 голосов
/ 17 января 2020

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}!");
    }
}

В итоге, вам понадобится какая-то идентифицирующая информация в каждом столбце самой таблицы для обнаружения таких изменений. Если вы практически не можете контролировать оригинальную рабочую книгу, вам может не повезти обнаружить такие изменения.

...