NPOI读取Excel设置单元格格式为数值不生效问题

初学C#踩坑第一篇

NPOI读取Excel设置单元格格式为数值不生效问题

问题简介:
C#使用NPOI写入Excel是修改单元格不能修改,生成后Excel需要打开后双击单元格才会改变格式,话不多说下面直接讲解决办法。

出现问题点:
给单元格赋值时全部赋值的时String类型的值,所以导致单元格格式不生效。

解决方法:
为单元格赋值时赋值相应类型的值,例如:单元格格式为数值,则赋值double。

 //设置单元格格式代码
 IDataFormat dataformat = workbook.CreateDataFormat();
 ICellStyle style2 = workbook.CreateCellStyle();
 style2.DataFormat = dataformat.GetFormat("0.0"); //改变小数精度【小数点后有几个0表示精确到小数点后几位】
IDataFormat dataformat = workbook.CreateDataFormat();
ICellStyle style2 = workbook.CreateCellStyle();
style2.DataFormat = dataformat.GetFormat("0.0"); //改变小数精度【小数点后有几个0表示精确到小数点后几位】
foreach (DataRow row in sourceTable.Rows)
{
    IRow dataRow = sheet.CreateRow(rowIndex);
    sheet.CreateRow(rowIndex).Height = 100 * 5;
    foreach (DataColumn column in sourceTable.Columns)
    {
        //遍历DataRow时当列为金额时,将单元格格式改为数值格式
        if (column.ToString() == "金额")
        {
            ICell RowCell = dataRow.CreateCell(column.Ordinal);
            //来看这里 #############################################
            //给单元格赋值时进行一下类型转换 double.Parse((row[column] ?? "").ToString())
            RowCell.SetCellValue(double.Parse((row[column] ?? "").ToString()));
            RowCell.CellStyle = style2;
        }
        else
        {
            ICell RowCell = dataRow.CreateCell(column.Ordinal);
            RowCell.SetCellValue((row[column] ?? "").ToString());
            RowCell.CellStyle = style;
        }


    }

到次就大功告成了。

读取合并单元格的数据,需要使用 NPOI的 CellRangeAddress 类来获取合并单元格的范围,并在处理每个单元格时判断它是否在合并单元格范围内。以下是一个简单的示例代码: ```csharp using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; // 打开 Excel 文件 using (FileStream fs = new FileStream("test.xlsx", FileMode.Open, FileAccess.Read)) { XSSFWorkbook workbook = new XSSFWorkbook(fs); ISheet sheet = workbook.GetSheetAt(0); // 遍历所有行 for (int i = 0; i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); if (row == null) continue; // 遍历所有列 for (int j = 0; j < row.LastCellNum; j++) { ICell cell = row.GetCell(j); if (cell == null) continue; // 判断单元格是否在合并单元格范围内 bool isMerged = false; for (int k = 0; k < sheet.NumMergedRegions; k++) { CellRangeAddress range = sheet.GetMergedRegion(k); if (range.IsInRange(i, j)) { isMerged = true; break; } } // 如果单元格在合并单元格范围内,则获取合并单元格的值 if (isMerged) { ICell firstCell = sheet.GetRow(range.FirstRow).GetCell(range.FirstColumn); Console.WriteLine(firstCell.ToString()); } else { Console.WriteLine(cell.ToString()); } } } } ``` 需要注意的是,由于合并单元格可能跨越多行或多列,因此在判断单元格是否在合并单元格范围内时需要使用 CellRangeAddress 类的 IsInRange 方法。此外,如果单元格在合并单元格范围内,则需要获取合并单元格的第一个单元格的值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值