代码之家  ›  专栏  ›  技术社区  ›  Faraaz

使用openxml从excel中读取时获取浮点数而不是精确字符串

  •  0
  • Faraaz  · 技术社区  · 8 年前

    我只想把它读成字符串里的样子。所以这个应该是7.5,而不是7.499或者其他东西。 任何帮助都将不胜感激。 这是我在datatable中读取Excel的代码

    private static string ConvertFileToDataTable(Stream fileStream, DataTable framworkDatatable, List<FileErrorModel> fileErrorModels)
        {
            string frameworkName;
    
            InitializeDataTable(framworkDatatable);
    
            using (var document = SpreadsheetDocument.Open(fileStream, true))
            {
                var workbookPart = document.WorkbookPart;
    
                var mysheet = (Sheet)document.WorkbookPart.Workbook.Sheets.ChildElements.GetItem(0);
    
                frameworkName = mysheet.Name;
    
                var worksheet = ((WorksheetPart)workbookPart.GetPartById(mysheet.Id)).Worksheet;
    
                var sheetData = (SheetData)worksheet.ChildElements.GetItem(4);
    
                foreach (var row in sheetData.Descendants<Row>())
                {
                    if (row == null) continue;
                    if (row.RowIndex.Value == Constants.ColumnNameRowIndex)
                    {
                        if (row.Descendants<Cell>().Count() > Constants.ValidColumnCount || row.Descendants<Cell>().Count() < Constants.ValidColumnCount)
                        {
                            var error = new FileErrorModel
                            {
                                ErrorText = ValidationMessages.IncompatibleCoulmns,
                                RowNumber = null,
                                ColumnNumber = null
                            };
                            fileErrorModels.Add(error);
                        }
                    }
    
                    if (row.RowIndex.Value == Constants.TableNameRowIndex ||
                        row.RowIndex.Value == Constants.ColumnNameRowIndex) continue;
    
                    framworkDatatable.Rows.Add();
                    var i = 0;
    
                    foreach (var cell in row.Descendants<Cell>())
                    {
                        framworkDatatable.Rows[framworkDatatable.Rows.Count - 1][i] = GetCellValue(document, cell);
                        i++;
                    }
                }
            }
            return frameworkName;
        }
    

    这就是我初始化数据表的方法

    private static void InitializeDataTable(DataTable framworkDatatable)
        {
            framworkDatatable.Columns.AddRange(new[] {
                    new DataColumn(ImportSheetColumnNames.ControlFamilyIdentifier, typeof(string)),
                    new DataColumn(ImportSheetColumnNames.ControlFamilyShortName, typeof(string)),
                    new DataColumn(ImportSheetColumnNames.ControlFamilyDescription,typeof(string)),
                    new DataColumn(ImportSheetColumnNames.ControlIdentifier,typeof(string)),
                    new DataColumn(ImportSheetColumnNames.ControlType,typeof(string)),
                    new DataColumn(ImportSheetColumnNames.ControlDescription,typeof(string)),
                    new DataColumn(ImportSheetColumnNames.TestProcedure,typeof(string)),
                    new DataColumn(ImportSheetColumnNames.BestPractice,typeof(string)),
                    new DataColumn(ImportSheetColumnNames.Help,typeof(string)),
                    new DataColumn(ImportSheetColumnNames.ActionPlan,typeof(string)),
                    new DataColumn(ImportSheetColumnNames.Question,typeof(string))
            });
        }
    

    忽略“ImportSheetColumnNames”,它们只是常量列名

    2 回复  |  直到 8 年前
        1
  •  0
  •   Stefan Hubert    8 年前

    简而言之:(二进制)浮点数不能精确表示小数点7.5。没有理由相信你的代码有问题。更多详情,如: Why can't decimal numbers be represented exactly in binary?

        2
  •  0
  •   Flydog57    8 年前

    如果在Excel中打开工作表(不是在单元格中,而是在编辑栏中),会看到什么?

    如果我创建一个新的Excel电子表格并在相应的单元格中输入以下值:

    A1 = 7.5
    A2 = 7.4999999
    A3 = 7.49  (but formatted to have a single decimal point showing)
    

    我在工作表中看到这三个值都是7.5,但在公式栏中看到了这些值。

    现在,如果我查看该文件(使用Open XML Productivity工具-可从Microsoft.com下载,对于任何打开的XML工作都是必不可少的),我会看到以下文件保存在

      • /xl/workbook.xml文件
        • /xl/工作表/sheet1.xml
          • x: 工作表
            • x: 表数据:

    :

    <x:sheetData xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
      <x:row r="1" spans="1:1" x14ac:dyDescent="0.25" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
        <x:c r="A1">
          <x:v>7.5</x:v>
        </x:c>
      </x:row>
      <x:row r="2" spans="1:1" x14ac:dyDescent="0.25" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
        <x:c r="A2">
          <x:v>7.4999998999999997</x:v>
        </x:c>
      </x:row>
      <x:row r="3" spans="1:1" x14ac:dyDescent="0.25" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
        <x:c r="A3" s="1">
          <x:v>7.49</x:v>
        </x:c>
      </x:row>
    </x:sheetData>
    

    这就是文件中的内容 <x:v/> 元素表示“值”)。Excel不存储“单元格中的字符串”,它存储值,还存储环境中描述如何向用户显示内容的所有内容。7.499999的值几乎是7.5,在Excel中显示为7.5,但它存储为7.499999。7.5没有存储,除非尝试重新创建Excel的所有显示规则,否则无法重新创建它。