C#进阶——NPOI

NPOI:https://blog.csdn.net/mouday/article/details/81049219
读取数据:https://www.cnblogs.com/chunxiong/p/9406178.html
数据表格:https://www.cnblogs.com/Julyra/p/11506118.html

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
namespace Lean.Leo.NPOI2
{
    class Program
    {
        static void Main(string[] args)
        {
            //創建工作本 workbook和表sheet
            HSSFWorkbook wk = new HSSFWorkbook();

            //第一個創建的表的名字叫做例子
            //這個是什麼語法啊?為什麼接口可以直接等於createsheet啊,是因為是接口的另外一種實現形式嗎?
            ISheet sheet = wk.CreateSheet("例子");

            //創建行和單元格
            //創建行
            IRow row = sheet.CreateRow(2);
            //在第一行的第一列創建單元格
            ICell cell = row.CreateCell(0);
            //給相應的單元格賦值
            cell.SetCellValue("測試2");

            //打開一個xls文件,如果沒有則自行創建,如果存在則在創建時不要打開該文件
            //这次保存会把文档的所有数据都清除,然后保存自己的数据
            using (FileStream fs = File.OpenWrite(@"C:\Users\leolam\Desktop\test.xlsx"))
            {
                wk.Write(fs);
            }
            
            //这里也可以采用下面这种方式
            //FileStreamfile =new FileStream(@"test.xls", FileMode.Create);
            //hssfworkbook.Write(file);
            //file.Close();

        }
    }
}

在原有基础上添加数据

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
namespace Lean.Leo.NPOI2
{
    class Program
    {
        static void Main(string[] args)
        {
            string tempPath = @"C:\Users\leolam\Desktop\test.xlsx";
            HSSFWorkbook wk = null;
            //tempPath:表示保存地址,FileMode:表示电脑如何操作文件,fileaccess:表示对文件内容进行什么操作,
            using(FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                //把xls文件读入workbook变量里,之后就可以关闭了
                wk = new HSSFWorkbook(fs);
                fs.Close();
            }
            //获取创建文件的第一个表
            ISheet sheet = wk.GetSheetAt(0);
            //声明第一行
            IRow row = sheet.CreateRow(0);

            ICell cell = row.CreateCell(0);

            cell.SetCellValue("测试二");

            using(FileStream fs = File.OpenWrite(@"C:\Users\leolam\Desktop\test.xlsx"))
            {
                wk.Write(fs);
            }
        }
    }
}

设置单元格样式

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;

namespace Lean.Leo.NPOI2
{
    class Program
    {
        static void Main(string[] args)
        {
            string tempPath = @"C:\Users\leolam\Desktop\test.xlsx";
            HSSFWorkbook wk = null;
            //tempPath:表示保存地址,FileMode:表示电脑如何操作文件,fileaccess:表示对文件内容进行什么操作,
            using(FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                //把xls文件读入workbook变量里,之后就可以关闭了
                wk = new HSSFWorkbook(fs);
                fs.Close();
            }

            //获取创建文件的第一个表
            ISheet sheet = wk.GetSheetAt(0);

            //声明第一行
            IRow row = sheet.CreateRow(0);

            ICell cell = row.CreateCell(0);

            cell.SetCellValue("测试三");

            //设置边框格式
            ICellStyle cellStyle = wk.CreateCellStyle();

            //设置单元格上下左右边框线
            cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;

            cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;

            //设置完结构之后就是直接把样式保存到对应的单元格上
            cell.CellStyle = cellStyle;


            using (FileStream fs = File.OpenWrite(@"C:\Users\leolam\Desktop\test.xlsx"))
            {
                wk.Write(fs);
            }


        }
    }
}

复制表格数据到另一张表

#region 正式导出无bug
    public HSSFWorkbook DataTableToExcelOK(DataTable dt, DataTable dt1, DataTable dt2, string filePath, string tpath, bool isColumnName)
    {
        //创建一个空的行变量
        IRow row = null;

        //创建一个空的表变量
        ISheet sheet = null;

        //创建一个空的单元格
        ICell cell = null;

        //声明起始单元格
        int startRow = 0;

        //声明一个空的excel文件变量
        IWorkbook workbook = null;

        //fileinfo是文件操作类,用来操作文件
        FileInfo ff = new FileInfo(tpath);
        //声明一个空的流变量
        FileStream fs2 = null;
        //如果问价已经存在就删除
        if (ff.Exists)
        {
            ff.Delete();
        }
        
        //打开模板
        FileStream fileRead = new FileStream(filePath, FileMode.Open, FileAccess.Read);
        HSSFWorkbook hssfworkbook = new HSSFWorkbook(fileRead);
        //打开新创建的
        FileStream fileSave2 = new FileStream(tpath, FileMode.Open, FileAccess.Read);//打开新创建的excel
        HSSFWorkbook book2 = new HSSFWorkbook(fileSave2);

        HSSFSheet CPS = hssfworkbook.GetSheetAt(6) as HSSFSheet;//获取模板的sheet
        
        CPS.CopyTo(book2, "报价体系V1.5", true, true);//将模板复制到新建的excel中

        using (FileStream fileSave = new FileStream(tpath, FileMode.Open, FileAccess.Write))
        {
            book2.Write(fileSave);
            fileSave.Close();

            #region 将数据导入excel中
            using (fs2 = File.OpenRead(tpath))
            {
                // 2007版本  
                if (tpath.IndexOf(".xlsx") > 0)
                    workbook = new XSSFWorkbook(fs2);
                // 2003版本  
                else if (tpath.IndexOf(".xls") > 0)
                    workbook = new HSSFWorkbook(fs2);


                if (workbook != null)
                {
                    sheet = workbook.GetSheetAt(0);
                    if (sheet != null)
                    {
                        int rowCount = sheet.LastRowNum;//总行数 
                        if (rowCount > 0)
                        {
                            IRow firstRow = sheet.GetRow(3);//表头行  
                            int cellCount = firstRow.LastCellNum;//表头列数  
                            if (isColumnName)
                            {
                                startRow = 3;//如果第一行是列名,则从第二行开始读取
                                if (dt != null && dt.Rows.Count > 0)
                                {

                                    sheet.GetRow(1).GetCell(1).SetCellValue(dt1.Rows[0][0].ToString());//dt1需要填充的表头数据
                                    sheet.GetRow(1).GetCell(4).SetCellValue(dt1.Rows[0][0].ToString());
                                    sheet.GetRow(1).GetCell(7).SetCellValue(dt1.Rows[0][1].ToString());

                                    int rowtbCount = Convert.ToInt32(dt.Rows.Count + 3);//datatable行数 dt内容数据 
                                    int columnCount = dt.Columns.Count;//列数  

                                    for (int i = startRow; i < rowtbCount; i++)
                                    {
                                        // row = sheet.CreateRow(i+1);
                                        row = sheet.CopyRow(i, i + 1);
                                        for (int j = 0; j < columnCount; j++)
                                        {
                                            cell = row.GetCell(j + 2);//excel第二行开始写入数据  
                                            if (j == 7)
                                            {
                                                cell.SetCellValue(dt.Rows[i - 3][j].ToDouble());//dt.Rows[i - 3][j].ToDouble()
                                            }
                                            else
                                            {
                                                cell.SetCellValue(dt.Rows[i - 3][j].ToString());
                                            }
                                        }

                                    }

                                    sheet.GetRow(rowtbCount + 2).GetCell(9).SetCellValue(dt2.Rows[0][3].ToString());
                                    sheet.GetRow(rowtbCount + 2).GetCell(16).SetCellValue(dt2.Rows[0][0].ToString());
                                    sheet.GetRow(rowtbCount + 2).GetCell(18).SetCellValue(dt2.Rows[0][1].ToString());
                                    sheet.GetRow(rowtbCount + 2).GetCell(22).SetCellValue(dt2.Rows[0][2].ToString());//dt2表尾数据

                                    using (fs2 = File.OpenWrite(tpath))
                                    {
                                        workbook.Write(fs2);//向打开的这个xls文件中写入数据  
                                    }
                                }
                            }
                        }
                    }
                }
            }
            #endregion

            return workbook as HSSFWorkbook;
        }
    }
    #endregion

获取数据行数,不包括夹在数据之间额空白行

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
using System;
namespace Lean.Leo.NPOI2
{
    class Program
    {
        static void Main(string[] args)
        {

            string tempPath = @"C:\Users\leolam\Desktop\test.xls";
            
            //声明excel文件控件
            HSSFWorkbook wk = null;

            //tempPath:表示保存地址,FileMode:表示电脑如何操作文件,fileaccess:表示对文件内容进行什么操作,
            using (FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                //把xls文件读入workbook变量里,之后就可以关闭了
                wk = new HSSFWorkbook(fs);
                fs.Close();
            }

            ISheet sheet = wk.GetSheetAt(0);
            
            //获取有数据的行数,如果某一行没有数据,则整行都不算。
            Console.WriteLine(sheet.LastRowNum);
            //另外一种判断方式,结果都相同
            Console.WriteLine(sheet.PhysicalNumberOfRows);

        }
    }
}

判断所有行数,如果空白行夹在中间,也正常计入

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
using System;
namespace Lean.Leo.NPOI2
{
    class Program
    {
        static void Main(string[] args)
        {

            string tempPath = @"C:\Users\leolam\Desktop\test.xls";
            
            //声明excel文件控件
            HSSFWorkbook wk = null;

            //tempPath:表示保存地址,FileMode:表示电脑如何操作文件,fileaccess:表示对文件内容进行什么操作,
            using (FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                //把xls文件读入workbook变量里,之后就可以关闭了
                wk = new HSSFWorkbook(fs);
                fs.Close();
            }

            ISheet sheet = wk.GetSheetAt(0);

            int count = 0;
            int realCount = sheet.LastRowNum;
            while (sheet.GetRow(count) != null || count < realCount)
            {
                count++;
            }
            Console.WriteLine(count);

        }
    }
}

统计excel表行数和列数,最终输出结果

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
using System;
namespace Lean.Leo.NPOI2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = System.Text.Encoding.Unicode;

            string tempPath = @"C:\Users\leolam\Desktop\test.xls";
            
            //声明excel文件控件
            HSSFWorkbook wk = null;

            //tempPath:表示保存地址,FileMode:表示电脑如何操作文件,fileaccess:表示对文件内容进行什么操作,
            using (FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                //把xls文件读入workbook变量里,之后就可以关闭了
                wk = new HSSFWorkbook(fs);
                fs.Close();
            }

            ISheet sheet = wk.GetSheetAt(0);

            int count = 0;
            int realCount = sheet.LastRowNum;
            //判断有多少行,
            while (sheet.GetRow(count) != null || count < realCount)
            {
                if (sheet.GetRow(count) != null)
                {
                    Console.WriteLine("这行有" + sheet.GetRow(count).LastCellNum + "列");
                }
                else
                {
                    Console.WriteLine("第" + count + "行为空行");
                }
                count++;
            }
            Console.WriteLine("总行数为:"+count);
        }
    }
}

复制excel文件表到另一个excel表中

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
using System;
namespace Lean.Leo.NPOI2e
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = System.Text.Encoding.Unicode;

            string tempPath = @"C:\Users\leolam\Desktop\test.xls";
            
            //声明excel文件控件
            HSSFWorkbook wk = null;

            //tempPath:表示保存地址,FileMode:表示电脑如何操作文件,fileaccess:表示对文件内容进行什么操作,
            using (FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                //把xls文件读入workbook变量里,之后就可以关闭了
                wk = new HSSFWorkbook(fs);
                fs.Close();
            }

            //读取表
            ISheet sheet = wk.GetSheetAt(0);


            //统计行数,不包括夹在中间的空行
            int count = 0;
            //统计行数,包括夹在中间的空行
            int realCount = sheet.LastRowNum;

            //创建目标表
            HSSFWorkbook wk2 = new HSSFWorkbook();

            ISheet targetSheet = wk2.CreateSheet("复制表");

            IRow row = null;

            IRow targetRow = null;

            ICell targetCell = null;

            //通过while循环实现对每一个单元格的遍历和访问
            while (sheet.GetRow(count) != null || count < realCount)
            {
                //通过
                if (sheet.GetRow(count) != null)
                {
                    //注意,每一次重新创建,就会把之前同一行的数据清除
                    targetRow = targetSheet.CreateRow(count);

                    for (int i = 0; i < sheet.GetRow(count).LastCellNum; i++)
                    {
                        //数据源表的行变量
                         row = sheet.GetRow(count);

                        //这里通过设置为var,可以进行null判断
                        var cell = row.GetCell(i);

                        //如果单元格数值为空,则跳过复制过程
                        if(cell == null)
                        {
                            continue;
                        }
                        

                        targetCell = targetRow.CreateCell(i);

                        targetCell.SetCellValue(cell.ToString());

                        Console.WriteLine(targetCell.ToString());
                        
                    }

                    Console.WriteLine("这行有" + sheet.GetRow(count).LastCellNum + "列");

                }
                else
                {
                    Console.WriteLine("第" + count + "行为空行");
                }
                count++;
            }
            using (FileStream fs = File.OpenWrite(@"C:\Users\leolam\Desktop\test2.xls"))
            {
                wk2.Write(fs);
            }
                Console.WriteLine("总行数为:" + count);
        }
    }
}
posted @ 2020-07-07 11:17  LY-CS  阅读(1206)  评论(0编辑  收藏  举报