Magicodes.IE
Magicodes.IE copied to clipboard
导出excel的复杂表头
可否支持这种复杂表格的导出? 主要难在表头的导出. 1.首先表头是动态的,动态的列.表头可分为两个部分.前面部分包括序号,部,课别,line都是固定的,从后面日期开始,都是动态的.根据我页面上方的日期选择组件进行数据的查询,得到日期范围内的数据进行动态渲染. 2.表头部分,跨了两行,涉及到合并单元格等操作. 得同事推荐,github上看到这个开源的包,不得不说真的是牛逼.但研究一下,感觉不知咋实现我这种情况的表格导出,有点迷茫
可以最后在处理表头。
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();
}
好的,我试试
@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(); }
如何处理这个表头的合并?
我这边也有类似的需求,参考了所有的单元测试的样例代码,虽然实现了想要的效果但总体来说还是比较麻烦的。
大概思路是分两个步骤:
1.修改固定格式模版文件 2.通过动态导出方式生成文件
初始模版大概长这样:
大概的代码如下,通过遍历的方式获取目标单元格,定位到后再进行处理,主要是添加行列和同步单元样式。
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();
修改后的模版长这样:
然后在通过List<Dictionary<string,object>>
进行导入,具体动态导出的代码参考项目单元测试。