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