zoukankan      html  css  js  c++  java
  • 【开发者笔记】解析具有合并单元格的Excel

      最近公司让做各种数据表格的导入导出,就涉及到电子表格的解析,做了这么多天总结一下心得。

      工具:NOPI

      语言:C#

      目的:因为涉及到导入到数据库,具有合并单元格的多行必然要拆分,而NPOI自动解析的时候拆分单元格除第一个单元格外其余值都是空,对于列头有合并项目的,数据库设计一般才有合并单元格下面的最小列单元作为数据库字段。于是希望达到这样一个效果。于是有了一个思路就是把读入的Excel复制到新建的Excel,然后再去读新的Excel。总体思路就是把合并单元格所包含的所有最小单元格的值都设置成合并单元格的值。达到如图这样一个效果:

      左边是需要解析的单元格,右边是复制之后的单元格,可以看出右边的单元格解析是很简单的。如果需求合适,那么目的就达到了……好了,下面贴代码。

     1  /// <summary>
     2         /// 复制电子表格,达到拆分单元格的目的
     3         /// </summary>
     4         /// <returns></returns>
     5         public IWorkbook AnalyseExcel(IWorkbook book)
     6         {
     7             /*用于存复制之后的电子表格*/
     8             IWorkbook result = null;
     9             /*判断传入的格式,返回同类的格式*/
    10             if (book == null)
    11             {
    12                 return null;
    13             }
    14             else if (book is HSSFWorkbook)
    15             {
    16                 result = new HSSFWorkbook();//.xls
    17             }
    18             else if (book is XSSFWorkbook)
    19             {
    20                 result = new XSSFWorkbook();//.xlsx
    21             }
    22             else//其他文件类型,不支持
    23             {
    24                 return null;
    25             }
    26             for (int index = 0; index < book.NumberOfSheets;index++ )//遍历所有sheet
    27             {
    28                 ISheet sheet = book.GetSheetAt(index);
    29                 ISheet sheet1 = result.CreateSheet(sheet.SheetName);
    30                 int rows = sheet.PhysicalNumberOfRows;
    31                 /*先复制所有数据*/
    32                 for (int j = 0; j < rows; j++)
    33                 {
    34                     IRow row = sheet.GetRow(j);
    35                     IRow row1 = sheet1.CreateRow(j);
    36                     List<ICell> cells = row.Cells;
    37                     for (int k = 0; k < cells.Count; k++)
    38                     {
    39                         row1.CreateCell(k).SetCellValue(cells[k].ToString());
    40                     }
    41                 }
    42 
    43                 /*拆分已合并单元格,并给余下单元格赋值*/
    44                 for (int j = 0; j < sheet.NumMergedRegions; j++)
    45                 {
    46                     var cellRange = sheet.GetMergedRegion(j);//获取第i个合并单元格
    47                     int rowStart = cellRange.FirstRow;//获取该合并单元格起始行
    48                     int colStart = cellRange.FirstColumn;//获取该合并单元格起始列
    49                     int rowEnd = cellRange.LastRow;//获取该合并单元格终止行
    50                     int colEnd = cellRange.LastColumn;//获取该合并单元格终止列
    51                     string data = sheet.GetRow(rowStart).GetCell(colStart).ToString();//获取该合并单元格值
    52                     for (int m = rowStart; m <= rowEnd; m++)//遍历该合并单元格所包含的所有单元格
    53                     {
    54                         IRow row = null;
    55                         for (int n = colStart; n <= colEnd; n++)
    56                         {
    57                             try
    58                             {
    59                                 sheet1.GetRow(m).GetCell(n).SetCellValue(data);//中间部分可能存在空行,如果是空行则捕获异常,创建该行即可
    60                             }
    61                             catch (Exception e)
    62                             {
    63                                 if (row == null)
    64                                 {
    65                                     row = sheet1.CreateRow(m);
    66                                 }
    67                                 sheet1.GetRow(m).GetCell(n).SetCellValue(data);//创建行并设单元格的值
    68                             }
    69 
    70                         }
    71                     }
    72                 }
    73             }
    74             return result;
    75         }
    复制单元格

    下面是效果图:

        

  • 相关阅读:
    坚决不再犯的脑残错误
    2018.8.21提高A&省选组模拟考试
    2018.10.9模拟考试
    fread()快读
    2018.10.6模拟考试
    2018.10.4模拟考试
    2018.8.20提高AB组模拟考试
    2018.8.21提高AB组模拟考试
    2018.8.19提高B组模拟考试
    2018.8.18提高B组模拟试题
  • 原文地址:https://www.cnblogs.com/wyongbo/p/AnalyseExcel.html
Copyright © 2011-2022 走看看