需求:现有个需求,需要导出需求方要求的格式的Excel报表。(包含固定的一个表头和多个表体)
方案:将需求方要求的Excel作为模板存放在项目的某个位置,将需要的数据读出之后作为一个对象,通过数据字典的形式传递过去。Excel模板通过 表头{name}, 表体For{body}形式接收数据。然后设置导出文件的存放位置。
注意:(1)NPOI版本是2.4,(2).webconfig appsetting里有配置 ,(3)模板Excel中单元格读出数据要匹配,表头和表体要注意。(4)Excel单元格要占位,可以先复制,然后再删除 或者直接打上边框。否则有多条数据的话,单元格没有占位过,就会报错。会提示未将对象引用到实例(5)文件保存位置要注意
1、前端页面代码,点击按钮,下载BOM固定格式的Excel
<button id="btn_ExcelDaochu_bomshuju" type="button" class="btn btn-app btn-success btn-xs">
<div class="center spinner-preview" id="spinner-preview-ExcelDaochu-bomshuju"></div>
<i class="ace-icon fa fa-download bigger-140"></i>
<span>BOM</span>
</button>
//导出BOM报表
$("#btn_ExcelDaochu_bomshuju").click(function () {
var Guanlianhao = $("#Shenpiliuchengxinxi_Guanlianhao").val();
$.post("@Url.Action("DaoChuBomExcel")", { Guanlianhao: Guanlianhao }, function (data) {
if (data.isSucced) {
downLoad("/Bomgyshenpi/Download/" + data.wenjianjia + "/" + data.fileName, data.fileName);
}
else {
alert(data.errorMessage);
}
})
});
2、后端方法
[HttpPost]
public JsonResult DaoChuBomExcel(BomSearchDto searchDto)
{
//表体数据
List<tbbg_bom> bomlist = _bomXinXiYeWu.GetFenYeList(searchDto).List;
if (bomlist == null || bomlist.Count <= 0)
return Json(new { isSucced = false, errorMessage = "没有数据!" });
//表头数据
var bomguanlianhao = bomlist.Select(x => x.Guanlianhao).FirstOrDefault();
var shenpiliuchengList = _shenPiLiuChengYeWu.GetList(new ShenPiLiuChengSearchDto() { Guanlianhao = bomguanlianhao });
//创建表头对象字典
var header = shenpiliuchengList.List.First();//数据为null时报错
//把表体里需要导出的数据字段映射到body里
var body = bomlist.Select(x => new
{
Id=x.Id,
Name=x.Wuliaomingcheng,
Guige = x.Guige,
Danwei = x.Danwei,
Wuliaodanhao = x.Wuliaodanhao,
Picitouliao= header.Chanchuliang*x.Wuliaodanhao,
Beizhu = x.BOMbeizhu
});
Dictionary<string, object> dic = new Dictionary<string, object>
{
{"Biaodan",header.Biaodanmingcheng},
{"Faqiren",header.Faqirenxingming},
{"Bumen",header.Bumensub},
{"Zhuangtai",header.ZhuangTaiMing},
{"Name",header.Chanpinmingcheng },
{"Chanchuliang",header.Chanchuliang },
{"Gongyiluxianname",header.Gongyiluxianname },
{"Riqi",header.Riqi },
{"Banbenhao",header.Banbenhao },
{"body",body }//表体
};
return ExportBomExcel(dic);
}
public JsonResult ExportBomExcel(IDictionary<string,object> dic)
{
ExcelManager manager = new ExcelManager();
var savePath = @"E:\bom.xls";//新生成文件保存路径(之前的会被覆盖)
try
{
manager.TmplFileName = Server.MapPath("BOM.xls"); //模板文件
manager.CreateNewWorkbook(dic);//复制模板文件并将dic传入
manager.Save(savePath);//保存路径
}
catch (Exception ex)
{
return Json(new { isSucced = false, errorMessage = ex.Message });
}
return Json(new { isSucced = true});
}
3、webconfig <appSettings> </appSettings> 配置
<add key="NormalPlaceHolderRegex" value="" />
<add key="ListPlaceHolderRegex" value="" />
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="oasystem" value="https://office.enzymaster.com:8443/oa201809/" />
<add key="webhost" value="http://localhost:64836/" />
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="NormalPlaceHolderRegex" value="" />
<add key="ListPlaceHolderRegex" value="" />
</appSettings>
4、模板存放位置,目前老版本Excel即.xls可以,但是.xlsx文件作为模板 导出的时候会有问题。
5、模板文件获取数据
注意:body里有多条数据的话,Excel模板里要占位,否则会报错。会提示未将对象引用到实例。最直接的办法是给Excel模板打上边框来占位。