c# 前端无插件打印导出实现方式
打印
- 打印导出分布页
@model List<界面的数据模型类>
@using WingSoft;
@using Newtonsoft.Json;
<style type="text/css">.modal-content {width: 800px;}.modal-body {height: 400px;}
</style>
<script type="text/javascript">$(function () {if (@ViewBag.pe== 0) {//打印let content = ''for (var i = 0; i < $(".boxDiv").length; i++) {content += $(".boxDiv").eq(i).html() + '<div style="page-break-after: always;"></div>'}printFunc(content);} else {//导出(将所有数据导出到一个excel,多个工作表的形式)let contentArray = [];for (var i = 0; i < $(".boxDiv").length; i++) {contentArray.push({html: $(".boxDiv").eq(i).html(),name: "xx记录表" + (i + 1)});}exportToExcelBatch('xx记录表',contentArray)}});</script><div class="modal fade" id="modal" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-hidden="true"><img src="~/Images/icon_closed.png" /></button></div><div class="modal-body">@for (var i = 0; i < Model.Count; i++){<div class="boxDiv"><style>.boxDiv table {width: 100%;display: flex;flex-direction: column;align-items: center;}.printTable {width: 100%;font-family: "宋体";border: 0px;color: #333;font-size: 12px;}.printTable th {font-weight: 600;font-size: 14px;}.printTable td, .printTable th {text-align: center;padding: 3px 3px;}.content td {border: 1px solid #4a4a4a;}.tabletitle1 {font-size: 20px;font-weight: bold;}.tabletitle2 {font-size: 18px;font-weight: bold;position: relative;}.contenleft {text-align: left !important;}.contenright {text-align: right !important;}.boxcontent {height: 30px;font-size: 14px;}.footertext {font-size: 14px;}.printTable td, .printTable th {border: 1px solid #E5E5E5;padding:3px;font-size:14px;}.printTable thead th{text-align:center;}</style><div class="modal-title" style="font-size:18px;text-align:center;">@Model[i].SchoolName 经营成本</div><div style="margin:10px 0"><span>食堂名称:@Model[i].CanteenName</span><span style="margin-left:30%">登记时间:@Model[i].ForDate</span></div><table class="printTable" border=0 cellspacing=0 cellpadding=0 style="border-collapse:collapse;width:100%;"><thead><tr><th>序号</th><th>成本名称</th><th>成本金额(元)</th><th>备注</th></tr></thead><tbody style="width:100%;">@{int index = 1;}@foreach (var item in Model[i].CostItemList){<tr><td>@(index++)</td><td>@item.Name</td><td>@item.TotalMoney</td><td>@item.Remark</td></tr>}</tbody></table></div>}</div><div class="modal-footer"><button type="button" class="btn2 btn_90_28" data-dismiss="modal">关闭</button></div></div></div>
</div>
- 打印js
// 打印
function printFunc(data) {loadStart();var iframeHtml = document.createElement("iframe");iframeHtml.id = "iframePrintBox";iframeHtml.style.width = "0";iframeHtml.style.height = "0";document.body.appendChild(iframeHtml);iframeHtml.srcdoc = '<!DOCTYPE html>' + data + "<script type='text\/javascript'>window.onload = function(){window.print();window.onafterprint = ()=>{window.parent.close();}}<\/script>";loadEnd()
}
导出
//多sheet导出
function exportToExcelBatch(sheetName, exportArr) {var fileName_g, sheetsName_g, mainHtml_g, sheetHtml_g// 导出函数sheetsName_g = getSheetsName() //获取到每个sheet的名称集合fileName_g = sheetName + '.xlsx' //外部导出名称sheetHtml_g = getSheetXml() //得到每一个sheet的xml片段mainHtml_g = getMainXml() //导出的主体xml片段let XLSData = 'data:application/vnd.ms-excelbase64,' + window.btoa(window.unescape(encodeURIComponent(mainHtml_g)))// 下载download(XLSData)// 下载function download(base64data) {let blobif (window.navigator.msSaveBlob) {blob = base64ToBlob(base64data)window.navigator.msSaveBlob(blob, sheetName + '.xlsx')return false}let a = document.createElement("a")if (window.URL.createObjectURL) {blob = base64ToBlob(base64data)a.href = window.URL.createObjectURL(blob)a.download = fileName_ga.click()return}a.href = base64dataa.download = fileName_ga.click()}// 获取sheet名称function getSheetsName() {let sheetsName = []exportArr.forEach((item) => {sheetsName.push(item.name)})return sheetsName}
// 创建文件流
function base64ToBlob(base64Data) {let arr = base64Data.split(',')let mime = arr[0].match(/:(.*?)/)[1]let bstr = atob(arr[1])let n = bstr.lengthlet u8arr = new Uint8ClampedArray(n)while (n--) {u8arr[n] = bstr.charCodeAt(n)}return new Blob([u8arr], { type: mime })
}/*** 文件下载* @param {any} url 文件路径* @param {any} fileName 文件名称*/function downloadFile(url, fileName) {if (!url || !fileName) return false;let aUrl = url;const x = new XMLHttpRequest();x.open('GET', aUrl, true);x.responseType = 'blob';x.onload = function (e) {const url = window.URL.createObjectURL(x.response);const elink = document.createElement('a');elink.href = url;elink.target = '_self'; // 当前页 target打开新页面elink.download = `${fileName}`;elink.style.display = 'none';document.body.appendChild(elink);elink.click();document.body.removeChild(elink);};x.send();}// 获取所有xml代码function getMainXml() {let mainHtml = ''let sheets = ''if (sheetsName_g.length > 0) {for (let i = 0; i < sheetsName_g.length; i++) {let name = sheetsName_g[i]let sheetItem = `<x:ExcelWorksheet><x:Name>${name}</x:Name><x:WorksheetSource HRef=3D"export/sheet${name}.xml"/></x:ExcelWorksheet>`sheets += sheetItem}}mainHtml = `MIME-Version: 1.0
X-Document-Type: Workbook
Content-Type: multipart/related; boundary="----memo----"------memo----
Content-Location: file:///C:/0E8D990C/export.xml
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="us-ascii"<html xmlns:o=3D"urn:schemas-microsoft-com:office:office"
xmlns:x=3D"urn:schemas-microsoft-com:office:excel"
xmlns=3D"http://www.w3.org/TR/REC-html40"><head>
<xml><o:DocumentProperties><o:Author>ijovo</o:Author><o:LastAuthor>ijovo</o:LastAuthor><o:Company>ijovo</o:Company><o:Version>1.0</o:Version></o:DocumentProperties>
</xml>
<!--[if gte mso 9]>
<xml><x:ExcelWorkbook><x:ExcelWorksheets>${sheets}</x:ExcelWorksheets></x:ExcelWorkbook>
</xml>
<![endif]-->
</head>
</html>` + sheetHtml_g + `------memo------`return mainHtml}// 获取每个sheet的xml代码}function getSheetXml() {let sheetHtml = ''let sheets = ''for (let i = 0; i < exportArr.length; i++) {let name = exportArr[i].name// MIME要求格式必须顶格……所以这里排版比较乱……let sheetItem = `------memo----
Content-Location: file:///C:/0E8D990C/export/sheet${name}.xml
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="us-ascii"<html xmlns:o="urn:schemas-microsoft-com:office:office"xmlns:x="urn:schemas-microsoft-com:office:excel"xmlns="http://www.w3.org/TR/REC-html40"><head><xml><x:WorksheetOptions><x:ProtectContents>False</x:ProtectContents><x:ProtectObjects>False</x:ProtectObjects><x:ProtectScenarios>False</x:ProtectScenarios></x:WorksheetOptions></xml><style><!-- @page{mso-footer-data:"&C\\7B2C &P \\9875\\FF0C\\5171 &N \\9875";margin:0.748in 0.195in 0.748in 0.195in;mso-header-margin:0.51in;mso-footer-margin:0.51in;}--></style></head><body>`let table = `<table border=0 cellspacing=0 cellpadding=0 width="100%" bordercolor="#000000" style="border-collapse:collapse">${exportArr[i].html}</table>`sheetItem += table + `</body>
</html>`sheets += sheetItem}sheetHtml = sheetsreturn sheetHtml}
}
单表格导出
// 导出表格
function exportToExcel(sheetName, html) {var uri = 'data:application/vnd.ms-excel;base64,';var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"' +'xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'+ '<x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets>'+ '</x:ExcelWorkbook></xml><![endif]-->' +' <style type="text/css">' +'table td {' +'border: 0.5px solid #000000;' +'width: auto;' +'height: 25px;' +'text-align: center;' +'mso-number-format:\@;' +'vnd.ms-excel.numberformat:\@;' +/* 'background-color: #4f891e;' +*//* 'color: #ffffff;' +*/' }' +'table th {' +'border: 0.5px solid #000000;' +/* 'width: auto;' +*/'height: 35px;' +'text-align: center;' +'font-size:20px' +'mso-number-format:\@;' +'vnd.ms-excel.numberformat:\@;' +' }' +'</style>' +'</head><body ><table>{table}</table></body></html>';//if (!tableid.nodeType) tableid = document.getElementById(tableid);//var ctx = { worksheet: sheetName || 'Worksheet', table: tableid.innerHTML };var ctx = { worksheet: sheetName || 'Worksheet', table: html };var a = document.createElement("a");a.download = sheetName + ".xls";a.href = uri + this.excelBase64(this.excelFormat(template, ctx));document.body.appendChild(a);a.click();document.body.removeChild(a);
}// Excel格式
function excelFormat(s, c) {return s.replace(/{(\w+)}/g,function (m, p) {return c[p];});
}// 纯js导出Excel
function excelBase64(excelFile) {return window.btoa(unescape(encodeURIComponent(excelFile)));
}
相关文章:
c# 前端无插件打印导出实现方式
打印 打印导出分布页 model List<界面的数据模型类> using WingSoft; using Newtonsoft.Json; <style type"text/css">.modal-content {width: 800px;}.modal-body {height: 400px;} </style> <script type"text/javascript">$(…...
数组的初始化,参数传递,和求和
在自己做的这个C语言解释器中,数组的使用非常简便。下面小程序是一个例子。演示了数组的初始化,参数传递, 和求和。 all[] { WA12,OR8,CA54, ID4, MT4, WY3, NV6, UT6, AZ11, CO10, NM5, ND3,SD3,NE4, KS6, OK7,TX40, MN10, WI10,IA6, MO10,…...

初始JavaEE篇——多线程(1):Thread类的介绍与使用
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 创建线程 1、继承 Thread类 2、实现Runnable接口 3、使用匿名内部类 1)继承Thread类的匿名内部类 2)…...

基于单片机的LED照明自动控制系统的设计
本设计主控核心芯片选用了AT89C51单片机,接入了光照采集模块、红外感应模块、继电器控制模块,通过控制发光二极管模拟教室智能灯组的控制。首先通过光敏感应的方式感应当前光照环境为白天还是夜晚,同时,红外感应模块感应是否有人。…...
C语言——头文件的使用
目录 前言头文件怎么包含 前言 这个专栏会专门讲一些C语言的知识,后续会慢慢更新,欢迎关注 C语言专栏 头文件怎么包含 在使用头文件的过程中,我们经常会遇到重定义、重复包含等问题,那么怎么编写头文件和使用头文件才能解决这些…...

LeetCode 精选 75 回顾
目录 一、数组 / 字符串 1.交替合并字符串 (简单) 2.字符串的最大公因子 (简单) 3.拥有最多糖果的孩子(简单) 4.种花问题(简单) 5.反转字符串中的元音字母(简单&a…...

【Unity - 屏幕截图】技术要点
在Unity中想要实现全屏截图或者截取某个对象区域的图片都是可以通过下面的函数进行截取 Texture2D/// <summary>/// <para>Reads the pixels from the current render target (the screen, or a RenderTexture), and writes them to the texture.</para>/…...

句句深刻,字字经典,创客匠人老蒋金句出炉,哪一句让你醍醐灌顶?
注意力经济时代、流量经济时代、短视频经济时代,创始人到底应该如何做,才能抓住风口,链接未来? 「创始人IP创新增长班」线下大课现场,老蒋作为主讲导师,再一次用他丰富的行业经验与深刻的时代洞察ÿ…...

柯尼卡美能达CA-310 FPD色彩分析仪
柯尼卡美能达CA-310 FPD色彩分析仪 型 号:CA-310 名 称:FPD色彩分析仪 品 牌:柯尼卡美能达(KONICA MINOLTA) 分 类:光学和色彩测试 > 光学、显示与色彩测量 > 色彩分析仪 产品属性:主机 简 述&…...

二维EKF的MATLAB代码
EKF二维滤波 MATLAB 实现 提升您的数据处理能力!本MATLAB程序实现了扩展卡尔曼滤波(EKF)在二维状态估计中的应用,专为需要高精度定位和动态系统分析的用户设计。通过精确的滤波技术,有效减少噪声影响,确保…...

大数据治理:数据时代的挑战与应对
目录 大数据治理:数据时代的挑战与应对 一、大数据治理的概念与内涵 二、大数据治理的重要性 1. 提高数据质量与可用性 2. 确保数据安全与合规 3. 支持数据驱动的决策 4. 提高业务效率与竞争力 三、大数据治理的实施策略 1. 建立健全的数据治理框架 2. 数…...

绿联NAS免驱安装MacOS
前段时间UGOS Pro迎来了一次大更新,Docker新增了Docker Compose堆栈项目,于是便在Docker Hub找了个支持Docker Compose部署的MacOS开源项目来验证一下,顺便体验一下用N100运行是什么感觉。 开始折腾 先说说,在没用Docker Compos…...

聊聊ASSERT处理在某些场景下的合理用法
先看看ASSERT的介绍: 编写代码时,我们总是会做出一些假设,ASSERT断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真…...

SAP Odata 服务
参考过程 SAP创建ODATA服务-Structure_sap odata-CSDN博客 案例...

【java数据结构】栈
【java数据结构】栈 一、栈的概念二、 栈的使用三、 栈的模拟实现(数组)构造方法size()empty()push()pop()peek() 四、 栈的模拟实现(链表)构造方法size()empty()push()pop()peek() 五、 栈的例题 此篇博客希望对你有所帮助(帮助你了解栈),不…...

从头开始的可视化数据 matplotlib:初学者努力绘制数据图
从头开始学习使用 matplotlib 可视化数据,对于初学者来说,可能会有些挑战,但 matplotlib 的核心理念非常清晰:绘制图表需要了解如何设置图形、坐标轴以及如何用数据填充它们。我们可以通过一些简单的例子来逐步介绍基本步骤。 1. …...

vscode 远程linux服务器 连接git
vscode 远程linux服务器 连接git 1. git 下载2. git 配置1)github 设置2)与github建立连接linux端:创建密钥github端:创建ssh key 3. 使用1)初始化repository2)commit 输入本次提交信息,提交到本…...
不同jdk版本中的接口规范
Java Development Kit(JDK)的每个版本通常会对 Java 语言和类库进行改进,接口规范也在不断演进。Java 接口的演变是逐步从 “纯粹抽象的定义” 向 “具有行为的抽象定义” 演化的。 JDK 1.0 和 JDK 1.1JDK 1.2 到 JDK 1.6JDK 1.8(…...
人工智能图像信号处理器(AI ISP)技术介绍
随着智能设备和数码成像技术的快速发展,图像质量的提升成为用户体验的关键因素之一。人工智能图像信号处理器(AI Image Signal Processor,AI ISP) 作为传统图像信号处理器(ISP)的升级版,通过集成…...

3D Slicer 教程三 ---- 坐标系
上篇提到3D Slicer 教程二 ---- 数据集-CSDN博客 3d slicer的坐标系与大多数医学影像软件使用LPS(左、后、上)坐标系统不太一样, 今天就仔细介绍一下坐标系的区别,复盘一下在影像处理中遇到的坐标问题(集中在坐标处理相关的,图像插值,图像处理, 定位线,翻…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...