当前位置: 首页 > news >正文

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语言解释器中&#xff0c;数组的使用非常简便。下面小程序是一个例子。演示了数组的初始化&#xff0c;参数传递&#xff0c; 和求和。 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类的介绍与使用

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

基于单片机的LED照明自动控制系统的设计

本设计主控核心芯片选用了AT89C51单片机&#xff0c;接入了光照采集模块、红外感应模块、继电器控制模块&#xff0c;通过控制发光二极管模拟教室智能灯组的控制。首先通过光敏感应的方式感应当前光照环境为白天还是夜晚&#xff0c;同时&#xff0c;红外感应模块感应是否有人。…...

C语言——头文件的使用

目录 前言头文件怎么包含 前言 这个专栏会专门讲一些C语言的知识&#xff0c;后续会慢慢更新&#xff0c;欢迎关注 C语言专栏 头文件怎么包含 在使用头文件的过程中&#xff0c;我们经常会遇到重定义、重复包含等问题&#xff0c;那么怎么编写头文件和使用头文件才能解决这些…...

LeetCode 精选 75 回顾

目录 一、数组 / 字符串 1.交替合并字符串 &#xff08;简单&#xff09; 2.字符串的最大公因子 &#xff08;简单&#xff09; 3.拥有最多糖果的孩子&#xff08;简单&#xff09; 4.种花问题&#xff08;简单&#xff09; 5.反转字符串中的元音字母&#xff08;简单&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>/…...

句句深刻,字字经典,创客匠人老蒋金句出炉,哪一句让你醍醐灌顶?

注意力经济时代、流量经济时代、短视频经济时代&#xff0c;创始人到底应该如何做&#xff0c;才能抓住风口&#xff0c;链接未来&#xff1f; 「创始人IP创新增长班」线下大课现场&#xff0c;老蒋作为主讲导师&#xff0c;再一次用他丰富的行业经验与深刻的时代洞察&#xff…...

柯尼卡美能达CA-310 FPD色彩分析仪

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

二维EKF的MATLAB代码

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

大数据治理:数据时代的挑战与应对

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

绿联NAS免驱安装MacOS

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

聊聊ASSERT处理在某些场景下的合理用法

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

SAP Odata 服务

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

【java数据结构】栈

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

从头开始的可视化数据 matplotlib:初学者努力绘制数据图

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

vscode 远程linux服务器 连接git

vscode 远程linux服务器 连接git 1. git 下载2. git 配置1&#xff09;github 设置2&#xff09;与github建立连接linux端&#xff1a;创建密钥github端&#xff1a;创建ssh key 3. 使用1&#xff09;初始化repository2&#xff09;commit 输入本次提交信息&#xff0c;提交到本…...

不同jdk版本中的接口规范

Java Development Kit&#xff08;JDK&#xff09;的每个版本通常会对 Java 语言和类库进行改进&#xff0c;接口规范也在不断演进。Java 接口的演变是逐步从 “纯粹抽象的定义” 向 “具有行为的抽象定义” 演化的。 JDK 1.0 和 JDK 1.1JDK 1.2 到 JDK 1.6JDK 1.8&#xff08;…...

人工智能图像信号处理器(AI ISP)技术介绍

随着智能设备和数码成像技术的快速发展&#xff0c;图像质量的提升成为用户体验的关键因素之一。人工智能图像信号处理器&#xff08;AI Image Signal Processor&#xff0c;AI ISP&#xff09; 作为传统图像信号处理器&#xff08;ISP&#xff09;的升级版&#xff0c;通过集成…...

3D Slicer 教程三 ---- 坐标系

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

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...

背包问题双雄:01 背包与完全背包详解(Java 实现)

一、背包问题概述 背包问题是动态规划领域的经典问题&#xff0c;其核心在于如何在有限容量的背包中选择物品&#xff0c;使得总价值最大化。根据物品选择规则的不同&#xff0c;主要分为两类&#xff1a; 01 背包&#xff1a;每件物品最多选 1 次&#xff08;选或不选&#…...