【问题标题】:How to convert Text values to number values in Excel 2003 (Number stored as Text), using C#如何使用 C# 在 Excel 2003 中将文本值转换为数值(数字存储为文本)
【发布时间】:2010-01-27 12:28:12
【问题描述】:

似乎有很多建议可以做到这一点,但似乎没有一个可行。

实际上,我想将 Excel 工作表中的文本值更改为数字(这是一个已设置为存储为文本的数字的单元格,旁边有一个绿色菱形)。

webpage 详细介绍了如何通过 UI 在 Excel 中解决问题,我已将其记录为下面的宏(但那是 VBA)...

包括将值设置为自身:

                Range allCellsRng;
                string lowerRightCell = "AZ500";
                allCellsRng = wSheet.get_Range("A1", lowerRightCell).Cells;
                foreach (Range cell in allCellsRng)
                {
                    if (cell.Value2.ToString().Length > 0)
                    {
                        cell.Value2 = cell.Value2;
                    }
                }

这是一个录制的 VB 宏,它显示了可以解决问题的方法,但我在用 C# 表示它时遇到了问题:

ActiveCell.FormulaR1C1 = "0"
Range("A1").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd, SkipBlanks _
    :=False, Transpose:=False
Range("A1").Select

【问题讨论】:

    标签: c# vsto excel-2003


    【解决方案1】:

    使用 Clear Office,代码非常简单:

    SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName);
    foreach (Worksheet worksheet in spreadsheetDocument.Workbook.Sheets.OfType<Worksheet>())
    {
        foreach (Cell cell in worksheet.GetRange("A1:AZ500"))
        {
            string s = cell.Value as string;
            if (s == null)
                continue;
            double d;
            if (double.TryParse(s, out d))
                cell.Value = d;
            }
        }
    spreadsheetDocument.Save();
    

    【讨论】:

      【解决方案2】:

      改变单元格的格式不是更好吗?我相信您应该能够使用

      获取格式
      range.NumberFormat
      

      并将其更改为您想要的实际格式...然后您可以设置整个列或整个工作表的范围。

      【讨论】:

      • 单元格已经格式化为数字,只是 Excel 将数字存储为文本。根据网页链接,如果您按 F2 并输入(基本上打开单元格,然后退出),则该数字将存储为数字。
      • 如果我没记错的话,有一个特殊的 NumberFormat 表示存储为文本,或者在值前面加上一个 ' 做同样的事情。
      • 否则为什么不使用 Range.PasteSpecial() 方法?
      【解决方案3】:

      好的,所以在这里提出问题会引发脑电波。这看起来可行:

      Range cellA1 = wSheet.get_Range("A1", System.Type.Missing);
      cellA1.Value2 = "0";
      cellA1.Copy(System.Type.Missing);
      Range cellAll = wSheet.get_Range("A1:AZ500", System.Type.Missing);
      cellAll.PasteSpecial(XlPasteType.xlPasteAll, XlPasteSpecialOperation.xlPasteSpecialOperationAdd,
              false, false);
      

      【讨论】:

      • 如果宏工作,那么它会工作,因为它与宏完全一样......
      • 此代码仅在您将第一个单元格值设置为 0 时有效,但在任何其他情况下,它只会将其相加,产生不正确的结果
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多