.NET NPOI导出时间、公式等格式化

1、业务背景

做导入某业务模块的Excel表格文件时,利用NPOI组件导入,

① 导入的日期错乱(如XX-X月-2022),关于此种情况之前没做格式化做了单独处理,可以查看文章.net NPOI Excel导入:时间格式2022/5/26导入变成26-5月-2022,做了格式化就快捷方便多了

② Excel表中某列通过公式计算好的列导入后获取到的是公式(如D1*E1),不是具体的值,

此时就需要在工作表生成DataTable之前做格式化处理操作,下面直接上代码

2、解决方案

1)写一个判断单元格列类型格式化的公共方法

/// <summary>
/// 判断单元格列的类型
/// </summary>
/// <param name="cell"></param>
/// <returns></returns>
public static object GetValueType(ICell cell)
{
    bool flag = cell == null;
    object result = null;
    if(flag) result = null;
    switch(cell.CellType)
    {
        case CellType.Boolean:
            result = cell.BooleanCellValue;
            break;
        case CellType.Error:
            result = cell.ErrorCellValue;
            break;
        case CellType.Formula:
            switch(cell.CachedFormulaResultType)
            {
                case CellType.Boolean:
                    result = cell.BooleanCellValue;
                    break;
                case CellType.Error:
                    result = ErrorEval.GetText(cell.ErrorCellValue);
                    break;
                case CellType.Numeric:
                    if(DateUtil.IsCellDateFormatted(cell))
                    {
                        result = cell.DateCellValue.ToString("yyyy-MM-dd hh:MM:ss");
                    }
                    else
                    {
                        result = cell.NumericCellValue;
                    }
                    break;
                case CellType.String:
                    string str = cell.StringCellValue;
                    if(!string.IsNullOrEmpty(str))
                    {
                        result = str.ToString();
                    }
                    else
                    {
                        result = null;
                    }
                    break;
                case CellType.Unknown:
                case CellType.Blank:
                default:
                    result = string.Empty;
                    break;
            }
            break;
        case CellType.Numeric:
            if(DateUtil.IsCellDateFormatted(cell))
            {
                result = cell.DateCellValue.ToString("yyyy-MM-dd hh:MM:ss");
            }
            else
            {
                result = cell.NumericCellValue;
            }
            break;
        case CellType.String:
            string strValue = cell.StringCellValue;
            if(!string.IsNullOrEmpty(strValue))
            {
                result = strValue.ToString();
            }
            else
            {
                result = null;
            }
            break;
        case CellType.Unknown:
        case CellType.Blank:
        default:
            result = string.Empty;
            break;
    }
    return result;
}

2)在工作表生成DataTable时调用上述的公共方法

/// <summary>
/// 从工作表中生成DataTable
/// </summary>
/// <param name="sheet"></param>
/// <param name="headerRowIndex"></param>
/// <returns></returns>
public static DataTable GetDataTableFromSheet(ISheet sheet, int headerRowIndex)
{
    DataTable table = new DataTable();
    IRow headerRow = sheet.GetRow(headerRowIndex);
    int cellCount = headerRow.LastCellNum;
    for(int i = headerRow.FirstCellNum; i < cellCount; i++)
    {
        if(headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "")
        {
            // 如果遇到第一个空列,则不再继续向后读取
            cellCount = i;
            break;
        }
        DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
        table.Columns.Add(column);
    }
    for(int i = (headerRowIndex + 1); i <= sheet.LastRowNum; i++)
    {
        IRow row = sheet.GetRow(i);
        //如果遇到某行的第一个单元格的值为空,则不再继续向下读取
        if(row != null && row.GetCell(0) != null && !string.IsNullOrEmpty(row.GetCell(0).ToString()))
        {
            DataRow dataRow = table.NewRow();
            for(int j = row.FirstCellNum; j < cellCount; j++)
            {
                ICell cell = row.GetCell(j);
                object valueType = GetValueType(cell);
                if(valueType == null || valueType.ToString() == string.Empty)
                {
                    dataRow[j] = string.Empty;
                }
                else
                {
                    dataRow[j] = valueType.ToString();
                }
            }
            table.Rows.Add(dataRow);
        }
    }
    return table;
}

3)在Excel导入方法中调用工作表生成DataTable

/// <summary>
/// 由Excel导入DataTable
/// </summary>
/// <param name="excelFileStream">Excel文件流</param>
/// <param name="sheetName">Excel工作表名称</param>
/// <param name="headerRowIndex">Excel表头行索引</param>
/// <param name="isCompatible">是否为兼容模式</param>
/// <returns>DataTable</returns>
public static DataTable ToDataTable(Stream excelFileStream, string sheetName, int headerRowIndex, bool isCompatible)
{
    IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream);
    ISheet sheet = null;
    int sheetIndex = -1;
    if(int.TryParse(sheetName, out sheetIndex))
    {
        sheet = workbook.GetSheetAt(sheetIndex);
    }
    else
    {
        sheet = workbook.GetSheet(sheetName);
    }
    DataTable table = GetDataTableFromSheet(sheet, headerRowIndex);
    excelFileStream.Close();
    workbook = null;
    sheet = null;
    return table;
}

4)文件处理

// 文件处理核心代码
if(files != null && files.Files.Count > 0)
{
    try
    {
        var file = files.Files[0];
        if(file == null)
        {
            return "文件不能为空";
        }
        var fileName = file.FileName;
        // 判断文件大小
        if(file.Length > 10 * 1024 * 1024)
        {
            return "文件大小不能大于10M";
        }
        string fileExtension = file.FileName.Substring(file.FileName.LastIndexOf(".")); // 获取文件名称后缀 
        bool GetIsCompatible = new []
        {
            ".xls", ".xlt"
        }.Count(e => e.Equals(fileExtension, StringComparison.OrdinalIgnoreCase)) > 0;
        // 判断文件格式
        if(!(fileExtension.ToLower() == ".xls" || fileExtension.ToLower() == ".xlsx"))
        {
            return "文件扩展名应该是.xls或.xlsx";
        }
        var stream = file.OpenReadStream();
        var dt = ExcelInHelper.ToDataTable(stream, "Sheet1", 0, GetIsCompatible);
        if(dt != null && dt.Rows.Count > 0)
        {
            // 处理数据
            // ......
        }
    }
    catch(Exception ex)
    {
        return $ "读取文件发生错误,错误原因:{ex.Message}";
    }
}
else
{
    return "请上传文件";
}

3、总结

通过格式化处理,Excel工作表中的各种类型数据都可以提前格式化成我们导入需要的数据形式,当然上面的格式化方法也只是列出了部分类型,还有很多类型欢迎补充,以此本文简单快速的解决了关于NPOI导入的格式化问题。

若本文有帮助到阅读本文的同学,欢迎点赞、关注、收藏,互相学习交流。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
### 回答1: .NET Core是一个跨平台的开源框架,可以用来开发各种类型的应用程序,包括Web应用、桌面应用和移动应用等。而NPOI是一个用于操作Excel、Word和PowerPoint等Microsoft Office文件的.NET库。 使用.NET Core的NPOI导出Excel模板可以实现将数据填充到Excel模板中的相应位置,并将其保存为最终的Excel文件。 首先,我们需要安装NPOI库。可以通过在.NET Core项目中的NuGet包管理器中搜索并安装NPOI库来实现。 然后,我们可以使用以下代码示例来实现数据填充到Excel模板中: ``` using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.IO; // 读取Excel模板 using (FileStream file = new FileStream("template.xlsx", FileMode.Open, FileAccess.Read)) { XSSFWorkbook workbook = new XSSFWorkbook(file); // 获取模板中的Sheet ISheet sheet = workbook.GetSheetAt(0); // 设置需要填充的数据 string data = "Hello, NPOI!"; // 将数据填充到指定位置(例如第一行第一列) IRow row = sheet.GetRow(0); ICell cell = row.GetCell(0); cell.SetCellValue(data); // 保存最终的Excel文件 using (FileStream outputFile = new FileStream("output.xlsx", FileMode.Create, FileAccess.Write)) { workbook.Write(outputFile); } } ``` 以上代码首先打开Excel模板文件,然后获取模板中的Sheet对象。接着,通过指定行和列获取要填充数据的单元格,并将数据填充到该单元格中。最后,将填充完成的Excel文件保存为最终的文件。 需要注意的是,以上示例代码中的模板文件为template.xlsx,保存的最终文件为output.xlsx,可以根据实际情况进行相应的修改。 以上就是使用.NET Core的NPOI库实现导出Excel模板的简单示例。希望对你有所帮助! ### 回答2: .NET Core是一个跨平台的开发框架,NPOI是一个.NET库,用于处理Microsoft Office文件,包括Excel。 在.NET Core中使用NPOI进行导出Excel模板的过程如下: 1. 首先,需要在.NET Core项目中引入NPOI库。可以通过NuGet包管理器或手动下载该库并引用到项目中。 2. 创建一个Excel模板文件,可以使用Microsoft Excel软件创建一个包含样式和格式的模板。该模板将用作导出数据的目标。 3. 在.NET Core项目中,使用NPOI库的API来加载Excel模板文件。可以使用`FileStream`类来打开Excel文件,然后使用`HSSFWorkbook`类来读取Excel工作簿。 4. 通过`HSSFWorkbook`类中的方法,获取Excel文件的工作表和单元格,可以基于需要进行修改或插入数据。 5. 将数据填充到模板中的相应位置。可以使用遍历的方式将数据按照模板中的格式填充到对应的单元格中。 6. 根据需求对数据进行处理,例如添加图表、应用公式、设置单元格样式等。 7. 保存修改后的Excel文件。使用`FileStream`类将修改后的工作簿保存到磁盘上的目标文件中。 总结,使用.NET Core中的NPOI导出Excel模板的过程包括:引入NPOI库、加载Excel模板文件、填充数据到模板中的单元格、处理数据、保存导出文件。这样可以方便地通过.NET Core应用程序生成包含特定格式和样式的Excel文件。 ### 回答3: 使用.NET Core的NPOI库可以很方便地将数据导出Excel模板。首先,我们需要安装NPOI库并在项目中引入相关命名空间。在导出数据之前,我们需要创建一个Excel模板,其中包含了我们要导出的数据的列名等信息。 首先,我们可以使用NPOI提供的Workbook类读取Excel模板文件,例如: ```csharp using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; // 读取Excel模板文件 var templatePath = "template.xlsx"; var templateFileStream = new FileStream(templatePath, FileMode.Open, FileAccess.Read); var workbook = new XSSFWorkbook(templateFileStream); ``` 接下来,我们可以获取Excel模板中的工作表并创建一个Sheet对象,例如: ```csharp var sheet = workbook.GetSheetAt(0); ``` 然后,我们可以通过Sheet对象的CreateRow方法和CreateCell方法,来创建行和单元格,添加数据到Excel模板中,例如: ```csharp var rowIndex = 1; // 第二行开始写数据 // 假设要导出的数据是一个名为"students"的列表 foreach (var student in students) { var row = sheet.CreateRow(rowIndex); var cellIndex = 0; row.CreateCell(cellIndex++).SetCellValue(student.Name); row.CreateCell(cellIndex++).SetCellValue(student.Age); // 添加其他需要导出的列的数据 // ... rowIndex++; } ``` 最后,我们可以使用FileStream将导出Excel文件保存到磁盘上,例如: ```csharp var outputPath = "output.xlsx"; using (var outputFileStream = new FileStream(outputPath, FileMode.Create, FileAccess.Write)) { workbook.Write(outputFileStream); } ``` 以上就是使用.NET Core的NPOI导出数据至Excel模板的基本步骤。通过这种方式,我们可以将数据灵活地导出Excel,并可以根据需要进行格式设置、样式设置等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoodTimeGGB

鼓励一下!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值