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

目录

应用场景

设计约定

范例运行环境

配置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.hqwc.cn/news/557499.html

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

相关文章

Java代码基础算法练习-求一个三位数的各位平方之和-2024.03.21

任务描述&#xff1a; 输入一个正整数n&#xff08;取值范围&#xff1a;100<n<1000&#xff09;&#xff0c;然后输出每位数字的平方和。 任务要求&#xff1a; 代码示例&#xff1a; package march0317_0331;import java.util.Scanner;public class m240321 {public …

GESP图形化编程二级认证真题 2024年3月

GESP 图形化二级试卷 &#xff08;满分&#xff1a;100 分 考试时间&#xff1a;120 分钟&#xff09; 一、单选题&#xff08;共 10 题&#xff0c;每题 3 分&#xff0c;共 30 分&#xff09; 1、小杨的父母最近刚刚给他买了一块华为手表&#xff0c;他说手表上跑的是鸿…

第4关:创建工程项目表J,并插入数据

任务描述 工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。创建工程项目表J(JNO,JNAME,CITY)&#xff0c;并在J表中插入下图数据。 相关知识 1、MySQL创建表的基本语法如下&#xff1a; 其中&#xff0c;table_name 是要创建的表的名称&…

使用Go语言创建HTTP服务器并展示网页

使用Go语言创建一个简单的服务器时可以先建立一个项目根目录&#xff0c;随后在根目录中建立一个用于存放静态文件&#xff08;HTML/CSS/JavaScript&#xff09;的文件夹 GGboy&#xff0c;接下来输入命令初始化Go模块 go mod init GGboy // 项目名称是 GGboy 在出现 go.mod 文…

【Linux】如何关闭 swappiness ?

1、关闭 swappiness 查看 swappiness 的当前值&#xff1a; sysctl vm.swappiness cat /proc/sys/vm/swappiness cat /sys/fs/cgroup/memory/memory.swappiness永久关闭&#xff1a; echo vm.swappiness 0 >> /etc/sysctl.conf临时关闭&#xff1a; sysctl vm.swapp…

NCV5104DR2G中文资料规格书PDF数据手册引脚图图片价格产品概述产品功能引脚

产品概述&#xff1a; NCP5104是一款高压功率栅极驱动器&#xff0c;提供两个输出&#xff0c;用于直接驱动 2 个半桥配置的 N 沟道功率 MOSFET 或 IGBT。 它使用自举技术来确保正确驱动高端电源开关。 产品特性&#xff1a; 高压范围&#xff1a;高达 600 VdV/dt 抗扰度 5…

Qt登录页面

#include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget) {ui->setupUi(this);//接收动图QMovie *mv new QMovie(":/pictrue/luori.gif");ui->loglab->setMovie(…

探索多视角驱动的层次内容感知网络用于指静脉识别

文章目录 探索多视角驱动的层次内容感知网络用于指静脉识别总结摘要介绍相关工作多视角方法长短时记忆基于视角的目标表达 方法全局主干网络局部感知模块损失函数 实验和分析数据库实验设置和训练策略消融实验视角一致性的效果 参考文献 论文: Exploiting Multiperspective Dr…

【C++】多态 (上)

在实际生活中我们也经常见到多态的例子&#xff0c;多态就是不同的对象完成同一个行为时会产生不同的状态&#xff0c;比如成人和儿童购票就是不一样的&#xff0c;多态是可以基于继承的&#xff0c;我们本篇博客的多态就是基于继承的&#xff0c;下面我们先看一个简单例子 cla…

C语言内存函数之 memcpy和memmove函数

memcpy函数的记忆方法&#xff1a;mem表示内存类函数&#xff0c;属于头文件string.h里面的函数。cpy是copy的缩写&#xff0c;表示对内存数据进行拷贝。 memcpy函数的输入值和返回值&#xff1a;void* my_memcpy(void*brr,void*arr,size_t v) memcpy的输入值分别是被拷贝数…

电子考试信息软件系统设计

1 整体设计 融机改与人改、出题、答题、图表浏览、下载为一体。 每课十套试卷。随机抽题形成试卷&#xff0c;选项顺序随机打乱。 云端分布微服体系架构&#xff0c;非关系文档数据库支撑&#xff0c;合理编码数据表关联。 神禹网关调度&#xff0c;NACOS监护。 负载均衡与…

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

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