前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#实战:实现Excel单行转Word工具

C#实战:实现Excel单行转Word工具

原创
作者头像
IT技术分享社区
发布2024-04-18 08:33:26
2911
发布2024-04-18 08:33:26
举报
文章被收录于专栏:C#实战C#实战

在日常办公过程中,我们时常会遇到这样一种需求:需要将Excel表格中的每一行数据独立转换为一个Word文档。面对成百上千行的数据量时,如果采取逐一手动处理的方式,不仅耗时费力,效率低下,而且容易出错。因此,为了提升工作效率,减少不必要的人工操作,我特别设计并开发了一个便捷的小工具,它能够自动化地实现Excel数据到Word文件的批量转换功能,极大地简化了这一繁琐的过程,为我们的工作带来了极大的便利。

一、 功能介绍

根据规定好的Excel格式,通过模板的方式实现逐行读取创建Word文件,支持每行生成一个word文件或者合并生成一个word文件。大家可以根据自己的需要调整模板进行定制开发。如果对你有帮助的话,帮忙点个star。

Gitee地址:https://gitee.com/hgm1989/excel-to-word-tools

二、 使用技术

  • 编程语言:C#
  • 框架:NetFrameWork4.5
  • 应用框架:WinForm
  • Excel读取:NPOI框架实现Excel读取
  • Word生成:DocX框架实现Word文档的创建

三、框架介绍

2.1 NPOI框架

NPOI是一个.NET平台上的开源项目,用于操作Microsoft Office格式文件(如Word、Excel、PowerPoint等)。NPOI提供了一组.NET类库,使开发人员能够在.NET应用程序中读取、写入和操作Office文档,而无需安装Microsoft Office软件。NPOI支持多种Office文件格式,包括XLS(Excel 97-2003)、XLSX(Excel 2007及以上)、DOC(Word 97-2003)、DOCX(Word 2007及以上)等。NPOI具有丰富的功能和灵活性,可以实现对Office文档的读取、写入、修改以及生成等操作。通过NPOI,开发人员可以轻松地处理和操作Office文档,为.NET应用程序的开发提供了便利性和可扩展性。

Github:https://github.com/nissl-lab/npoi

2.2 DocX框架

DocX 是一个.NET库,用于生成和操作 Microsoft Word 文档(.docx 格式)。DocX 提供了丰富的功能,使开发人员可以在.NET应用程序中轻松地创建、读取、修改和保存 Word 文档。

官网:https://docx.js.org/#/

DocX功能介绍

● 简单易用:DocX 提供了直观的 API,使得操作 Word 文档变得简单而直观,无需深入了解 Word 文档的底层结构。

● 支持多种操作:支持创建新的 Word 文档、读取现有文档的内容、修改文档的样式和内容,以及保存修改后的文档。

● 丰富的功能:DocX 支持插入文本、图片、表格、超链接等元素到Word文档中,可以设置段落样式、字体样式、对齐方式等。

● 保持样式:DocX 可以保持文档中的样式不变,包括字体、颜色、对齐方式等,确保生成的文档与原始文档保持一致。

● 跨平台兼容:生成的 Word 文档是基于 Open XML 格式的,保证了文档打开或者编辑的跨平台兼容性。

四、实现思路

创建Word模板→读取Excel(Excel文档要定义好规则)→循环遍历每一行Excel数据填充模板→生成Word文档

五、关键代码

下面是针对读取excel合并生成一个word的代码

代码语言:javascript
复制
  using (FileStream file = new FileStream(txtFilePath.Text, FileMode.Open, FileAccess.Read))
            {
                IWorkbook workbook = new HSSFWorkbook(file); // 使用 XSSFWorkbook 读取.xlsx格式的文件
                ISheet sheet = workbook.GetSheetAt(0); // 获取第一个工作表

                int rowCount = sheet.LastRowNum + 1;
                DateTime now = DateTime.Now;
                int year = now.Year;
                int month = now.Month;
                int days = now.Day;
                // 循环保存文档
                string templatePath = "template.docx";
                string outputPath = txtOutPath.Text;
                if (!Directory.Exists(outputPath))
                {
                    Directory.CreateDirectory(outputPath);
                }
                // 创建新的Word文档  
                DocX wordDocument = DocX.Create(outputPath + "合并后.docx");
               
                for (int i = 0; i < rowCount; i++)
                {
                    IRow row = sheet.GetRow(i);
                    if (row != null)
                    {                        
                                    
               
                        int colCount = row.LastCellNum;
                        // 打开模板文件
                        using (DocX templateDoc = DocX.Load(templatePath))
                        {
                            // 替换模板中的占位符
                            if (row.GetCell(0) == null)
                            {
                                continue;
                            }
                            templateDoc.ReplaceText("{商铺名称}", row.GetCell(0).ToString());
                            templateDoc.ReplaceText("{年}", year.ToString());
                            templateDoc.ReplaceText("{月}", month.ToString());
                            templateDoc.ReplaceText("{日}", days.ToString());

                            templateDoc.ReplaceText("{店铺位置}", row.GetCell(1).ToString());
                            templateDoc.ReplaceText("{抄表起数}", row.GetCell(2).ToString());
                            templateDoc.ReplaceText("{抄表止数}", row.GetCell(3).ToString());
                            templateDoc.ReplaceText("{实际用电}", row.GetCell(4).ToString());
                            templateDoc.ReplaceText("{用电倍率}", row.GetCell(5).ToString());
                            templateDoc.ReplaceText("{本期用电度数}", row.GetCell(6).ToString());
                            templateDoc.ReplaceText("{电费单价}", row.GetCell(7).ToString());
                            string str = row.GetCell(8).ToString();
                            if (string.IsNullOrWhiteSpace(str))
                            {
                                int fee = (int)Math.Round(Convert.ToDouble(str));
                                templateDoc.ReplaceText("{本期电费}", fee.ToString());
                            }
                            else
                            {
                                templateDoc.ReplaceText("{本期电费}", row.GetCell(8).ToString());
                            }
                            wordDocument.InsertDocument(templateDoc);
                          
                        }
                    }
                  
                }
                wordDocument.Save();
                MessageBox.Show("批量生成Word成功");
            }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、 功能介绍
  • 二、 使用技术
  • 三、框架介绍
    • 2.1 NPOI框架
      • 2.2 DocX框架
      • 四、实现思路
      • 五、关键代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com