C# 使用NOPI生成Excel文件的方式

using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
        
        
/// <summary>
/// 根据对象列表生成Excel文档,默认字段名作为表头
/// </summary>
/// <param name="list">列表数据</param>
/// <param name="dataType">生成的Excel文件类型</param>
/// <param name="errorMsg">错误信息</param>
/// <param name="resultType">返回结果类型: 1.文件地址 2.Base64字符串 </param>
/// <returns></returns>
public static string StringListToExcel(List<List<string>> list, string dataType, out string errorMsg, string fileName = "", int resultType = 1, string fileType = "xls")
{
    string result = string.Empty;

    try
    {
        if (string.IsNullOrWhiteSpace(dataType))
        {
            dataType = "QuestionNaireDetail";
        }

        if (!(list?.Count > 0))
        {
            errorMsg = "列表信息不能为空";
            return null;
        }

        errorMsg = "";

        string fileTypeStr = fileType?.ToLower() == "xlsx" ? "xlsx" : "xls";
        IWorkbook workbook = fileType?.ToLower() == "xlsx" ? new XSSFWorkbook() : new HSSFWorkbook();

        var sheet = workbook.CreateSheet();

        //填充内容
        for (var i = 0; i < list.Count; i++)
        {
            var subList = list[i];
            var dataRow = sheet.CreateRow(i);
            for (var j = 0; j < subList.Count; j++)
            {
                dataRow.CreateCell(j).SetCellValue(subList[j]);
            }
        }

        for (var i = 0; i < list[0].Count; i++)
        {
            sheet.AutoSizeColumn(i);//列宽自适应,只对英文和数字有效
        }

        //保存
        using (MemoryStream ms = new MemoryStream())
        {
            if (resultType == 1)
            {
                string savePath = "d:/website/files/"     //本地文件保存路径
                if (string.IsNullOrWhiteSpace(fileName)) fileName = Guid.NewGuid().GuidToString()+"." + fileTypeStr;  //获取文件名称

                string newPath = savePath + fileName;
                
                using (FileStream fs = new FileStream(newPath, FileMode.Create, FileAccess.Write))
                {
                    workbook.Write(fs);
                }
                
                result = newPath;
            }
            else  //返回Base64字符串
            {
                workbook.Write(ms);
                byte[] buffer = ms.ToArray();
                ms.Close();
                result = Convert.ToBase64String(buffer);
            }
        }

        workbook.Close();
    }
    catch (Exception ex)
    {
        errorMsg = ex.Message;
        return null;
    }

    return result;
}

 

posted @ 2022-09-05 14:29  Nine_Jason  阅读(580)  评论(0编辑  收藏  举报