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(左、后、上)坐标系统不太一样, 今天就仔细介绍一下坐标系的区别,复盘一下在影像处理中遇到的坐标问题(集中在坐标处理相关的,图像插值,图像处理, 定位线,翻…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
