[英]How to get format type of cell using c# in spreadsheetlight
我正在使用试算表库使用c#读取Excel工作表(.xslx)值。
我可以使用以下代码读取单元格值
for (int col = stats.StartColumnIndex; col <= stats.EndColumnIndex; col++)
{
var value= sheet.GetCellValueAsString(stats.StartRowIndex, col); //where sheet is current sheet in excel file
}
我正在获取单元格值。 但是如何获取单元格的数据类型? 我已经签入了文档,但是没有找到解决方案。
注意:对于.xls类型的excel文件,我正在使用ExcelLibrary.dll库,在其中可以使用以下代码轻松获取单元格的数据类型
for (int i = 0; i <= cells.LastColIndex; i++)
{
var type = cells[0, i].Format.FormatType;
}
但是电子表格中没有类似的方法。
这是我不确定他如何使用DataType后,问他后开发人员Vincent Tang的回答:
是的,请使用SLCell.DataType。 这是一个枚举,但是对于大多数数据,您将使用Number,SharedString和String。
文本数据将为SharedString,如果文本直接嵌入工作表中,则可能为String。 有一个GetSharedStrings()或类似的东西。
对于数字数据,它将是数字。
对于日期,这有点棘手。 数据类型也是Number(忽略日期枚举,因为Microsoft Excel未使用它)。 对于日期,您还必须检查SLCell的SLStyle中的FormatCode。 使用GetStyles()获取列表。 SLCell.StyleIndex为您提供该列表的索引。
例如,如果您的SLCell的单元格值为“ 15”且数据类型为SharedString,则在共享字符串列表中查找索引15。 如果它是String类型的数据,就这样。
如果数字类型是56789,那么就是这样。
除非FormatCode是“ mm-yyyy”(或其他日期格式代码),否则56789实际上是自1900年1月1日以来的天数。
他还建议使用GetCellList()以获得工作表中SLCell对象的列表。 但是,由于某种原因,该功能在我的SL版本中不可用,所以我改用GetCells()。 这将返回SLCell对象的字典,其键类型为SLCellPoint。
因此,例如,要获取单元格A1的DataType(这是一个CellValues对象),请执行以下操作:
using (SLDocument slDoc = new SLDocument("Worksheet1.xlsx", "Sheet1")) {
slCP = SLCellPoint;
slCP.ColumnIndex = SLConvert.ToColumnIndex("A"); ///Obviously 1 but useful function to know
slCP.RowIndex = 1;
CellValues slCV = slDoc.GetCells(slCP).DataType;
}
顺便说一句,我在打开chm帮助文件时也遇到了问题。 尝试这个:
要获取单元格的值,请尝试以下代码
var cellValue = (string)(excelWorksheet.Cells[10, 2] as Excel.Range).Value;
使用此链接了解更多详细信息
签出SLCell.DataType属性。 Spreadsheetlight文档提到在Spreadsheetlight.SLCell类中它返回Cell数据类型。
public CellValues DataType { get; set; }
PS:在旁注中,我想出了如何打开chm文档。 尝试在Winzip中打开chm文件,该文件不会出现任何问题。
希望能帮助到你。 谢谢
好吧,经过大量的跟踪和错误方法,我终于找到了解决方案。
根据单元格的formatCode ,我们可以确定单元格的formatType 。
使用GetCellStyle方法,我们可以获取单元格的格式代码 。 使用这个formatCode,我们可以确定formatType 。
var FieldType = GetDataType(sheet.GetCellStyle(rowIndex, columnIndex).FormatCode);
private string GetDataType(string formatCode)
{
if (formatCode.Contains("h:mm") || formatCode.Contains("mm:ss"))
{
return "Time";
}
else if (formatCode.Contains("[$-409]") || formatCode.Contains("[$-F800]") || formatCode.Contains("m/d"))
{
return "Date";
}
else if (formatCode.Contains("#,##0.0"))
{
return "Currency";
}
else if (formatCode.Last() == '%')
{
return "Percentage";
}
else if (formatCode.IndexOf("0") == 0)
{
return "Numeric";
}
else
{
return "String";
}
}
这种方法适用于99%的情况。
希望对您有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.