I have a code to read Excel file into data-table using OpenXml, it works fine but however, when I read a string like this "7.5" it gives me "7.4999999" in float format why is it so? I just want to read it as it is i.e in the string. so this should "7.5" should be 7.5 only not 7.499 or any other thing. any help would be appreciated. here is my code to read Excel in datatable
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;
}
this is how I initialize Datatable
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))
});
}
ignore "ImportSheetColumnNames", they are just constants column names