C#用npoi导入导出Excel表格数据总结

一、npoi简介

NPOI,顾名思义,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。

二、npoi的引用(NuGet程序包)

在解决方案下—》》引用上右键 —》》管理NuGet程序包

选择浏览 —》》输入npoi—》》选着最新版点击一下 —》》右边安装即可
在这里插入图片描述

三、npoi基础

一、属性和方法

Excel分为两种格式.xsl和.xslx,分别是97-2003版的excel和2007版及以后的。由于保存格式的不同,所以引用的不同动态链接库。
NPOI.HSSF.UserModel库是用于.xsl(97-2003版的Excel)
NPOI.XSSF.UserModel库是用于.xsl(2007版的Excel)

项目注释
IWorkbook workbook = new XSSFWorkbook();//新建工作簿(Excel文件) 2007版.xslx、
IWorkbook workbook = new HSSFWorkbook();//新建工作簿(Excel文件).xsl 2003版
//创建一个表Sheet  =在工作簿上创建第一个表 表名为test
            ISheet sheet = workbook.CreateSheet("test");
            //在表中创建第一行  |
            IRow row = sheet.CreateRow(0);
            for (int i = 0; i < 7; i++)
            {
                //Cell表示列
                //在第一行中创建单元格 也就是第一行第i列 
                ICell cell = row.CreateCell(i);
                //在excel里,在某个位置有没有单元格,和单元格里有没有值,这两个是分开保存的。
                //单元格是一个无形的容器,必须首先有容器,才能往里头存放值。
                //必须先创建单元格在添加数据
                //给单元赋值       
                cell.SetCellValue(i);
            }
            // 获取第一行(第一行一般为标题行)
            IRow headerRow = sheet.GetRow(0);
            //获取第一行的有值的总列数
            int cellCount= headerRow.LastCellNum;
            //总共行数 (整个表格有多少行)
            int rowCount = sheet.LastRowNum;
            //设置保存路径
            string ExcelPath = "F:\\excel.xlsx";
            //导出方法一
            //导出 (打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建时不要打开该文件)  
            //using (FileStream fs = File.OpenWrite(ExcelPath))
            //{
            //    workbook.Write(fs);//向打开的这个xls文件中写入并保存。  
            //}
            //导出方法二
            //转为字节数组 
            //创建内存流
            MemoryStream stream = new MemoryStream();
            //把工作簿写入内存流
            workbook.Write(stream);
            var buf = stream.ToArray();
            //保存为Excel文件  
            using (FileStream fs = new FileStream(ExcelPath, FileMode.Create, FileAccess.Write))
            {
                fs.Write(buf, 0, buf.Length);
                fs.Flush();
            }
三、判断单元格里的值
属性注释和取值方法
HSSFCell.CELL_TYPE_STRING:// 字符串 value = cell.getStringCellValue();
HSSFCell.CELL_TYPE_BOOLEAN:// Booleanvalue = cell.getBooleanCellValue() + “”;
HSSFCell.CELL_TYPE_FORMULA:// 公式value = cell.getCellFormula() + “”;
HSSFCell.CELL_TYPE_BLANK:// 空值value = ""或者string.Empty;
HSSFCell.CELL_TYPE_ERROR:// 故障 value = “非法字符”; value = “未知类型”;
HSSFCell.CELL_TYPE_NUMERIC:// 数字
HSSFCell.CELL_TYPE_NUMERIC: // 数字
          //如果为时间格式的内容
 if (HSSFDateUtil.isCellDateFormatted(cell)) {      
 //注:format格式 yyyy-MM-dd hh:mm:ss 中小时为12小时制,若要24小时制,则把小h变为H即可,yyyy-MM-dd HH:mm:ss
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
 //获取值
  value=sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();                                 
} 
else { value = new DecimalFormat("0").format(cell.getNumericCellValue()); }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="cell">单元格</param>
        /// <returns></returns>
 private static string GetCellValue(ICell cell)
        {
            if (cell == null)
            {
                return string.Empty;//设置空值即"";
            }
            switch (cell.CellType)
            {
                case CellType.Blank:
                    return string.Empty;
                case CellType.Boolean:
                    return cell.BooleanCellValue.ToString();
                case CellType.Error:
                    return cell.ErrorCellValue.ToString();
                case CellType.Numeric:
                case CellType.Unknown:
                default:
                    return cell.ToString();
                case CellType.String:
                    return cell.StringCellValue;
                case CellType.Formula:
                    try
                    {
                        HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
                        e.EvaluateInCell(cell);
                        return cell.ToString();
                    }
                    catch
                    {
                        return cell.NumericCellValue.ToString();
                    }
            }
        }
三、设置样式

//创建单元格样式
ICellStyle cellStyle = workbook.CreateCellStyle();
//设置单元格上下左右边框线
cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.DashDot;
cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.DashDot;
cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.DashDot;
cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.DashDot;
//文字水平和垂直对齐方式
cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Right;
//垂直对齐方式
cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
//是否换行
//cellStyle.WrapText = true;
//缩小字体填充
cellStyle.ShrinkToFit = true;
//创建第二行第1列单元格
ICell Cell = sheet.CreateRow(1).CreateCell(0);
//给单元格赋予样式
Cell.CellStyle = cellStyle;
//给单元格设置值
Cell.SetCellValue(“样式效果”);
//没有值是看不出来样式效果滴

四、导入Excel
using System;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Data;
using System.IO;

namespace ExcelForm.Services
{
    /// <summary>
    /// Excel类
    /// </summary>
    static public class ImportExcel
    {

        /// <summary>
        /// 传入Excel返回成DataTable类型
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <returns></returns>
        public static DataTable GetExcelDataTable(string filePath)//DataTable
        {

            IWorkbook Workbook;
            DataTable table = new DataTable();
            try
            {
                using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    //XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
                    string fileExt = Path.GetExtension(filePath).ToLower();
                    if (fileExt == ".xls")
                    {
                        Workbook = new HSSFWorkbook(fileStream);
                    }
                    else if (fileExt == ".xlsx")
                    {
                        Workbook = new XSSFWorkbook(fileStream);
                    }
                    else
                    {
                        Workbook = null;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            //定位在第一个sheet
            ISheet sheet = Workbook.GetSheetAt(0);
            //第一行为标题行
            IRow headerRow = sheet.GetRow(0);
            int cellCount = headerRow.LastCellNum;//首行列数
            int rowCount = sheet.LastRowNum;//总共列数
            //分几次执行
            //int TimesCount = (rowCount / 500)+1;
            //int Xtimes = 1;


            //循环添加标题列
            for (int i = headerRow.FirstCellNum; i < cellCount; i++)
            {
                DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                table.Columns.Add(column);
            }
                //数据
                for (int i = (sheet.FirstRowNum+1 ); i <= rowCount; i++)/
                {
                    IRow row = sheet.GetRow(i);
                    DataRow dataRow = table.NewRow();
                    if (row != null)
                    {
                        for (int j = row.FirstCellNum; j < cellCount; j++)
                        {
                            if (row.GetCell(j) != null)
                            {
                                dataRow[j] = GetCellValue(row.GetCell(j));
                            }
                        }
                    }
                    table.Rows.Add(dataRow);
                }
           return table;
        }

        private static string GetCellValue(ICell cell)
        {
            if (cell == null)
            {
                return string.Empty;
            }

            switch (cell.CellType)
            {
                case CellType.Blank:
                    return string.Empty;
                case CellType.Boolean:
                    return cell.BooleanCellValue.ToString();
                case CellType.Error:
                    return cell.ErrorCellValue.ToString();
                case CellType.Numeric:
                case CellType.Unknown:
                default:
                    return cell.ToString();
                case CellType.String:
                    return cell.StringCellValue;
                case CellType.Formula:
                    try
                    {
                        HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);

                        e.EvaluateInCell(cell);
                        return cell.ToString();
                    }
                    catch
                    {
                        return cell.NumericCellValue.ToString();
                    }
            }
        }
    }
}

五、导出Excel
        /// <summary>
        /// Datable导出成Excel
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="file">导出路径(包括文件名与扩展名)</param>
        public static void TableToExcel(DataTable dt, string file)
        {
            IWorkbook workbook;
            string fileExt = Path.GetExtension(file).ToLower();
            if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(); } else { workbook = null; }
            if (workbook == null) { return; }
            ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName);

            //表头  
            IRow row = sheet.CreateRow(0);
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                ICell cell = row.CreateCell(i);
                cell.SetCellValue(dt.Columns[i].ColumnName);
            }
            //数据  
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                IRow row1 = sheet.CreateRow(i + 1);
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    ICell cell = row1.CreateCell(j);
                    cell.SetCellValue(dt.Rows[i][j].ToString());
                }
            }

            //转为字节数组  
           MemoryStream stream = new MemoryStream();
            workbook.Write(stream);


            var buf = stream.ToArray();


            //保存为Excel文件  
            using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
            {
                fs.Write(buf, 0, buf.Length);
                fs.Flush();
            }
        }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值