需求背景

因为疫情爆发,进入一级响应状态,公安部门进行了严格出入境管理,需要对每个出入境的人进行状态跟踪。

疫情专班会将出入境的每个人员汇总在一张Excel表中,如下图所示:

每一行对应一个人员信息,一个人员信息需要生成一个协查函,需要将人员信息填入到固定格式的协查函中,协查函的格式如下图所示:


功能实现

功能实现分成两个部分,一是从Excel读取数据,二是将读取的数据批量输出到Word文档。

从Excel读取数据使用NPOI,输出到word文档使用Microsoft Word Object Library.

NPOI可以在NuGet程序包中搜索到:

Microsoft Word Object Library.可以在类库中引用到。

考虑到速度,功能用winform程序实现。


实现效果

启动程序时:

选择Excel:

导入Excel:

导出到Word:

打开Word看看:

在开发之前需要对创建一个Word(dot格式)模板文件,内容格式很协查函一样,然后再需要插入数据的地方设置书签即可。


程序代码

ExcelHelp类用于将选中的Excel数据导入到datatable中。

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApp1
{public class ExcelHelp{/// <summary>/// 根据指定流文件将Excel导入到datatable中/// </summary>public virtual DataTable ExcelExportDataTable(){DataTable dt = new DataTable();OpenFileDialog fileDialog = new OpenFileDialog();fileDialog.Filter = "Excel文件|*.xls;*.xlsx";fileDialog.InitialDirectory = "E:\\";//设置默认打开路径if (fileDialog.ShowDialog() == DialogResult.OK){string fileName = fileDialog.FileName;//得到文件所在位置FileStream fs = new FileStream(fileDialog.FileName, FileMode.Open, FileAccess.Read);dt = ExcelToDataTable(fs, 0, 2);}return dt;}/// <summary>/// 将excel数据流中的数据转化为datatable/// </summary>/// <param name="ExcelFileStream">指定流文件</param>/// <param name="SheetIndex">导入sheet页页号</param>/// <param name="HeaderRowIndex">行标题行号</param>/// <returns></returns>private DataTable ExcelToDataTable(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex){//HSSFWorkbook workbook = new HSSFWorkbook(ExcelFileStream);//IWorkbook workbook = new HSSFWorkbook(ExcelFileStream);IWorkbook workbook = new XSSFWorkbook(ExcelFileStream);ISheet sheet = workbook.GetSheetAt(SheetIndex);DataTable table = new DataTable();/*手动构建列名*/IRow headerRow = sheet.GetRow(HeaderRowIndex);int cellCount = headerRow.LastCellNum;DataColumn columnNo = new DataColumn("No");table.Columns.Add(columnNo);DataColumn columnName = new DataColumn("Name");//姓名table.Columns.Add(columnName);DataColumn columnID = new DataColumn("ID");//身份证table.Columns.Add(columnID);DataColumn columnPhone = new DataColumn("Phone");//电话table.Columns.Add(columnPhone);DataColumn columnStreet = new DataColumn("Street");//电话table.Columns.Add(columnStreet);DataColumn columnXVillage = new DataColumn("XVillage");//行政村table.Columns.Add(columnXVillage);DataColumn columnZVillage = new DataColumn("ZVillage");//自然村table.Columns.Add(columnZVillage);DataColumn columnAddress = new DataColumn("Address");//具体地址table.Columns.Add(columnAddress);DataColumn columnDutyName = new DataColumn("DutyName");//责任人姓名table.Columns.Add(columnDutyName);DataColumn columnDutyPhone = new DataColumn("DutyPhone");//责任人电话table.Columns.Add(columnDutyPhone);DataColumn columnStatus = new DataColumn("Status");//管控状态table.Columns.Add(columnStatus);DataColumn columnBackTime = new DataColumn("BackTime");//返回封锁区时间table.Columns.Add(columnBackTime);DataColumn columnProvince = new DataColumn("Province");//省table.Columns.Add(columnProvince);DataColumn columnCity = new DataColumn("City");//市table.Columns.Add(columnCity);DataColumn columnCountry = new DataColumn("Country");//村table.Columns.Add(columnCountry);DataColumn columnAddress2 = new DataColumn("Address2");//具体地址table.Columns.Add(columnAddress2);/*构建datatable表体*/int firstRowNum = 3;//int rowCount = sheet.LastRowNum;for (int i = firstRowNum; i <= sheet.LastRowNum; i++){IRow row = sheet.GetRow(i);DataRow dataRow = table.NewRow();for (int j = row.FirstCellNum; j < cellCount; j++){if (row.GetCell(j) != null){dataRow[j] = row.GetCell(j).ToString();}}table.Rows.Add(dataRow);}ExcelFileStream.Close();workbook = null;sheet = null;return table;}}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Word;namespace WindowsFormsApp1
{public partial class Form1 : Form{public System.Data.DataTable table;public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){ExcelHelp eh = new ExcelHelp();table = eh.ExcelExportDataTable();dataGridView1.AllowUserToAddRows = false;dataGridView1.DataSource = table;if (table.Rows.Count == 0){MessageBox.Show("Excel中无数据!");return;}}private void button2_Click(object sender, EventArgs e){if (table == null){MessageBox.Show("请先选择Excel!");return;}int count = table.Rows.Count;//Microsoft.Office.Interop.Word._Application oWord;if (count > 0){for (int i = 0; i < count; i++){//创建一个Word应用程序实例Microsoft.Office.Interop.Word._Application oWord = new Microsoft.Office.Interop.Word.Application();object oMissing = System.Reflection.Missing.Value;//设置为不可见oWord.Visible = false;//模板文件地址,debug bin 目录下//object oTemplate = "E://template.dot";object oTemplate = System.Windows.Forms.Application.StartupPath + "\\template.dot";//以模板为基础生成文档Microsoft.Office.Interop.Word._Document oDoc = oWord.Documents.Add(ref oTemplate, ref oMissing, ref oMissing, ref oMissing);//声明书签数组object[] oBookMark = new object[8];//赋值书签名oBookMark[0] = "Name";oBookMark[1] = "ID";oBookMark[2] = "Phone";oBookMark[3] = "City";oBookMark[4] = "Country";oBookMark[5] = "Address2";oBookMark[6] = "MM";oBookMark[7] = "DD";//赋值数据到书签的位置string mm = DateTime.Now.Month.ToString();string dd = DateTime.Now.Day.ToString();oDoc.Bookmarks.get_Item(ref oBookMark[0]).Range.Text = table.Rows[i]["Name"].ToString();oDoc.Bookmarks.get_Item(ref oBookMark[1]).Range.Text = table.Rows[i]["ID"].ToString();oDoc.Bookmarks.get_Item(ref oBookMark[2]).Range.Text = table.Rows[i]["Phone"].ToString();oDoc.Bookmarks.get_Item(ref oBookMark[3]).Range.Text = table.Rows[i]["City"].ToString();oDoc.Bookmarks.get_Item(ref oBookMark[4]).Range.Text = table.Rows[i]["Country"].ToString();oDoc.Bookmarks.get_Item(ref oBookMark[5]).Range.Text = table.Rows[i]["Address2"].ToString();oDoc.Bookmarks.get_Item(ref oBookMark[6]).Range.Text = mm;oDoc.Bookmarks.get_Item(ref oBookMark[7]).Range.Text = dd;//导出的Word文件地址设置在 debug bin里的NewFile文件夹object path = System.Windows.Forms.Application.StartupPath + "\\NewFile\\" + filename + ".doc";oDoc.SaveAs(ref path, ref oMissing, ref oMissing, ref oMissing,ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,ref oMissing, ref oMissing);oDoc.Close(ref oMissing, ref oMissing, ref oMissing);//关闭word模板oWord.Quit(ref oMissing, ref oMissing, ref oMissing);}MessageBox.Show("导出成功,生成了" + count + "个文件!");}else{MessageBox.Show("Excel中无数据!");}}}
}

C#使用模板文件批量导出word文档相关推荐

  1. 【Python】批量导出word文档中的图片、嵌入式文件

    Python 批量导出word文档中的图片.嵌入式文件 需求 学生试卷中的题目有要提交截图的,也有要提交文件的,为了方便学生考试,允许单独交或者嵌入Word中提交,那么事后如何整理学生的答案?单独提交 ...

  2. C# 导出word文档及批量导出word文档(3)

    在初始化WordHelper时,要获取模板的相对路径.获取文档的相对路径多个地方要用到,比如批量导出时要先保存文件到指定路径下,再压缩打包下载,所以专门写了个关于获取文档的相对路径的类. 1 #reg ...

  3. C# 导出word文档及批量导出word文档(2)

    aspose.word主要是通过把读取出来的数据放到datatable里,在datable里做相应的格式的调整,再导出到word文档里.mvc和webform最后导出的语句略有不同,在mvc的cont ...

  4. 怎么样才可批量导出word文档中的照片 不再一张一张的另存为!

    再也不用一个一个的另存为啦. 果然,重复的操作都可以用计算机来解决! 点击另存为,格式选为HTML. 可以直接保存到桌面. 点击保存之后: (图片内容不是重点.) 原来的.doc文件就变成了.html ...

  5. Springboot 项目导出word文档(文档内容包括数据以及服务器图片)

    Springboot 项目freemarker导出word文档(文档内容包括数据以及服务器图片) 前些天有需求要完成导出word文档功能,基础数据导出word文档,网上也能搜到很多源代码,但是我这边要 ...

  6. Java 导出Word文档(含图片)doc格式 (保姆级)

    1.maven仓库 <!-- freemarker jar --><dependency><groupId>org.freemarker</groupId&g ...

  7. java调用word模板文件_Java使用模板导出word文档

    Java使用模板导出word文档 需要导入freemark的jar包 使用word模板,在需要填值的地方使用字符串代替,是因为word转换为xml文件时查找不到要填入内容的位置.尽量不要在写字符串的时 ...

  8. java-制作flt模板,导出word文档带图片循环

    java-制作flt模板,导出word文档带图片循环 模板制作 制作xml 编辑xml文档 将xml模板转换为flt 编写工具类 导出word工具类 获取远程图片 使用示例 使用示例--springb ...

  9. Excel转Word,Excel导出Word,利用Excel表批量生成Word文档,邮件合并进阶版

    单击播放视频教材 利用Excel数据批量生成Word文档升级版,Excel转W 01需求概述 假设有图1所示的数据,需要批量生成WORD成绩通知单,通知单必须遵循图2的样式. (案例中的姓名.学校名称 ...

最新文章

  1. static使用方法小结
  2. mac好用大java_好用,小个头大本事!Mac下轻量级清理软件。
  3. JSTL(JSP 标准标签库)和EL表达式联合使用时,进行字符的比较
  4. wxWidgets:wxDateSpan类用法
  5. BBC:乐在其中统计学 (2010)
  6. vbs创建目录,可循环创建父级目录
  7. Javascript 数组循环遍历之forEach
  8. 一个基于vue和element-ui的树形穿梭框组件
  9. 【原译】什么是TCHAR,WCHAR,LPSTR,LPWSTR,LPCTSTR.等等
  10. sql注入之——sqlmap教程
  11. 明月浩空html播放器,明月浩空音乐-绚丽彩虹|HTML5网站音乐播放器源码带后台-仅研究学习...
  12. 数据分析之A股市场技术分析是否可行
  13. 用Prolog解决爱因斯坦斑马问题
  14. WPS添加带背景颜色的文本框
  15. 【sql: 每天进步一点点】sql 中的 LIKE 用法
  16. Baumer工业相机堡盟工业相机如何通过BGAPISDK显示彩色相机和黑白相机的图像(C#)
  17. 黄金分割法 ( 三分法 )
  18. android连接和断开蓝牙音箱的问题
  19. 基于matlab 非局部均值(NLM)滤波图像去噪
  20. 条件极值(拉格朗日乘数法)_Simplelife_新浪博客

热门文章

  1. servlet的由来
  2. 查看某个文件是否正在被修改
  3. DM8168芯片级资源
  4. VS2008中对.Net 3.5 sp1程序打安装包的前提系统环境的配置
  5. 转换和编辑的sony的MTS硬盘摄像机格式文件。
  6. jquery级试题_JS-jQuery练习题面试题
  7. 485串口测试工具软件下载_串口调试助手详细讲解(结合实操),通讯问题不再是问题...
  8. java框架mybatis配置文件总结一
  9. confluence创建页面加载缓慢_树莓派4B使用docker安装confluence
  10. python小技巧积累--题库(持续更新)