Magicodes.IE icon indicating copy to clipboard operation
Magicodes.IE copied to clipboard

导出excel的复杂表头

Open BeckShe opened this issue 1 year ago • 5 comments

可否支持这种复杂表格的导出? image 主要难在表头的导出. 1.首先表头是动态的,动态的列.表头可分为两个部分.前面部分包括序号,部,课别,line都是固定的,从后面日期开始,都是动态的.根据我页面上方的日期选择组件进行数据的查询,得到日期范围内的数据进行动态渲染. 2.表头部分,跨了两行,涉及到合并单元格等操作. 得同事推荐,github上看到这个开源的包,不得不说真的是牛逼.但研究一下,感觉不知咋实现我这种情况的表格导出,有点迷茫

BeckShe avatar Jan 30 '23 08:01 BeckShe

可以最后在处理表头。

 var list2 = GenFu.GenFu.ListOf<ExportTestDataWithAttrs>(30);
            using (var pck = new ExcelPackage(new FileInfo(filePath)))
            {
                    var data = await exporter.ExportAsByteArray<ExportTestDataWithAttrs>(list2);
                    Stream stream = new MemoryStream(data);
                    using (var pck1 = new ExcelPackage(stream))
                    {
                        pck.Workbook.Worksheets.Add("sheetName",pck1.Workbook.Worksheets.First());
                    }
                    pck.Save();
          }

hueifeng avatar Jan 30 '23 09:01 hueifeng

好的,我试试

BeckShe avatar Jan 30 '23 11:01 BeckShe

@BeckShe ,怎么样,这种复杂表格可以导出吗

zhanghuang515 avatar Feb 28 '23 06:02 zhanghuang515

可以最后在处理表头。

 var list2 = GenFu.GenFu.ListOf<ExportTestDataWithAttrs>(30);
            using (var pck = new ExcelPackage(new FileInfo(filePath)))
            {
                    var data = await exporter.ExportAsByteArray<ExportTestDataWithAttrs>(list2);
                    Stream stream = new MemoryStream(data);
                    using (var pck1 = new ExcelPackage(stream))
                    {
                        pck.Workbook.Worksheets.Add("sheetName",pck1.Workbook.Worksheets.First());
                    }
                    pck.Save();
          }

如何处理这个表头的合并?

zhangzw218 avatar Jul 20 '23 03:07 zhangzw218

我这边也有类似的需求,参考了所有的单元测试的样例代码,虽然实现了想要的效果但总体来说还是比较麻烦的。

大概思路是分两个步骤:

1.修改固定格式模版文件 2.通过动态导出方式生成文件

初始模版大概长这样:

1690180696696 大概的代码如下,通过遍历的方式获取目标单元格,定位到后再进行处理,主要是添加行列和同步单元样式。

 foreach (var cell in sheet.Cells)
  {
      if (cell.Value != null && cell.Value is string valueString && valueString == "{{XPriceSubject}}")
      {
          var indexCol = cell.Start.Column;
          var indexRol = cell.Start.Row;
          sheet.InsertColumn(indexCol + 1, priceSubjects.Count - 1);
          foreach (var item in priceSubjects)
          {
              var key = BuildSubjectPrice(item);
              priceSubjectKeys.Add(key);
              sheet.SetValue(indexRol, indexCol, item.Name);
              sheet.SetValue(indexRol + 1, indexCol, "{{" + key + "}}");
              var sumPriceSubjectKey = BuildSumSubjectPrice(item);
              sheet.SetValue(indexRol + 2, indexCol++, "{{" + sumPriceSubjectKey + "}}");
          }
          var cellsToCopy = cell.Offset(-1, 1, 1, priceSubjects.Count - 1);
          CopyCellStyle(cell.Offset(-1, 0, 1, 1), cellsToCopy);
          cellsToCopy = cell.Offset(0, 1, 1, priceSubjects.Count - 1);
          CopyCellStyle(cell.Offset(0, 0, 1, 1), cellsToCopy);
          cellsToCopy = cell.Offset(1, 1, 1, priceSubjects.Count - 1);
          CopyCellStyle(cell.Offset(1, 0, 1, 1), cellsToCopy);
          cellsToCopy = cell.Offset(2, 1, 1, priceSubjects.Count - 1);
          CopyCellStyle(cell.Offset(2, 0, 1, 1), cellsToCopy);
          var cellsToMerge = cell.Offset(-1, 0, 1, priceSubjects.Count);
          cellsToMerge.Merge = true;
          break;
      }
  }
  pck.Save();

修改后的模版长这样:

image 然后在通过List<Dictionary<string,object>>进行导入,具体动态导出的代码参考项目单元测试。

dannyshenl avatar Jul 24 '23 06:07 dannyshenl