C# 读取EXCEL的数据批量插入单个PDF里的多个位置

news2024/12/19 2:59:38

C# 读取EXCEL的数据批量插入单个PDF里的多个位置

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using iTextSharp.text.pdf;
using iTextSharp.text;
using Font = iTextSharp.text.Font;
using Microsoft.Office.Interop.Excel;
using Application = Microsoft.Office.Interop.Excel.Application;
using Excel = Microsoft.Office.Interop.Excel;
using Rectangle = iTextSharp.text.Rectangle;


namespace EXCEL批量插入PDF指定位置
{
    public partial class Form1 : Form
    {
        InsertPdf insertPdf = new InsertPdf();
        List<InsertPdf> pudfPathList = new List<InsertPdf>();
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_chose_Click(object sender, EventArgs e)
        {
            string OpenFilePath;//存储选择到的文件的完整路径
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "选择Excel文件";//设置对话框标题栏的内容
            ofd.Filter = "Excel文件(*.xls*)|*.xls*;";  //这是设置对话框内显示的指定后缀类型文件(可设置多个)
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                OpenFilePath = ofd.FileName;
                input.Text = OpenFilePath;
            }
            else
            {
                return;
            }
            OPENEXCEL();
        }
        /// <summary>
        /// 打开Excel文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OPENEXCEL()
        {
            if (input.Text!="")
            {


                   string excelPath = input.Text;
                   object missing=Missing.Value;
                
                Excel.Application excel = new Excel.Application();//创建Excel对象


                try
                {
                    if (excel == null)
                    {
                        MessageBox.Show("Excel对象为空,请检查是否已安装Excel");
                        return;
                    }
                    else
                    {
                        excel.Visible = false;//显示Excel
                        excel.DisplayAlerts = false;//不显示警告信息
                        excel.UserControl = false;//不显示用户界面
                        excel.ScreenUpdating = false;//屏幕刷新
                        Excel.Workbook wb = excel.Application.Workbooks.Open(excelPath, missing, true, missing, missing, missing, missing, missing, missing, true, missing, missing, missing, missing, missing);//打开Excel文件
                        Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];//获取当前工作表
                        int rowCount = ws.UsedRange.Rows.Count;//获取当前工作表的行数
                        int colCount = ws.UsedRange.Columns.Count;//获取当前工作表的列数
                        dataGridView1.Rows.Clear();
                        dataGridView1.Columns.Clear();
                        for (int i = 1; i <= colCount; i++)
                        {
                            if (ws.Cells[1, i].Value2 == null)
                            {

                                break;
                            }
                            string colName = ws.Cells[1, i].Value2.ToString().Trim();
                            dataGridView1.Columns.Add("column" + i, colName);

                        }

                        for (int i = 2; i <= rowCount; i++)
                        {
                            int index = dataGridView1.Rows.Add();
                            if (ws.Cells[i, 1].Value2 != null)
                            {
                                for (int j = 1; j <= colCount; j++)
                                {
                                    if (ws.Cells[i, j].Value2 == null)
                                    { continue; }
                                    dataGridView1.Rows[index].Cells[j - 1].Value = ws.Cells[i, j].Value2.ToString().Trim();

                                }


                            }

                        }


                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("打开Excel文件失败!" + ex.Message);

                    //throw;
                }
                finally { 
                    CloseExcel(excel);
                    MessageBox.Show("加载成功!");

                }
            }
            
            

        }

        private void CloseExcel(Application excel)
        {
            excel.Quit();
            excel = null;
            Process[] excels = Process.GetProcessesByName("excel");
            foreach (Process p in excels)
            {
                p.Kill();//杀掉excel进程
            }
            GC.Collect();
        }
        /// <summary>
        /// 处理单个页面填写多个地方的PDF
        /// </summary>
        /// <param name="pdfPath">PDF文件路径</param>
        /// <param name="pdfsavePath">存PDF文件路径</param>
        /// <param name="xnum">填写字的坐标x</param>
        /// <param name="ynum">填写字的坐标y</param>
        /// <param name="fontnum">字体大小</param>
        /// <param name="textstr">要填入的文字</param>
        /// 
        private void PDFadd(string pdfPath, string pdfsavePath, InsertPdf insertPdf)
        {
            if (dataGridView1.Rows.Count > 0) 
            {
                for (int i = 0; i < dataGridView1.Rows.Count; i++)
                {
                    insertPdf.xnum = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value);
                    insertPdf.ynum = Convert.ToInt32(dataGridView1.Rows[i].Cells[1].Value);
                    insertPdf.fontnum = Convert.ToInt32(dataGridView1.Rows[i].Cells[2].Value);
                    insertPdf.textstr = dataGridView1.Rows[i].Cells[3].Value.ToString();
                    pudfPathList.Add(insertPdf);
                }

            }

            //原文件地址
            string url = @pdfPath;
            //最后要保存的文件地址
            string urlNew= @pdfsavePath;
            //读取原pdf文件
            PdfReader reader = new PdfReader(url);
            PdfStamper stamper = new PdfStamper(reader, new FileStream(urlNew, FileMode.Create, FileAccess.Write, FileShare.None));
            setOnePage(pudfPathList, reader, stamper);
       

        }
        /// <summary>
        /// 处理单个页面多个填写的地方
        /// </summary>
        /// <param name="pdfPathList"></param>
        private void setOnePage(List<InsertPdf> pdfPathList, PdfReader reader, PdfStamper stamper) 
        {
            if (pdfPathList.Count == 1)
            {
                insertPdf = pdfPathList[1];
                //获取系统的字体
                BaseFont baseFont = BaseFont.CreateFont("C:\\Windows\\Fonts\\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                //字体属性及大小
                Font font = new Font(baseFont, insertPdf.fontnum);
                //需要添加的文字
                Phrase addName = new Phrase(insertPdf.textstr, font);
                //获取pdf总页数
                int pagesCount = reader.NumberOfPages;
                //获取pdf页面大小
                Rectangle pageSize = reader.GetPageSize(1);
                //设置pdf的宽
                float width = pageSize.Width;
                //设置pdf的高
                float height = pageSize.Height;
                //遍历所有页,从第一页开始
                for (int i = 1; i <= pagesCount; i++)//遍历所有页
                {

                    if (i == 1)
                    {//第一页
                     //设置当前页
                        PdfContentByte canvas = stamper.GetOverContent(i);
                        //将文本添加到每页pdf的右上角
                        ColumnText.ShowTextAligned(canvas, Element.ALIGN_RIGHT, addName, insertPdf.xnum, insertPdf.ynum, 0);//900, 435,x,y
                    }

                }
                //释放
                stamper.Close();
                MessageBox.Show("添加成功");
            }
            else if (pdfPathList.Count > 1) 
            {
                //获取系统的字体
                BaseFont baseFont = BaseFont.CreateFont("C:\\Windows\\Fonts\\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                //获取pdf总页数
                int pagesCount = reader.NumberOfPages;
                //获取pdf页面大小
                Rectangle pageSize = reader.GetPageSize(1);
                //设置pdf的宽
                float width = pageSize.Width;
                //设置pdf的高
                float height = pageSize.Height;
                PdfContentByte canvas = stamper.GetOverContent(pagesCount);
                for (int i = 0; i < pdfPathList.Count; i++)
                {
                    insertPdf = pdfPathList[i];

                    
                    //字体属性及大小
                    Font font = new Font(baseFont, insertPdf.fontnum);
                    //需要添加的文字
                    Phrase addName = new Phrase(insertPdf.textstr, font);
                    ColumnText.ShowTextAligned(canvas, Element.ALIGN_RIGHT, addName, insertPdf.xnum, insertPdf.ynum, 0);

                }



                stamper.Close();
                MessageBox.Show("添加成功");

            }  
        }
    }

   
}


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

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

相关文章

Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架

Pytest-Bdd vs Behave&#xff1a;选择最适合的 Python BDD 框架 Pytest BDD vs Behave&#xff1a;选择最适合的 Python BDD 框架BDD 介绍Python BDD 框架列表Python BehavePytest BDDPytest BDD vs Behave&#xff1a;关键区别Pytest BDD vs Behave&#xff1a;最佳应用场景结…

B站bilibili视频转文字字幕下载方法

本文将讲述介绍一种使用本地工具如何快速的下载B站的字幕为本地文本文件的方法。 通常获取B站字幕需要在浏览器中安装第三方插件&#xff0c;通过插件获取字幕。随着大模型&#xff0c;生成式AI&#xff0c;ChatGPT的应用&#xff0c;B站也提供了AI小助手对视频的内容进行总结…

ElasticSearch的自动补全功能(拼音分词器、自定义分词器、DSL实现自动补全查询、RestAPI实现自动补全查询)

文章目录 1. 什么是自动补全2. 拼音分词器2.1 初识拼音分词器2.2 下载拼音分词器2.3 安装拼音分词器2.4 测试拼音分词器 3. 自定义分词器3.1 拼音分词器存在的问题3.2 分词器&#xff08;analyzer&#xff09;的组成3.3 如何自定义分词器3.4 拼音分词器的可选参数3.5 配置自定义…

day12 接口测试 ——入门→精通→实战(1)

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、接口测试分类 1.1 内部接口&#xff1a; 1.2 外部接口&#xff1a; 2、目前接口架构设计 2.1、基于SOAP架构&#xff0c; 2.2、基于RPC架构&#xff0c; 2.3、基于RestFul架构&#xff0c; 2.3.1…

54、库卡机器人轴的软限位设置

步骤1&#xff1a;将用户组改为“专家”。 步骤2&#xff1a;点击“投入运行”----“售后服务”-----“软件限位开关” 步骤3&#xff1a;就可以针对每个轴修改对应的角度值&#xff0c;然后点击“保存”。

PHP+MySQL 学生信息管理系统

目录 MySQL建表指令 主页面展示 主页面源代码如下 增&#xff1a;添加学生信息 添加html如下 html&#xff1a;主要用于显示网页内容 成功添加后回显 ​编辑 增加php如下 删&#xff1a;删除学生信息 删除html如下 成功删除后回显 删除php如下 改&#xff1a;修改学…

【第三节】Git 基本操作指南

目录 前言 一、获取与创建项目 1.1 git init 1.2 git clone 二、基本快照操作 2.1 git add 2.2 git status 2.3 git diff 2.4 git commit 2.5 git reset HEAD 三、 文件管理 3.1 git rm 3.2 git mv 四、Git 文件状态 5.1 工作目录 5.2 暂存区 5.3 本地仓库 5…

【第六节】Git Flow:分支管理模型与工作流程

一、Git Flow 简介 1.1 什么是 Git Flow Git Flow 是一种基于 Git 的分支管理模型&#xff0c;旨在帮助团队更好地管理和发布软件。它由 Vincent Driessen 在 2010 年提出&#xff0c;通过一套标准的分支命名和工作流程&#xff0c;使开发、测试和发布过程更加有序和高效。不过…

Windows 与 Linux 下 Ping IPv6 地址 | 常用网络命令

注&#xff1a;本文为网络命令相关文章合辑。 未整理去重。 一、IPv6 概述 IPv6 即 “Internet 协议版本 6”&#xff0c;因 IPv4 地址资源面临耗尽问题而被引入以替代 IPv4。IPv6 则提供了理论上多达 2 128 2^{128} 2128 个地址&#xff0c;有效解决地址不足困境。 IPv6 具…

GB28181系列三:GB28181流媒体服务器ZLMediaKit

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、ZLMediaKit介绍 二、 ZLMediaKit安装、运行(Ubuntu) 1、安装 2、运行 3、配置 三、ZLMediaKit使用 一、ZLMediaKit介绍 ZLMediaKit是一个基于C11的高性能运营级流媒体服务框架&#xff0c;项目地址&#xf…

【深度学习】深刻理解Swin Transformer

Swin Transformer 是一种基于 Transformer 的视觉模型&#xff0c;由 Microsoft 研究团队提出&#xff0c;旨在解决传统 Transformer 模型在计算机视觉任务中的高计算复杂度问题。其全称是 Shifted Window Transformer&#xff0c;通过引入分层架构和滑动窗口机制&#xff0c;S…

uniCloud云开发视频教程-从基础入门到项目开发实战-uniapp进阶课文章管理系统(云函数/云数据库/云存储)

大家好&#xff0c;我是爱搞知识的咸虾米。 今天给大家带来一门uniCloud基础入门到项目开发实战的课程。 视频学习地址&#xff1a;https://www.bilibili.com/video/BV1PP411E7qG/ 开始学习这门课之前&#xff0c;最好先学习一下uniapp零基础入门这套课&#xff0c;相信很多同…

GLB格式转换为STL格式

GLB与STL格式简介 GLB格式 GLB代表“GL传输格式二进制文件”&#xff08;GL Transmission Format Binary&#xff09;。GLB主要用于共享3D数据&#xff0c;包含三维模型、场景、光源、材质、节点层次和动画等详细信息&#xff0c;是一种标准化的文件格式&#xff0c;适用于多…

Qt编译MySQL数据库驱动

目录 Qt编译MySQL数据库驱动 测试程序 Qt编译MySQL数据库驱动 &#xff08;1&#xff09;先找到MySQL安装路径以及Qt安装路径 C:\Program Files\MySQL\MySQL Server 8.0 D:\qt\5.12.12 &#xff08;2&#xff09;在D:\qt\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql下…

MySQL通过binlog日志进行数据恢复

记录一次阿里云MySQL通过binlog日志进行数据回滚 问题描述由于阿里云远程mysql没有做安全策略 所以服务器被别人远程攻击把数据库给删除&#xff0c;通过查看binlog日志可以看到进行了drop操作&#xff0c;下面将演示通过binlog日志进行数据回滚操作。 1、查询是否开始binlog …

如何在 Ubuntu 22.04 上安装和使用 Rust 编程语言环境

简介 Rust 是一门由 Mozilla 开发的系统编程语言&#xff0c;专注于性能、可靠性和内存安全。它在没有垃圾收集的情况下实现了内存安全&#xff0c;这使其成为构建对性能要求苛刻的应用程序&#xff08;如操作系统、游戏引擎和嵌入式系统&#xff09;的理想选择。 接下来&…

前端项目初始化搭建(二)

一、使用 Vite 创建 Vue 3 TypeScript 项目 PS E:\web\cursor-project\web> npm create vitelatest yf-blog -- --template vue-ts> npx > create-vite yf-blog --template vue-tsScaffolding project in E:\web\cursor-project\web\yf-blog...Done. Now run:cd yf-…

生活小妙招之UE CaptureRT改

需求&#xff0c;四个不同的相机拍摄结果同屏分屏显示 一般的想法是四个Capture拍四张RT&#xff0c;然后最后在面片/UI上组合。这样的开销是创建4张RT&#xff0c;材质中采样4次RT。 以更省的角度&#xff0c;想要对以上流程做优化&#xff0c;4个相机拍摄是必须的&#xff…

【AIGC进阶-ChatGPT提示词副业解析】探索生活的小确幸:在平凡中寻找幸福

引言 在这个快节奏的现代社会中,我们常常被各种压力和焦虑所困扰,忘记了生活中那些细小而珍贵的幸福时刻。本文将探讨如何在日常生活中发现和珍惜那些"小确幸",以及如何通过尝试新事物来丰富我们的生活体验。我们还将讨论保持神秘感和期待感对于维持生活乐趣的重要性…

C#编程报错- “ComboBox”是“...ComboBox”和“...ComboBox”之间的不明确的引用

1、问题描述 在学习使用C#中的Winform平台编写一个串口助手程序时&#xff0c; 在编写一个更新ComboBox列表是遇到了问题&#xff0c;出错的代码是 2、报错信息 CS1503 参数 2: 无法从“System.Windows.Forms.ComboBox”转换为“System.Windows.Forms.ComboBox” CS1503 …