• 【ArcGIS Pro二次开发】(73):使用NPOI库操作Excel


    NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。

    NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。

    相较于之前使用的Microsoft.Office.Interop.Excel,已经感觉到的优势,一是读写速度较快,虽然小数据量的读写还不是很明显,但数据量上去后还是有差别的。二是Microsoft.Office.Interop.Excel会使用Office软件进行打开Excel的操作,这不仅要求在电脑中安装对应的Office软件,而且如果在程序中断的情况下,后台会保留进程,对后续的读写产生影响(已经不只一次遇到这个问题!)。

    因此果断放弃Microsoft.Office.Interop.Excel,准备用NPOI代替。

    下面是汇总的NPOI简单操作。


    1、获取工作薄IWorkbook
    1. FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);
    2. IWorkbook workbook = new XSSFWorkbook(fs);
    2、获取工作表对象ISheet
    1. // 获取sheet,按序号,从0开始
    2. ISheet sheet = workbook.GetSheetAt(0);
    3. // 按名称获取
    4. ISheet sheet = workbook.GetSheet("sheet1");
    3、获取工作表的行(第一行)
    IRow row = sheet.GetRow(0);
    4、获取指定行的单元格
    ICell cell = row.GetCell(0);
    5、获取并设置单元格样式
    1. // 获取单元格格式
    2. ICellStyle style = cell.CellStyle;
    3. // 设置格式
    4. style.VerticalAlignment=HSSFCellStyle.VERTICAL_TOP // 靠上
    5. style.VerticalAlignment=HSSFCellStyle.VERTICAL_CENTER // 居中
    6. style.VerticalAlignment=HSSFCellStyle.VERTICAL_BOTTOM // 靠下
    7. style.VerticalAlignment=HSSFCellStyle.VERTICAL_JUSTIFY // 两端对齐
    8. // 自动换行
    9. style.WrapText=true;
    10. // 边框设置
    11. style.BorderBottom=HSSFCellStyle.BORDER_THIN;
    12. style.BorderLeft=HSSFCellStyle.BORDER_THIN;
    13. style.BorderRight=HSSFCellStyle.BORDER_THIN;
    14. style.BorderTop= HSSFCellStyle.BORDER_THIN ;
    6、创建工作簿对象
    XSSFWorkbook workBook= new XSSFWorkbook();
    7、创建工作表对象
    XSSFSheet newSheet = (XSSFSheet)workBook.CreateSheet("newSheet");
    8、创建工作表的行
    XSSFRow newRow = (XSSFRow)newSheet.CreateRow(0);
    9、创建单元格
    XSSFCell newCell = (XSSFCell)newRow.CreateCell(0);
    10、单元格写值
    newCell.SetCellValue(1);
    11、设置Sheet名称
    workBook.SetSheetName(0, "newSheet");
    12、获取工作簿中Sheet数量
    int count = workBook.NumberOfSheets;
    13、保存excel文件
    workBook.Write(new FileStream(outFilePath, FileMode.Create, FileAccess.ReadWrite));
    14、强制更新计算公式
    sheet.ForceFormulaRecalculation = true;
    15、完整的写值操作
    1. // 文件路径
    2. string filePath = @"C:\Users\Administrator\Desktop\lab.xlsx";
    3. // 创建文件流
    4. FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    5. // 打开工作簿
    6. XSSFWorkbook wb = new XSSFWorkbook(fs);
    7. // 获取第一个工作表
    8. ISheet sheet = wb.GetSheet("new");
    9. for (int i = 0; i < 100; i++)
    10. {
    11. // 获取第3行(索引从0开始)
    12. IRow row = sheet.GetRow(i);
    13. for (int j = 0; j < 30; j++)
    14. {
    15. // 获取第5列(索引从0开始)
    16. ICell cell = row.GetCell(j);
    17. // 设置单元格的值为"新"
    18. cell?.SetCellValue("fme");
    19. }
    20. }
    21. // 保存工作簿
    22. using FileStream saveFile = new FileStream(filePath, FileMode.Create);
    23. wb.Write(saveFile);
    16、单元格合并
    1. // 下面(2,3,4,5)指代的意思为从第3行第4列开始,至第5行第6列进行合并
    2. // 即为“C4:E6”
    3. sheet.AddMergedRegion(new Region(2, 3, 4, 5));
    17、设置、获取行高列宽
    1. // 获取当前工程中的所有Layouts
    2. IEnumerable layouts = Project.Current.GetItems();
    3. // 按名称获取
    4. LayoutProjectItem layoutItem = Project.Current.GetItems().FirstOrDefault(item => item.Name.Equals("MyLayout"));
    18、获取sheet的行数,列数
    1. // 行数
    2. int rowNum = sheet.LastRowNum;
    3. // 列数
    4. int colNum = sheet.LastRowNum;
    19、移动行
    1. // 将第9行到第40行的内容向上移动2格
    2. sheet.ShiftRows(8, 39, -2);
    20、取消sheet中的所有合并格
    1. // 获取所有合并区域
    2. List mergeRanges = sheet.MergedRegions;
    3. // 检查并清除合并区域
    4. for (int i = mergeRanges.Count - 1; i >= 0; i--)
    5. {
    6. // 合并格的四至
    7. CellRangeAddress region = mergeRanges[i];
    8. int firstRow = region.FirstRow;
    9. int lastRow = region.LastRow;
    10. int firstCol = region.FirstColumn;
    11. int lastCol = region.LastColumn;
    12. // 判定要处理的区域
    13. if (startRow <= firstRow && startCol <= firstCol)
    14. {
    15. for (int row = firstRow; row <= lastRow; row++)
    16. {
    17. for (int col = firstCol; col <= lastCol; col++)
    18. {
    19. if (row != firstRow || col != firstCol)
    20. {
    21. IRow r = sheet.GetRow(row);
    22. ICell c = r.GetCell(col);
    23. // 如果c是空值,则赋一个默认值
    24. c ??= r.CreateCell(col);
    25. // 设置拥有合并区域的单元格的值为合并区域的值
    26. ICell mergedCell = sheet.GetRow(firstRow).GetCell(firstCol);
    27. if (mergedCell != null)
    28. {
    29. c.SetCellValue(mergedCell.StringCellValue); // 可根据需要选择相应的数据类型
    30. }
    31. }
    32. }
    33. }
    34. // 清除合并区域
    35. sheet.RemoveMergedRegion(i);
    36. }
    37. }
  • 相关阅读:
    表白墙案例(前端,Java,Mysql)
    Nodejs的循环机制
    QT案例实战1 - 从零开始编写一个OCR工具软件 (5)引入微软OCR
    【软件测试】测试与开发一对欢喜冤家......
    读写锁三种关系的证明(读者和读者互补影响、写者和写者互斥、读者和写者互斥)
    通过 CC Switch 本地路由让 Codex CLI 接入 DeepSeek 等第三方模型
    66. 加一、Leetcode的Python实现
    L58.linux命令每日一练 -- 第九章 Linux进程管理命令 -- pgrep和kill
    WebLOAD: 一站式性能测试工具
    Day1 初学机器学习:机器学习的概述、特征工程
  • 原文地址:https://blog.csdn.net/xcc34452366/article/details/134164757