C# NPOI 读取数字不正确
时间: 2023-08-02 19:36:27 浏览: 228
C#基于NPOI做的excel高低版本兼容读取
3星 · 编辑精心推荐
这种情况可能是由于NPOI默认将数字列识别为Double类型,而Double类型的精度有限,可能会出现不正确的情况。你可以尝试将数字列识别为Decimal类型,这样可以提高精度。具体操作可以参考以下代码:
```
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Data;
public static DataTable ExcelToDataTable(string filePath)
{
DataTable dt = new DataTable();
IWorkbook workbook;
ISheet sheet;
int startRow = 0;
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
workbook = new XSSFWorkbook(fs); //使用xlsx格式读取
sheet = workbook.GetSheetAt(0);
if (sheet != null)
{
IRow firstRow = sheet.GetRow(0);
int cellCount = firstRow.LastCellNum;
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
{
ICell cell = firstRow.GetCell(i);
if (cell != null)
{
dt.Columns.Add(cell.ToString());
}
}
startRow = sheet.FirstRowNum + 1;
//读取数据
for (int i = startRow; i <= sheet.LastRowNum; ++i)
{
IRow row = sheet.GetRow(i);
if (row == null) continue;
DataRow dataRow = dt.NewRow();
bool isAllEmpty = true;
for (int j = row.FirstCellNum; j < cellCount; ++j)
{
ICell cell = row.GetCell(j);
if (cell == null)
{
dataRow[j] = "";
}
else
{
if (cell.CellType == CellType.Numeric && DateUtil.IsCellDateFormatted(cell)) //处理日期类型
{
dataRow[j] = cell.DateCellValue.ToString("yyyy-MM-dd HH:mm:ss");
}
else
{
dataRow[j] = cell.ToString();
}
//将数字列识别为Decimal类型
if (cell.CellType == CellType.Numeric && dt.Columns[j].DataType == typeof(decimal))
{
dataRow[j] = Convert.ToDecimal(cell.NumericCellValue);
}
}
if (!string.IsNullOrEmpty(dataRow[j].ToString().Trim()))
{
isAllEmpty = false;
}
}
if (!isAllEmpty)
{
dt.Rows.Add(dataRow);
}
}
}
}
return dt;
}
```
在读取数据时,判断列的数据类型是否为Decimal类型,如果是,则将数字列的值转换成Decimal类型。这样可以避免Double类型的精度问题。
阅读全文