下载固定格式的Excel

需求:现有个需求,需要导出需求方要求的格式的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模板打上边框来占位。

 

要实现固定模板格式Excel导出,你可以使用以下步骤: 1. 定义Excel模板,包含表头和数据区域。 2. 使用JavaScript或Vue组件创建一个表格,包含要导出的数据。 3. 使用JavaScript库如SheetJS或ExcelJS将表格数据转换为Excel文件。 4. 将转换后的Excel文件与模板文件合并,保留表头和数据格式。 5. 提供下载链接或使用浏览器的文件保存对话框下载Excel文件。 下面是一个示例Vue组件,可以实现固定模板格式Excel导出: ``` <template> <div> <button @click="exportExcel">导出Excel</button> </div> </template> <script> import XLSX from 'xlsx'; export default { data() { return { columns: [ { header: '姓名', key: 'name' }, { header: '年龄', key: 'age' }, { header: '性别', key: 'gender' }, ], data: [ { name: '张三', age: 25, gender: '男' }, { name: '李四', age: 30, gender: '女' }, { name: '王五', age: 28, gender: '男' }, ], templateFile: 'template.xlsx', }; }, methods: { exportExcel() { const workbook = XLSX.readFile(this.templateFile); const worksheet = workbook.Sheets['Sheet1']; const data = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: '' }); const headerRow = data[0]; const dataRows = this.data.map(item => this.columns.map(col => item[col.key])); XLSX.utils.sheet_add_aoa(worksheet, dataRows, { origin: 1 }); const blob = new Blob([XLSX.write(workbook, { type: 'binary' })], { type: 'application/vnd.ms-excel' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'data.xlsx'; a.click(); }, }, }; </script> ``` 这个组件使用了SheetJS库来处理Excel文件,template.xlsx是预先定义好的Excel模板文件,columns和data是要导出的表头和数据。在exportExcel方法中,首先读取模板文件,然后将数据添加到工作表中,最后生成Excel文件并提供下载链接。注意,这里使用了Blob对象和URL.createObjectURL方法来创建下载链接,可以避免将整个文件内容加载到内存中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值