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

21.2.7 综合示例

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

【例 21.7【项目:code21-007】填充职员表并打印。

本例使用到的Excel文件为:职员信息登记表.xlsx,如下图所示:

图21-10 职员信息登记表

窗体设计如下图所示(注意:为了演示方便,已经填充了数据):

图21-11 窗体设计

在本例中还需要掌握的知识:

1、插入图片到指定位置

Worksheet.Shapes.AddPicture(Filename, LinkToFile, SaveWithDocument, Left, Top, Width, Height);

参数说明:

  1. Filename:必选,图片全路径。
  2. LinkToFile:必选,如果为True,则建立图片与其源文件之间的链接关系。否则,使图片成为其源文件的独立副本。通常设置为True。
  3. SaveWithDocument:必选,如果是True,则将图片与文档一起保存。否则,只链接到图片文件。通常设置为True。
  4. Left:必选,图片左上角相对于文档左上角的位置(以磅为单位)。
  5. Top:必选,图片左上角相对于文档顶部的位置(以磅为单位)。
  6. Width:必选,图片的宽度(以磅为单位)。
  7. Height:必选,图片的高度(以磅为单位)。

返回值:

  1. 一个代表新图片的Shape对象。

2、打印输出

Worksheet.PrintOutEx(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName, IgnorePrintAreas);

参数说明:

  1. From:可选,打印的开始页号。如果省略此参数,则从起始位置开始打印。
  2. To:可选,打印的终止页号。如果省略此参数,则打印至最后一页。
  3. Copies:可选,打印份数。如果省略此参数,则只打印一份。
  4. Preview:可选,如果为 True,将在打印前调用打印预览。如果为 False(或省略该参数),则立即打印。
  5. ActivePrinter:可选,设置活动打印机的名称,如果不设置,将使用默认打印机。
  6. PrintToFile:可选,如果为True,则打印到文件。如果没有指定 PrToFileName,将提示用户输入要使用的输出文件的文件名。
  7. Collate:可选,如果为True,则逐份打印多个副本。
  8. PrToFileName:可选,如果PrintToFile 设为True,则该参数指定要打印到的文件名。
  9. IgnorePrintAreas:可选,如果为True,则忽略打印区域并打印整个对象。

具体代码如下:

        //需要套用的模板文件

        string modelFile = "c:\\lessons\\职员信息登记表.xlsx";

        //输出Excel文件

        private void Button1_Click(object sender, EventArgs e)

        {

            //获得excel文件输出路径

            string modelfilePath = (new FileInfo(modelFile)).Directory.FullName;

            Microsoft.Office.Interop.Excel.Application xls = new Microsoft.Office.Interop.Excel.Application();

            Workbook Wbook = xls.Workbooks.Open(modelFile);

            Worksheet Wsheet;

            Wsheet = Wbook.Worksheets["sheet1"];

            //填充工作表各个单元格

            Wsheet.Cells[2, 2].value = txtXm.Text;

            Wsheet.Cells[2, 4].value = txtXb.Text;

            Wsheet.Cells[2, 6].value = txtMz.Text;

            Wsheet.Cells[2, 8].value = txtCsny.Text;

            Wsheet.Cells[3, 2].value = txtJkzk.Text;

            Wsheet.Cells[3, 4].value = txtSg.Text;

            Wsheet.Cells[3, 6].value = txtJg.Text;

            Wsheet.Cells[3, 8].value = txtHyzk.Text;

            Wsheet.Cells[4, 2].value = txtWhcd.Text;

            Wsheet.Cells[4, 4].value = txtByyx.Text;

            Wsheet.Cells[4, 7].value = txtSxzy.Text;

            Wsheet.Cells[5, 2].value = txtGzbm.Text;

            Wsheet.Cells[5, 4].value = txtZw.Text;

            Wsheet.Cells[5, 6].value = txtRzsj.Text;

            Wsheet.Cells[5, 8].value = txtZc.Text;

            Wsheet.Cells[6, 2].value = txtLxdz.Text;

            Wsheet.Cells[6, 5].value = txtLxdh.Text;

            Wsheet.Cells[7, 2].value = txtGrjl.Text;

            Wsheet.Cells[8, 2].value = txtQk.Text;

            Wsheet.Cells[9, 2].value = txtGrtc.Text;

            //插入图片

            int picWidth, picHeight;

            int picTop, picLeft;

            //图片高宽比单元格小4,注意由于是一个合并单元格,这里使用了MergeArea

            picWidth = (int)Wsheet.Range["I2"].MergeArea.Width - 4;

            picHeight = (int)Wsheet.Range["I2"].MergeArea.Height - 4;

            //图片左上角位置增加2

            picTop = (int)Wsheet.Range["I2"].Top + 2;

            picLeft = (int)Wsheet.Range["I2"].Left + 2;

            //插入图片

            Microsoft.Office.Interop.Excel.Shape picShape;

            //插入的图片位于Employee目录下,以职员名称命名

            picShape = Wsheet.Shapes.AddPicture(modelfilePath + "\\Employee\\" + txtXm.Text + ".jpg",

                 MsoTriState.msoTrue, MsoTriState.msoTrue, picLeft, picTop, picWidth, picHeight);

            //按照职员姓名保存文件

            Wbook.SaveAs(modelfilePath + "\\" + txtXm.Text + ".xlsx");   

            xls.Quit();

            MessageBox.Show("输出完成");

        }

        //打印

        private void Button2_Click(object sender, EventArgs e)

        {

            string modelfilePath = (new FileInfo(modelFile)).Directory.FullName;

            string xlsEmployeeFile = modelfilePath + "\\" + txtXm.Text + ".xlsx";

            string printFile = modelfilePath + "\\" + txtXm.Text + "1.oxps";

            Microsoft.Office.Interop.Excel.Application xls = new Microsoft.Office.Interop.Excel.Application();

            Workbook Wbook = xls.Workbooks.Open(xlsEmployeeFile);

            Worksheet Wsheet = Wbook.Worksheets[1];

            //可以使用PageSetup.Pages.Cpount获得总的页数,但是Excel要消耗时间和资源

            //这里由于只有一页,可以不考虑使用PageSetup.Pages.Cpount

            int pagecount = 1;   // Wsheet.PageSetup.Pages.Count

            //开始打印

            Wsheet.PrintOutEx(1, pagecount, 1, false, xls.ActivePrinter, true, true, printFile, true);

            xls.Quit();

            MessageBox.Show("打印完成");

        }

当按下“输出”按钮,将输出对应职员信息并保存为职员名字的xlsx文件。

当按下“打印”按钮,将输出的xlsx文件使用默认打印机进行打印,由于笔者计算机没有连接真实打印机,使用默认的“Microsoft XPS Document Writer”打印到文件,如果使用真实打印机,请修改PrintOutEx方法的参数,使之符合打印。

生成的xlsx文件效果如下:

图21-12 保存的Excel文件中的数据

打印的效果如下:

图21-13 打印生成的文件

本例中更适合从数据库中读取数据填入Excel中并打印,读取数据库填充数据,请参看第21.2.2节。还可以将输出数据与打印相结合,省略文件保存的步骤。

 

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录

相关文章:

21.2.7 综合示例

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 【例 21.7】【项目:code21-007】填充职员表并打印。 本例使用到的Excel文件为:职员信息登记表.xlsx&#x…...

使用Docker + Ollama在Ubuntu中部署deepseek

1、安装docker 这里建议用docker来部署,方便简单 安装教程需要自己找详细的,会用到跳过 如果你没有安装 Docker,可以按照以下步骤安装: sudo apt update sudo apt install apt-transport-https ca-certificates curl software-p…...

【C语言标准库函数】三角函数

目录 一、头文件 二、函数简介 2.1. 正弦函数:sin(double angle) 2.2. 余弦函数:cos(double angle) 2.3. 正切函数:tan(double angle) 2.4. 反正弦函数:asin(double value) 2.5. 反余弦函数:acos(double value)…...

CNN-day9-经典神经网络ResNet

day10-经典神经网络ResNet 1 梯度消失问题 深层网络有个梯度消失问题:模型变深时,其错误率反而会提升,该问题非过拟合引起,主要是因为梯度消失而导致参数难以学习和更新。 2 网络创新 2015年何凯明等人提出deep residual netw…...

淘宝分类详情数据获取:Python爬虫的高效实现

在电商领域,淘宝作为中国最大的电商平台之一,其分类详情数据对于市场分析、竞争对手研究以及电商运营优化具有不可估量的价值。通过Python爬虫技术,我们可以高效地获取这些数据,为电商从业者提供强大的数据支持。 一、为什么选择…...

机器学习 —— 深入剖析线性回归模型

一、线性回归模型简介 线性回归是机器学习中最为基础的模型之一,主要用于解决回归问题,即预测一个连续的数值。其核心思想是构建线性方程,描述自变量(特征)和因变量(目标值)之间的关系。简单来…...

33.日常算法

1.螺旋矩阵 题目来源 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] class Solution { public:vec…...

#渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概述 二、漏洞复现步骤 三、技术…...

【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命

目录 一、DeepSeek-R1 势不可挡二、DeepSeek-R1 卓越之处三、DeepSeek-R1 创新设计四、DeepSeek-R1 进化之路1. 强化学习RL代替监督微调学习SFL2. Aha Moment “啊哈”时刻3. 蒸馏版本仅采用SFT4. 未来研究计划 部分内容有拓展,部分内容有删除,与原文会有…...

Vision Transformer学习笔记(2020 ICLR)

摘要(Abstract):简述了ViT(Vision Transformer)模型的设计和实验结果,展示了其在大规模图像数据集上进行训练时的优越性能。该模型直接采用原始图像块作为输入,而不是传统的卷积神经网络(CNNs),并通过Transformer架构处理这些图像块以实现高效的图像识别。引言(Introdu…...

一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路

以下是一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路: 需求分析阶段核心功能梳理 音乐播放器(播放/暂停/进度条/音量)歌单分类(流行/古典/摇滚等)用户系统(登录/收藏/历史记录)搜索功能(歌曲/歌手/专辑)推荐系统(根据用户偏好推荐)技术选型 前端:微信…...

25/2/8 <机器人基础> 阻抗控制

1. 什么是阻抗控制? 阻抗控制旨在通过调节机器人与环境的相互作用,控制其动态行为。阻抗可以理解为一个力和位移之间的关系,涉及力、速度和位置的协同控制。 2. 阻抗控制的基本概念 力控制:根据感测的外力调节机械手的动作。位置…...

golang 开启HTTP代理认证

内部网路不能直接访问外网接口,可以通过代理发送HTTP请求。 HTTP代理服务需要进行认证。 package cmdimport ("fmt""io/ioutil""log""net/http""net/url""strings" )// 推送CBC07功能 func main() {l…...

详解Nginx no live upstreams while connecting to upstream

网上看到几个相关的文章,觉得很不错,这里整理记录分享一下,供大家参考。 upstream配置分 在分析问题原因之前,我们先来看下关于上面upstream配置一些相关的参数配置说明,参考下面表格 ngx_http_proxy_module 这里重…...

Open3d Qt的环境配置

Open3d Qt的环境配置 一、概述二、操作流程2.1 下载文件2.2 新建文件夹2.3 环境变量设置2.4 qt6 引用3、qt中调用4、资源下载一、概述 目前统一使用qt6配置,open3d中可视化功能目前使用vtk代替,语言为c++。 二、操作流程 2.1 下载文件 访问open3d github链接,进入releas…...

5.Python字典和元组:字典的增删改查、字典遍历、访问元组、修改元组、集合(set)

1. 字典(dict) 字典是一个无序的键值对集合,每个键对应一个值。 字典的增、删、改、查: 添加键值对: my_dict {a: 1, b: 2} my_dict[c] 3 # 添加新键c,值为3 print(my_dict) # 输出:{a: 1, b: 2, c: …...

深度学习系列--04.梯度下降以及其他优化器

目录 一.梯度概念 1.一元函数 2.二元函数 3.几何意义上的区别 二.梯度下降 1.原理 2.步骤 3.示例代码(Python) 4.不同类型的梯度下降 5.优缺点 三.动量优化器(Momentum) 适用场景 1.复杂地形的优化问题 2.数据具有噪声的问…...

2022java面试总结,1000道(集合+JVM+并发编程+Spring+Mybatis)的Java高频面试题

1、面试题模块汇总 面试题包括以下十九个模块: Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示…...

Ubuntu MKL(Intel Math Kernel Library)

Get Intel oneAPI Math Kernel Library wget https://registrationcenter-download.intel.com/akdlm/IRC_NAS/79153e0f-74d7-45af-b8c2-258941adf58a/intel-onemkl-2025.0.0.940_offline.sh sudo sh ./intel-onemkl-2025.0.0.940_offline.sh MKL库的配置和使用-CSDN博客 CMak…...

消费电子产品中的噪声对TPS54202的影响

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、概述 在白色家电领域,降压转换器的应用非常广泛,为了实现不同的功能就需要不同的电源轨。TPS542…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Cursor实现用excel数据填充word模版的方法

cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...