C# 读取二维数组集合输出到Word预设表格

news2024/11/15 12:30:05

目录

应用场景

设计约定

范例运行环境

配置Office DCOM

实现代码

组件库引入

核心代码

DataSet转二维数组

导出写入WORD表格

调用举例

小结


应用场景

存储或导出个人WORD版简历是招聘应用系统中的常用功能,我们通常会通过应用系统采集用户的个人简历信息到数据库,许多情况下我们会读取数据记录导出到WORD文件中,以便汇总、打印。其中,WORD表格元素是经常会被用到的,比如问卷调查表格、教育经历表格、工作经历表格等等。

设计约定

1、设计WORD模板,在需要输出值的地方绘制表格,表格的数量对应输出的数据表数量。

2、根据条件查询数据表,生成 DataSet ,遍历 Tables ,生成对应的二维数组集合,将数据输出到对应的WORD表格中。

3、按约定,WORD表格的数量应该大于等于 DataSet 里的 Tables 数量。

4、按参数设定对应的WORD表格ID序号,如参数设定为2,则表示输出到WORD文件中的第二个表格中。(注意:WORD表格序号以1为开始)

在输出写入的方式中,我们约定有两种方式:

一为覆盖式写入(即已预知数据输出模式)举例如下图:

二为动态式写入(即未知数据行数量)举例如下图:

范例运行环境

操作系统: Windows Server 2019 DataCenter

操作系统上安装 Office Word 2016

数据库:Microsoft SQL Server 2016

.net版本: .netFramework4.7.1 或以上

开发工具:VS2019  C#

配置Office DCOM

配置方法可参照我的文章《C# 读取Word表格到DataSet》进行处理和配置。

实现代码

组件库引入

核心代码

DataSet转二维数组

public object[,] DataSetToObjectData(DataSet ds,int TableId,bool hastitle),该方法提供3个参数,DataSet数据集、指定表索引、导出是否包含标题列名称。

		public object[,] DataSetToObjectData(DataSet ds,int TableId,bool hastitle)
		{
			ArrayList rowdata = new ArrayList();
			int _fieldcount=ds.Tables[TableId].Columns.Count;
			Object[] colvalues = new Object[_fieldcount];
			for(int i=0;i<_fieldcount;i++)
			{
				colvalues[i]=ds.Tables[TableId].Columns[i].ColumnName;
			}
			if(hastitle)
				rowdata.Add(colvalues);
			for(int i=0;i<ds.Tables[TableId].Rows.Count;i++)
			{
				Object[] values = new Object[_fieldcount];
				values=ds.Tables[TableId].Rows[i].ItemArray;
				rowdata.Add(values);
				RowsCount++;
			}
			object[,] rv=new object[rowdata.Count,_fieldcount];
			for(int i=0;i<rowdata.Count;i++)
			{
				for(int j=0;j<_fieldcount;j++)
				{
					rv[i,j]=((object[])rowdata[i])[j];
				}
			}
			return rv;
		}
导出写入WORD表格

public string DataSetToWordTables(string _filename,int[,] _drawtype,object[] _datas),该方法提供3个参数,使用的WORD模板文件路径、写入配置(包括要写入的WORD表格ID,写入方式:0为覆盖;1为从第二行动态追加;3为从第一行动态追加)、对应的二维数组集合。

public string DataSetToWordTables(string _filename,int[,] _drawtype,object[] _datas)        {
            Object Nothing = System.Reflection.Missing.Value;
            object filename = _filename;
            //创建一个名为WordApp的组件对象
            Word.Application WordApp = new Word.Application();
            //创建一个名为WordDoc的文档对象
            WordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;

            Word.Document WordDoc = WordApp.Documents.Open(ref filename, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing);

            WordDoc.SpellingChecked = false;//关闭拼写检查

            WordDoc.ShowSpellingErrors = false;//关闭显示拼写错误提示框

				for(int i=_drawtype.GetLength(0)-1;i>=0;i--)
				{
					int _tableid=_drawtype[i,0];
					int _draw=_drawtype[i,1];
					object[,] r_datas=(object[,])_datas[i];
					int _rowscount=r_datas.GetLength(0);
                    if (_rowscount == 0)
                    {
                        WordDoc.Tables[_tableid].Delete();
                        continue;
                    }
                    int startrowid = 2;
                    if (_draw == 3)
                    {
                        startrowid = 1;
                    }
					if(_draw==1||_draw==3)
					{
						object _row=(object)WordDoc.Tables[_tableid].Rows[startrowid];
						for(int j=0;j<_rowscount-1;j++)
						{
							WordDoc.Tables[_tableid].Rows.Add(ref _row);

						}
					}
                    for (int k = 0; k < r_datas.GetLength(0); k++)
					{
						for(int m=0;m<r_datas.GetLength(1);m++)
						{
                            WordDoc.Tables[_tableid].Cell(k + startrowid, m + 1).Range.Text = r_datas[k, m].ToString();
                        }
					}
				}

			WordDoc.Save();
            WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);
			//关闭WordApp组件对象
			WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);
    return "";
}
调用举例

如下为示例代码:

string _filename=@"x:\test.docx";
int[,] _drawtype=new int[2,2];
_drawtype[0,0]=1;  //写入WORD第一个表格
_drawtype[0,1]=0;  //覆盖式写入

_drawtype[1,0]=2;  //写入WORD第二个表格
_drawtype[1,1]=1;  //动态追加行写入

object[] _datas=new object[2];
DataSet ds=getDataSet(); //获取DataSet对象
_datas[0]=DataSetToObjectData(ds,0,false); //获取DataSet Tables[0]的二维数组数据
_datas[1]=DataSetToObjectData(ds,1,false); //获取DataSet Tables[1]的二维数组数据

string result=DataSetToWordTables(_filename,_drawtype,_datas);  //写入Word表格        

小结

1、核心代码中对无数据的表格采取了删除WORD表格的操作。

2、预设表格的优点在于所见即所得,样式设计简单化,便于理解输出,我们还可以采用关键字定位并动态添加WORD表格的形式进行输出,来实现更加复杂的样式等。

3、核心代码中输出的起始行为第2行,根据设置也可以为第1行。如果我们设计的表格比较复杂(如包括合并单元格等),则可以对 _drawtype进行改造,增加一个参数,用于指定从第几行开始进行输出。

这些代码我们提供了一些操作WORD相关的关键方法,这里仅作参考,欢迎大家评论指教!

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

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

相关文章

网络通信——IP地址、端口号、协议(TCP、UDP)

通信架构 网络通信三要素 IP地址 IPv4地址 IPv6地址 IP域名 IP常识 端口号 概念 协议 开放式网络互联标准&#xff1a;OSI、TCP/IP 传输层的2个通信协议——UDP、TCP TCP协议&#xff1a;三次握手建立建立可靠连接 进行三次握手的原因&#xff1a;为了确保客户端和服务端…

jsp学习

1.新建文件&#xff0c;创建web动态项目 2.项目点击next两下&#xff0c;点击勾选gentear&#xff0c;点击finish 3.文件成功后是有jsp文件 4.在webapp新建jsp文件 5. 使用模板html5建立文件 <% page language"java" contentType"text/html; charsetUTF-8&qu…

【Flutter学习笔记】10.2 组合现有组件

参考资料&#xff1a; 《Flutter实战第二版》 10.2 组合现有组件 在Flutter中页面UI通常都是由一些低级别组件组合而成&#xff0c;当我们需要封装一些通用组件时&#xff0c;应该首先考虑是否可以通过组合其他组件来实现&#xff0c;如果可以&#xff0c;则应优先使用组合&…

Redis中的过期键删除策略

过期键删除策略 概述 数据库键的过期时间都保存在过期字典中&#xff0c;并且知道根据过期时间去判断一个键是否过期,剩下的问题是&#xff1a;如果一个键过期了&#xff0c;那么它什么时候会被删除呢? 这个问题有三种可能的答案&#xff0c;它们分别代表了三种不同的删除策…

阿里云国际该如何设置DDoS高防防护策略?

DDoS高防提供针对网络四层DDoS攻击的防护策略设置功能&#xff0c;例如虚假源和空连接检测、源限速、目的限速&#xff0c;适用于优化调整非网站业务的DDoS防护策略。在DDoS高防实例下添加端口转发规则&#xff0c;接入非网站业务后&#xff0c;您可以单独设置某个端口的DDoS防…

专题三 - 二分 - leetcode 704. 二分查找 | 简单难度

leetcode 704. 二分查找 leetcode 704. 二分查找 | 简单难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 704. 二分查找 | 简单难度 1. 题目详情 给定一个 n 个元素有序的&#xff08;升序&#x…

3.3网安学习第三阶段第三周回顾(个人学习记录使用)

本周重点 ①渗透测试介绍 ②sqlmap注入扫描工具 ③XSS脚本注入 本周主要内容 ①渗透测试介绍 一、渗透测试 通过模拟黑客对系统进行攻击的手段或技术&#xff0c;在被测系统中发现漏洞的行为。除了提供漏洞之外&#xff0c;还需提供安全意见。 与黑站不同&#xff0c;渗…

仿牛客项目Day10——统一异常处理、记录日志

统一异常处理 在controller里创建advice包&#xff0c;创建ExceptionAdvice类 这个注解括号里面是指只扫描被Controller标注的bean 请求request、响应response、异常exception 普通请求和异步请求的区别在于传的是json还是html吗&#xff1f; 统一记录日志 面向切面编程&…

2024/03/21(网络编程·day7)

一、思维导图 二、 //定义删除函数 int do_delete(sqlite3 *ppDb) {int del_numb0;printf("请输入要删除的学生的学号:");scanf("%d",&del_numb);getchar();//准备sql语句char sql[128]"select *from Stu";sprintf(sql,"delete from …

RocketMQ 流存储解析:面向流场景的关键特性与典型案例

作者&#xff1a;林清山&#xff08;隆基&#xff09; 前言&#xff1a; 从初代开源消息队列崛起&#xff0c;到 PC 互联网、移动互联网爆发式发展&#xff0c;再到如今 IoT、云计算、云原生引领了新的技术趋势&#xff0c;消息中间件的发展已经走过了 30 多个年头。 目前&…

蓝桥杯-模拟-纸张尺寸

题目 思路 代码 qlist(str(input())) numint(q[1]) x,y1189,841 while num:num-1x//2if x<y:x,yy,x print(x) print(y)

关于安卓调用文件浏览器(一)打开并复制

背景 最近在做一个硬件产品&#xff0c;安卓应用开发。PM抽风&#xff0c;要求从app打开文件浏览器&#xff0c;跳转到指定目录&#xff0c;然后可以实现文件复制粘贴操作。 思考 从应用开发的角度看&#xff0c;从app打开系统文件浏览器并且选择文件&#xff0c;这是很常见…

牛客小白月赛86(D剪纸游戏)

题目链接:D-剪纸游戏_牛客小白月赛86 (nowcoder.com) 题目描述: 输入描述: 输入第一行包含两个空格分隔的整数分别代表 n 和 m。 接下来输入 n行&#xff0c;每行包含 m 个字符&#xff0c;代表残缺纸张。 保证&#xff1a; 1≤n,m≤10001 字符仅有 . 和 * 两种字符&#xf…

代码随想录算法训练营 DAY 16 | 104.二叉树最大深度 111.二叉树最小深度 222.完全二叉树的节点个数

104.二叉树最大深度 深度和高度 二叉树节点的深度&#xff1a;指从根节点到该节点的最长简单路径边的条数或者节点数&#xff08;取决于深度从0开始还是从1开始&#xff09;二叉树节点的高度&#xff1a;指从该节点到叶子节点的最长简单路径边的条数或者节点数&#xff08;取…

按键模拟精灵

按键模拟精灵功能简单&#xff1a; 1.添加模拟按键 2.删除模拟按键 3.开始模拟 4.停止模拟 适合简单的按键操作&#xff0c;有需要的可以点赞收藏关注我&#xff01;

315晚会:虚假的水军是怎样形成的?又要如何破解?

随着互联网的普及和发展&#xff0c;网络信息的传播已经成为了现代社会中不可或缺的一部分。然而&#xff0c;随之而来的是网络舆论的泛滥和虚假信息的肆意传播&#xff0c;这使得网络治理变得尤为重要。 2024年的315晚会&#xff0c;央视曝光了一种新型的水军制造手段&#x…

DXF™ 格式对象和图元——cad vba

在 DXF™ 格式中&#xff0c;对象的定义与图元的定义不同&#xff1a;对象没有图形表示&#xff0c;而图元则有图形表示。例如&#xff0c;词典是对象而不是图元。图元也称为图形对象&#xff0c;而对象称为非图形对象。 第七段中humbnail image&#xff0c;即&#xff1a;缩略…

【智能算法】海洋捕食者算法(MPA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;Afshin Faramarzi 等人受到海洋生物适者生存启发&#xff0c;提出了海洋捕食者算法(Marine Predators Algorithm&#xff0c;MPA)。 2.算法原理 2.1算法思想 MPA根据模拟自然界…

图神经网络实战(2)——图论基础

图神经网络实战&#xff08;2&#xff09;——图论基础 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图和非加权图1.3 连通图和非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前…

户外水质检测显示屏用于检测并显示各种水质数据

水质检测一直是环境保护和公共卫生领域的重要课题。随着科技的不断进步&#xff0c;水质检测设备也在不断更新换代。其中&#xff0c;水质检测显示屏作为一种新型的检测设备&#xff0c;为监测和显示各种水质数据提供了便利和高效的手段。 水质检测显示屏是一种集成了传感器、数…