【.net core 通过NPOI库将Excel文件内容分类输出到不同的Excel中】

前言

由于在文章【.net core 通过miniexcel库将Excel文件内容分类输出到不同的Excel中】中实现的Excel内容分类不能够保留原来的文件头格式,所以使用NPOI进行优化。NPOI操作Excel的功能比较齐全,能够设置各种样式。

1 NPOI

官方仓库:GitHub - nissl-lab/npoi: a .NET library that can read/write Office formats without Microsoft Office installed. No COM+, no interop.a .NET library that can read/write Office formats without Microsoft Office installed. No COM+, no interop. - GitHub - nissl-lab/npoi: a .NET library that can read/write Office formats without Microsoft Office installed. No COM+, no interop.https://github.com/nissl-lab/npoi

本文章不做使用说明,有需要的可以自行搜索或者去官方仓库查看。

2 做什么?

有如下excel:

需要将表格B列,D列,按照类别输出到不同的excel中,如:将性别为男的所有数据输出到一个excel中。

3 如何做?

 1 通过nuget添加依赖

2 上代码

public static void Func()
        {
            string path = "G:\\桌面\\测试excel.xlsx";
            int startcell = 3;
            List<int> xfcols = new List<int>() { 1, 3 };

            XSSFWorkbook xssworkbook = new XSSFWorkbook(path);
            ISheet sheet = xssworkbook.GetSheetAt(0);

            Dictionary<string, XSSFWorkbook> xfworkbooks = new Dictionary<string, XSSFWorkbook>();
            foreach(var xfcol in xfcols)
            {
                for(int i = startcell-1; i <= sheet.LastRowNum; i++)
                {
                    if (sheet.GetRow(i) != null && sheet.GetRow(i).Cells[xfcol] != null && sheet.GetRow(i).Cells[0] != null)
                    {
                        if(!xfworkbooks.ContainsKey(xfcol.ToString() + sheet.GetRow(i).Cells[xfcol].StringCellValue))
                        {
                            xfworkbooks.Add(xfcol.ToString() + sheet.GetRow(i).Cells[xfcol].StringCellValue, Getxfworkbook(xfcol, startcell, sheet.GetRow(i).Cells[xfcol].StringCellValue, sheet));
                        }
                    }
                }
            }
            foreach(var xfworkbook in xfworkbooks)
            {
                using (FileStream file = new FileStream($"G:\\桌面\\SaveXlsx\\{ xfworkbook.Key }.xlsx", FileMode.Create))
                {
                    xfworkbook.Value.Write(file);
                    file.Close();
                }
            }
        }

        private static XSSFWorkbook Getxfworkbook(int xfcol, int startcell, string cellvalue, ISheet sheet)
        {
            XSSFWorkbook _ = new XSSFWorkbook();
            sheet.CopyTo(_, "sheet1", true, true);
            ISheet newSheet = _.GetSheetAt(0);
            int moveStep = 0;
            for (int i = startcell - 1; i <= newSheet.LastRowNum; i++)
            {
                if (newSheet.GetRow(i) != null && newSheet.GetRow(i).Cells[xfcol] != null && newSheet.GetRow(i).Cells[0] != null)
                {
                    if (newSheet.GetRow(i).Cells[xfcol].StringCellValue != cellvalue)
                    {
                        newSheet.RemoveRow(newSheet.GetRow(i));
                        moveStep--;
                    }
                    else
                    {
                        if(moveStep != 0)
                        {
                            newSheet.ShiftRows(i, i, moveStep);
                        }
                    }
                }
            }
            return _;
        }

 3 部分结果展示

4 思路:

a.读取文件,并获取sheet

XSSFWorkbook xssworkbook = new XSSFWorkbook(path);
 ISheet sheet = xssworkbook.GetSheetAt(0);

b.定义获取的分类数据存放的字典,并循环sheet进行分类。

Dictionary<string, XSSFWorkbook> xfworkbooks = new Dictionary<string, XSSFWorkbook>();

for(int i = startcell-1; i <= sheet.LastRowNum; i++)

c.将需要拆分sheet的方法单独定义:Getxfworkbook,根据实际的参数需要,传入对应的参数即可。此方法的主要思路为定义需要保留的行向上移动的行数,不需要保留的删除,需要保留的向上移动即可。主要用到的方法:

newSheet.RemoveRow(newSheet.GetRow(i));

newSheet.ShiftRows(i, i, moveStep);

d.读取已分类的数据xfworkbooks,分别写入不同的文件。

4 备注

代码仅进行简单的功能实现,有细节部分没有完善,可根据自己的实际情况修改即可。

5 补充

将产生的多个文件添加到一个压缩文件中。

		public static void ZipCompress()
		{
            //文件存放路径
            string filesPath = @"C:\\Desktop\\xfworkbooks";

            //解决中文乱码问题
            ArchiveEncoding ArchiveEncoding = new ArchiveEncoding();
            ArchiveEncoding.Default = Encoding.GetEncoding("utf-8");
            WriterOptions options = new WriterOptions(CompressionType.Deflate);
            options.ArchiveEncoding = ArchiveEncoding;

            //存放的路径不能够与读取需要压缩的文件在同一目录下
            using (var zip = File.OpenWrite("C:\\Desktop\\test.zip"))
            using (var zipWriter = WriterFactory.Open(zip, ArchiveType.Zip, options))
            {
                zipWriter.WriteAll(filesPath, "*", SearchOption.AllDirectories);
            }
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值