C# aspose word实现模板方式打印及打印速度慢解决方法

1.引用dll

nuget或者网上都有下载的方式。不过都要收费。下载地址:https://files.cnblogs.com/files/rolayblog/Tool.zip?t=1713322422&download=true

2.打印模板设计

新建一个doc文档,根据自己的需求画页面。

A、普通文本

在word中需要替换值的地方添加书签,插入>书签,书签名字最好是值的关键字。

 B、图片,图片的方式和普通文本一样,使用书签占位。

C、表格,实际业务中,肯定会有拿到一个list动态把所有的数据渲染到表格上面,一组数据一行。这时候需要用到域。(office)插入>文档部件>域

 找到MergeField,aspose中会用TableStart和TableEnd来确定table域的工作范围,开始和结束,其中数据集合的命名放在start和end之后,类似于:TableStart:userList,这个非常重要,然后表格中每个需要填充的数据都要加上域,

域名和书签类似,使用关键字即可。我这边的配置结果如下:

 3、数据填充

A、模板文档加载

  string tempFile = System.Windows.Forms.Application.StartupPath + "/temp/tempA4.docx";
Document doc = new Document(tempFile);

B、普通文本填充

Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("address", item.address);dic.Add("age", patient.age);
foreach (var key in dic.Keys)   //循环键值对{builder.MoveToBookmark(key);  //将光标移入书签的位置builder.Write(dic[key]);   //填充值}

C、图片填充

builder.InsertImage(imgData);

D、表格数据填充

 DataTable userTable = new DataTable("list");userTable.Columns.Add(new DataColumn("sortIndex", typeof(int)));userTable.Columns.Add("checkItemName");userTable.Columns.Add("appointmentTime");userTable.Columns.Add("address");userTable.Columns.Add("itemNotice");userTable.Rows.Add(1, "腹部超声检查", "2024年5月2日 11:00-12:00", "三楼骨科", "我是一个注意事项");userTable.Rows.Add(2, "腹部超声检查2", "2024年5月2日 11:00-12:002", "三楼骨科2", "我是一个注意事项2");userTable.Rows.Add(2, "腹部超声检查2", "2024年5月2日 11:00-12:002", "三楼骨科2", "我是一个注意事项2");userTable.Rows.Add(2, "腹部超声检查2", "2024年5月2日 11:00-12:002", "三楼骨科2", @"1、病人先挂号、看病、医生开出CT和 MRI申请单,可以医生诊间预约。 
2、请于申请当日到自助机缴费或收费窗口交费,到3号二楼检查集中预约中心预约。 
3、检查当日持预约申请单提前10 - 15分钟到规定检查室前确认后进行检查。 
6、检查完毕后,按规定时间持取片卡号,到CT MRI登记室取片及结果。 ");userTable.Rows.Add(2, "腹部超声检查2", "2024年5月2日 11:00-12:002", "三楼骨科2", @"1、病人先挂号、看病、医生开出CT和 MRI申请单,可以医生诊间预约。 
2、请于申请当日到自助机缴费或收费窗口交费,到3号二楼检查集中预约中心预约。 
3、检查当日持预约申请单提前10-15分钟到规定检查室前确认后进行检查。 
6、检查完毕后,按规定时间持取片卡号,到CT MRI登记室取片及结果。 ");userTable.Rows.Add(2, "腹部超声检查2", "2024年5月2日 11:00-12:002", "三楼骨科2", "我是一个注意事项2");DataSet dataSet = new DataSet();dataSet.Tables.Add(userTable);doc.MailMerge.ExecuteWithRegions(dataSet);

以上就是模板处理的方式和代码。

3、aspose word Document 内置实现了print方法,调用windows的打印方法,用过这个的应该都知道每次第一次打印的时候都要等几秒,有时候长达五秒,因为我这里是浏览器打开exe打印,每次打印完成后关闭exe。等于是每次都是重新打开。每次都很慢。

4、我这边实现了一个socket服务端,这个服务端来负责打印,而浏览器打开的exe只负责拿到参数,把参数发送和socket服务端后就可以自己关闭了,socket服务端拿到数据就打印,这样只有第一次打开的时候需要五秒,后面基本1秒足左右都能打印出来。

5、sockt服务端代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace PrintService
{public class TcpServer{private TcpListener tcpListener;private Thread listenThread;private TcpClient tcpClient;public TcpServer(int port){IPAddress ipAddress = IPAddress.Any;tcpListener = new TcpListener(ipAddress, port);}public void Start(){tcpListener.Start();Console.WriteLine("服务端已启动,等待客户端连接...");listenThread = new Thread(new ThreadStart(ListenForClients));listenThread.Start();}public void sendMessage() {if (tcpClient.Connected) {string heartbeatMessage = "suncess";byte[] heartbeatData = Encoding.ASCII.GetBytes(heartbeatMessage);// 发送消息给客户端tcpClient.GetStream().Write(heartbeatData, 0, heartbeatData.Length);}}private void ListenForClients(){while (true){TcpClient client = tcpListener.AcceptTcpClient();Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientCommunication));clientThread.Start(client);}}private void HandleClientCommunication(object client){tcpClient = (TcpClient)client;string clientEndPoint = tcpClient.Client.RemoteEndPoint.ToString();Console.WriteLine("客户端 {0} 已连接。", clientEndPoint);NetworkStream clientStream = tcpClient.GetStream();byte[] buffer = new byte[4096];while (true){try{int bytesRead = clientStream.Read(buffer, 0, buffer.Length);if (bytesRead == 0){Console.WriteLine("客户端 {0} 已断开连接。", clientEndPoint);break;}string recvStr = Encoding.UTF8.GetString(buffer, 0, bytesRead);Task t = new Task(() =>{PrintDataUtil.DoPrint(recvStr);});t.Start();}catch (Exception ex){Console.WriteLine("与客户端 {0} 的连接发生异常: {1}", clientEndPoint, ex.Message);break;}}tcpClient.Close();}}
}
socket服务端

6、socket服务端使用

 TcpServer tcpServer = new TcpServer(6879);tcpServer.Start();

7、sokcet客户端代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;namespace AutoPrint
{public class MyTcpClient{private TcpClient tcpClient;public MyTcpClient(){}public void Connect(string ipAddress, int port){tcpClient = new TcpClient();tcpClient.Connect(IPAddress.Parse(ipAddress), port);Console.WriteLine("与服务端连接成功!");}public void SendMessage(string message){if (tcpClient.Connected){byte[] messageData = Encoding.ASCII.GetBytes(message);tcpClient.GetStream().Write(messageData, 0, messageData.Length);}}public void CloseConnect() {if (tcpClient.Connected) {tcpClient.Close();}}}
}
socket客户端代码

8、sokcet客户端使用

 public Form1(string[] args){InitializeComponent();MyTcpClient myTcpClient = new MyTcpClient();try{int startIndex = args[0].IndexOf("$");string paramStr = "";if (startIndex >= 0 && startIndex < args[0].Length){paramStr = args[0].Substring(startIndex).Replace("$", "").Replace("/", ""); // 从"$"后面的位置开始截取到字符串结束  myTcpClient.Connect("127.0.0.1", 6879);myTcpClient.SendMessage(paramStr);}else{MessageBox.Show("无效参数!");System.Environment.Exit(0);return;}}finally {Thread.Sleep(500);myTcpClient.CloseConnect();this.Close();System.Environment.Exit(0);}}
socket客户端使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《2024最新Java面试题及答案(带完整目录)》

获取链接&#xff1a;《2024最新Java面试题及答案&#xff08;带完整目录&#xff09;》 更多技术书籍&#xff1a;技术书籍分享&#xff0c;前端、后端、大数据、AI、人工智能... ​ ​ ​ 4.1.9.8. 可重入锁&#xff08;递归锁&#xff09; ...........................…

Oracle11.2.0.1,(CVE-2012-1675)漏洞解决方案

1.进入容器停止监听 docker exec -it -u 0 oracle11g bash su - oracle lsnrctl stop listener2.找到监听配置文件位置&#xff0c;修改监听文件 echo $ORACLE_HOMEvi network/admin/listener.ora #在文件底部添加 SECURE_REGISTER_LISTENER (IPC) #启动监听 lsnrctl start …

基于springboot+vue+Mysql的汽车租赁系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

idea运行报错:启动命令过长

JAVA项目&#xff0c;运行的时候报错 Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun老问题了&#xff0c;记录一下 解决办法&#xff1a; 1、Edit Configurations 2、点击Modify options设置&#xff0c;勾选S…

PlistEdit Pro for Mac激活版:强大的Plist文件编辑工具

PlistEdit Pro for Mac是一款专为Mac用户设计的强大Plist文件编辑工具。Plist文件是苹果公司开发的一种XML文件格式&#xff0c;用于存储应用程序的配置信息和数据。这款软件为用户提供了直观、易用的界面&#xff0c;使编辑和管理Plist文件变得轻松简单。 PlistEdit Pro for M…

C++设计模式|创建型 3.抽象工厂模式

在上一篇文章中介绍了工厂模式&#xff0c;每个具体工厂负责生产一个专门的产品&#xff0c;其代码扩展性很好&#xff0c;这篇文章将介绍抽象工厂模式。 1.为什么要使用抽象工厂模式&#xff1f; 既然已经有了“工厂模式”&#xff0c;那为什么还会有抽象工厂模式呢&#xf…

ubuntu常用方法

文本文件的创建&#xff1a; sudo touch ubuntu.txt move clock: sudo chmod 777 ubuntu.txt 安装chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt install ./google-chrome-stable_current_amd64.deb .sh 文件的安装 例…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(1)——场景故事介绍

生成NPC为交互应用程序创建逼真的人类行为模拟。在这项工作中&#xff0c;我们通过将二十五个NPC放置在一个沙盒环境中&#xff08;类似于The Sims&#xff0c;模拟人生&#xff09;&#xff0c;展示了生成NPC的能力。用户可以观察和干预NPC的日常计划、分享新闻、建立关系以及…

web配置https

Tomcat8 配置&#xff1a; 1.单向认证&#xff0c;就是传输的数据加密过了&#xff0c;但是不会校验客户端的来源 2.双向认证&#xff0c;如果客户端浏览器没有导入客户端证书&#xff0c;是访问不了web系统的&#xff0c;找不到地址 如果只是加密&#xff0c;我感觉单向就行…

就业班 第三阶段(ansible) 2401--4.16 day2 ansible2 剧本+角色

六、Ansible playbook 简介 playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。   通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的…

人工智能电话机器人常见的问题有哪些?

随着业务的不断拓展&#xff0c;电销业务量也不断攀升。公司为了控制用人成本&#xff0c;电销人员数量有限&#xff0c;而且培训上岗周期慢&#xff0c;这就导致成交率、销售额无法完成&#xff0c;电话机器人的出现&#xff0c;有效的解决了这些痛点&#xff0c;只需电销人员…

广东海洋大学成功部署(泰迪智能科技)大数据人工智能实验室建设

广东海洋大学简称广东海大&#xff0c;坐落于广东省湛江市&#xff0c;是国家海洋局与广东省人民政府共建的省属重点建设大学、广东省高水平大学重点学科建设高校、粤港澳高校联盟成员 &#xff0c;入选卓越农林人才教育培养计划&#xff0c;是教育部本科教学水平评估优秀院校。…

odoo添加自定义网页---添加模块图标

1.新建一个模块 python odoo-bin scaffold test_web <路径> 2.我们需要修改一下几个文件 3.web.xml <?xml version"1.0" encoding"UTF-8"?> <templates id"template" xml:space"preserve"><t t-name"T…

uniapp封装websocket以及心跳检测、重连

websocket 封装 在所需文件夹下建立websocketUtils.js文件&#xff0c;封装代码如下&#xff1a; class websocketUtils {constructor(openId, time) {this.url wss://**** //ws地址 拼接一下 此处用的是openIdthis.data nullthis.isOpenSocket false //避免重复连接this.…

详解汽车交流充电桩主板的四大版本

近年来&#xff0c;在电动汽车行业快速发展背景下&#xff0c;充电桩的建设变得愈发重要&#xff0c;特别是兼容性较高、适用性较广的交流充电桩。 交流充电桩的心脏——主板的设计与功能&#xff0c;对于充电桩的性能和用户体验起着至关重要的作用。目前&#xff0c;市面上的…

OpenCV 常见数据类型

OpenCV 是一个轻量级高效的跨平台计算机视觉库&#xff0c;实现了图像处理和计算机视觉方面的多种通用算法。所谓的图像可以理解为一个数组&#xff0c;图像处理就是对数组的处理。首先&#xff0c;本文将介绍 OpenCV 中常见的数据类型&#xff0c;包括点 Point类、颜色 Scalar…

康谋技术 | 深入探讨:自动驾驶中的相机标定技术

随着自动驾驶技术的快速发展&#xff0c;多传感器的数据采集和融合可以显著提高系统的冗余度和容错性&#xff0c;进而保证决策的快速性和正确性。在项目开发迭代过程中&#xff0c;传感器标定扮演着至关重要的角色&#xff0c;它位于数据采集平台与感知融合算法之间&#xff0…

今天碰到的一点小问题(网上搜了一下理解了一下

在编程中&#xff0c;let 是一个关键字&#xff0c;主要用于声明一个块级作用域的局部变量。它是在 ECMAScript 2015&#xff08;也称为 ES6&#xff09;中引入的&#xff0c;以替代 var 关键字&#xff0c;用于解决 var 的一些作用域问题。 使用 let 声明的变量具有以下特点&…

如何使用自定义Promptbooks优化您的安全工作流程

在当今的数字化时代&#xff0c;安全工作流程的优化变得前所未有的重要。安全团队需要快速、有效地响应安全事件&#xff0c;以保护组织的数据和资产。Microsoft Copilot for Security提供了一种强大的工具——自定义Promptbooks&#xff0c;它可以帮助安全专家通过自动化和定制…

Swift高级特性之泛型

泛型是一种在编程语言中实现通用性的特性&#xff0c;它允许我们编写可以适应不同数据类型的代码。在Swift中&#xff0c;泛型可以应用于函数、类、结构体和枚举。 1.泛型函数&#xff1a;使用泛型函数可以编写一次代码&#xff0c;用于处理不同类型的数据。例如&#xff0c;我…