【问题标题】:Check an Excel Cell Data Type检查 Excel 单元格数据类型
【发布时间】:2010-05-06 02:36:59
【问题描述】:

是否可以确定 Excel 单元格的数据类型和格式?

我知道有.NumberFormat,但它返回的是格式而不是类型...

我需要知道它是否是自定义的,那么它应该返回自定义,货币应该返回货币等等。

【问题讨论】:

    标签: c# excel vsto


    【解决方案1】:

    在底层,Excel 以一种特殊的方式存储值(大多数数据类型实际上是双精度的),这使得在没有 Excel 帮助的情况下检测单元格格式变得很棘手。

    因此,我建议您利用内置的 Excel CELL 函数,而不是自己询问数据类型:

    private void button1_Click(object sender, EventArgs e) 
    {
        //C1 is a cell I use to evaluate the Format of Cells A1 thru to A7
        using (var rnEvaluate = xlApp.Range["C1:C1"].WithComCleanup())
        {
            for (int i = 1; i < 8; i++)
            {
                rnEvaluate.Resource.Value2 = "=CELL(\"format\",A" + i.ToString() + ")";
                string cellFormat = GetExcelCellFormat(rnEvaluate.Resource.Value2);
                System.Diagnostics.Debug.Write(cellFormat);
            }
        } 
    }
    
    private string GetExcelCellFormat(string cellFormat = "G") 
    {
        switch (cellFormat.Substring(0, 1))
        {
            case "F" :
                return "Number";
                break;
            case "C":
                return "Currency";
                break;
            case "D":
                return "Date";
                break;
            default :
                return "General";
                break;
        } 
    }
    

    ps .WithComCleanup() 是因为我使用的是VSTO Contrib

    【讨论】:

      【解决方案2】:

      这取决于,如果它是一个 xslx 文件(Open XML excel),那么您可以解压缩 xlslx 文件(xlsx 是一个 zip 文件)并在 xl\worksheets\sheet{?}.xml 文件中检查该特定单元格.

      不过,这可能是一种过于复杂的方法。

      【讨论】:

      • 如果任务需要在服务器上完成,它并不过分复杂,KB257757。问题是像我这样的方法,单元格数据类型描述不完整,例如在 XML 中,数字单元格不指定小数位:&lt;Data ss:Type="Number"&gt; :(
      【解决方案3】:

      从 Excel 范围中获取NumberFormat 后,您可以使用this table of formatting codesthis reference from Microsoft 对其进行转换。请记住,如果自定义,则可以使用混合格式。

      如果您只需要基本值(我在 Excel 2010 中的下拉菜单中的默认值):

      • “0.00” - 数字
      • "$#,##0.00" - 货币
      • "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??);(@ _)" - 会计
      • "m/d/yyyy" - 短日期
      • "[$-F800]dddd, mmmm dd, yyyy" - 长日期
      • "[$-F400]h:mm:ss AM/PM" - 时间
      • “0.00%” - 百分比
      • “# ?/?” - 分数
      • “0.00E+00” - 科学
      • “@” - 文本
      • “常规”- 常规

      我通过录制宏并修改所选单元格的数字格式来获得这些值。


      编辑:
      获得更多帮助以到达您想去的地方 - 假设您正在使用 Excel 互操作库(我知道如何访问 NumberFormat 函数的唯一方法):

      string fileName = @"c:\Book1.xlsx";
      Application app = new Application();
      Workbook wb = app.Workbooks.Open(fileName,
         Type.Missing, Type.Missing, Type.Missing, Type.Missing,
         Type.Missing, Type.Missing, Type.Missing, Type.Missing,
         Type.Missing, Type.Missing, Type.Missing, Type.Missing,
         Type.Missing, Type.Missing);
      Worksheet sheet = wb.Sheets[1];  //Change to the sheet you care about (1 based index)
      var cell = sheet.Cells[1, 1];    //Change to the cell you care about (1 based index)
      string cellNumberFormat = cell.NumberFormat; //Number format of cell to compare against known values
      

      使用找到的互操作库的设置here

      【讨论】:

      • 另外,如果您觉得您标记的答案不足以满足您的需求,请随时更改已接受的答案。
      • 这没有回答乔恩,试试NumberFormat - 尽管单元格是货币、日期或其他格式,但它会吐出“一般”。链接也没有多大帮助。
      • 我认为可以通过 OP 的这一行来消除混淆 - “我知道有 .NumberFormat 但它返回格式但不返回类型......”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多