如何在spreadsheetlight中使用c#获取格式的单元格类型

时间:2014-03-24 14:26:35

标签: c# excel openxml spreadsheet spreadsheetlight

我正在使用spreadsheetlight库来使用c#读取excelsheet(.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    
     }

我正在获取单元格值。但是我如何获得单元格的数据类型。我已经检查过文档,但是dint会提供解决方案。

注意:对于.xls类型的excel文件我正在使用ExcelLibrary.dll库,我可以使用下面的代码轻松获取单元格的数据类型

for (int i = 0; i <= cells.LastColIndex; i++)
     {
         var type = cells[0, i].Format.FormatType;
     }

但是在电子表格中没有类似的方法。

提前致谢。

4 个答案:

答案 0 :(得分:1)

以下是开发人员Vincent Tang在我问他之后给出的答案,因为我不确定如何使用DataType:


是使用SLCell.DataType。它是一个枚举,但对于大多数数据,您将使用Number,SharedString和String。

文本数据将是SharedString,如果文本直接嵌入工作表中,则可能是String。有一个GetSharedStrings()或类似的东西。

对于数字数据,它将是数字。

对于约会来说,这有点棘手。数据类型也是数字(忽略日期枚举,因为Microsoft Excel不使用它)。对于日期,您还必须检查FormatCode,它位于SLCell的SLStyle中。使用GetStyles()获取列表。 SLCell.StyleIndex为您提供该列表的索引。

例如,如果您的SLCell具有单元格值&#34; 15&#34;和数据类型SharedString,然后在共享字符串列表中查找索引15。如果它&#34; blah&#34;使用String数据类型,那就是它。

如果它的号码类型为56789,那就是它。

除非FormatCode是&#34; mm-yyyy&#34; (或其他一些日期格式代码),那么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帮助文件时遇到了问题。试试这个:

  • 右键单击chm文件并选择属性
  • 点击“常规”选项卡底部的“取消阻止”按钮

答案 1 :(得分:0)

要获取单元格的值,请尝试以下代码

 var cellValue = (string)(excelWorksheet.Cells[10, 2] as Excel.Range).Value;

使用this链接了解详情

答案 2 :(得分:0)

查看SLCell.DataType属性。 Spreadsheetlight文档提到这将返回Spreadsheetlight.SLCell类中的Cell数据类型

public CellValues DataType { get; set; }

PS:旁注,我想出了如何打开chm文档。尝试在Winzip中打开chm文件,打开时没有任何问题。

希望它有所帮助。感谢

答案 3 :(得分:0)

好吧,在经过大量的跟踪和错误方法之后,我必须找到解决方案。

根据单元格的 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%的案例。

希望它对你有所帮助。