[英]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.