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客户端使用

相关推荐
爱吃生蚝的于勒37 分钟前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
冰芒猓4 小时前
SpringMVC数据校验、数据格式化处理、国际化设置
开发语言·maven
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
冷眼Σ(-᷅_-᷄๑)4 小时前
Path.Combine容易被忽略的细节
c#·.net
杜杜的man4 小时前
【go从零单排】Closing Channels通道关闭、Range over Channels
开发语言·后端·golang
java小吕布5 小时前
Java中Properties的使用详解
java·开发语言·后端
versatile_zpc5 小时前
C++初阶:类和对象(上)
开发语言·c++
尘浮生5 小时前
Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·学习·微信小程序·小程序