假设我得到一个缺少D和E列的电子表格:
B、C、F、G
如何使用SpreadsheetGear检测D和E列是否丢失?
我有SpreadsheetGear 2012。
re:你能更具体地解释一下“失踪”是什么意思吗?
当您开始使用新的电子表格时,您将拥有如下所示的所有列:
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读取数据。
谢谢你,艾德
发布于 2020-01-18 04:33:47
单独的SpreadsheetGear应用程序接口不能解决这里的问题。如果您的用户能够删除(或插入或重新排列)列,而您无法知道哪些列受到了影响,考虑到上面提供的工作表方案,那么您就不走运了。
要说明此类操作,您需要在工作表列中添加某种形式的“元数据”,以便跟踪此操作。正如您所指出的,如果您有如下内容,其中括号中的行表示列标题...
[ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ]
1 2 3 4 5 6 7如果用户删除了列D和E,则只剩下以下内容:...and:
[ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ]
1 2 3 6 7要检测这一点,您可以在每一列中的某处引入一些已知值,以便检查其是否存在,例如在工作表的第1行上您自己的"header“行,例如:
[ 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...then在循环第一行中的每一列时,您大概能够检测到它,并将其与您自己的已知标头名称列表(即"Col“、"Col”等)进行比较。并进行相应的处理。如果您的用户还可以插入列或重新排序列,则可能需要在此例程中构建更多的灵活性来处理此类情况。
如果您能够为您的客户提供一个“模板”文件,让他们可以填充数据,而不是依赖于每列中是否存在某些信息,一个更健壮的解决方案可能是将每列设置为具有与其关联的已定义名称。例如,下面的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}!");
}
}底线是,您需要在工作表本身的每一列中具有某种类型的标识信息,以检测此类更改。如果您对原始工作簿几乎没有控制权,那么您可能就没有那么幸运了,无法检测到这样的更改。
https://stackoverflow.com/questions/59755371
复制相似问题