C# 实现格式化文本导入到Excel

目录

需求

Excel 的文本文件导入功能

范例运行环境

配置Office DCOM

实现

组件库引入

OpenTextToExcelFile

代码

调用

小结


需求

在一些导入功能里,甲方经常会给我们一些格式化的文本,类似 CSV 那样的纯文本。比如有关质量监督的标准文件(如国家标准、地方标准、企业标准等),还有一此国际标准文件等等。提供给我们的这些文件是文件尺寸比较大的纯文本文件,文件内容是格式化的文本,具有规律的分隔字符。Excel 本身提供有导入文本文件的功能,但由于标准制定和发布是比较频繁,每次的导入与整理还是比较耗时的,因些实现文本文件导入到 Excel 的功能可以更快速的解决重复劳动和错误,实现流程自动化的一环。

Excel 的文本文件导入功能

我们运行 Excel ,点击选择打开文本文件时,会弹出一个导入向导,如下图:

 

 

如图我们需要选择合适的文本文件原始编码,输入分隔符,选择其它的选项,如连续的分隔符号视分单个处理等。下面我们将介绍如何利用 COM 来实现这一操作的自动化处理。 

范例运行环境

操作系统: Windows Server 2019 DataCenter

操作系统上安装 Office Excel 2016

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

开发工具:VS2019  C#

配置Office DCOM

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

实现

组件库引入

OpenTextToExcelFile

OpenTextToExcelFile方法返回 object[] 类型,object[0] 返回生成成功的 Excel 文件地址,object[1]返回错误信息,其实体为 string 类型。方法参数据说明见下表:

序号参数类型说明
1OpenFilestring打开的文本文件的绝对完整路径及名称。
2ExcelFilestring要生成的Excel文件完整路径地址。
3SplitCharstring分隔符
4ReplaceCharsstring[,]这是一个导入后数据整理型参数。一个二维数组,用于导入后替换相关字符的数组,第一维为查找字符串  ,第二维为要替换的字符串。
5ValidResultint这是一个检验型参数。指定有效的字段生成数,如果小于1则不进行判断,否则如果生成的最终列数与此值不符,则生成错误信息以示警告。
6ExtraSplitbool是否允许删除指定的一系列列值。
7Esplitsint[]当ExtraSplit为true时,些数据生效,如定义1、6、19列等。这些列的值将在Esplits参数数组中定义。Esplits数组的指定生效顺序在StartCol参数之后
8AddColsobject[,]

这是一个整理型参数。表示要添加几个固定列及固定值,维度包括3列,如object[0,0] 存储要写入的列id,object[0,1] 存储列id的标题值,object[0,2] 存储列id的值。示例如下:

object[0,0]=10;

object[0,1]="导入标志";

object[0,2]="是";  

9ref_maxcolidint指定在打开文本文件之后应该生成的最大的列,一般这个参数用于最后一列都为空的情况,因为这样EXCEL无法定位最后一个单元格,如果为0则忽略
10StartColint这是一个整理型参数。指定额外的删除列策略,默认值为1,表示不处理,<=0 则表示删除前几列。即 Math.Abs(StartCol) 个,默认步长为 1。
11offersetint与StartCol参数配合,默认值为1,表示删除步长。注意:改变此值会影响删除列的个数。
12originint文本文件的原始编码,默认为 65001,即UTF-8
13ConsecutiveDelimiterbool如果为 true,则将连续分隔符视为一个分隔符,如“##” 则视为“#”。 默认值为 false。

代码

方法完整代码如下:

/*本方法通过打开一个具有一定分隔格式的文本到EXCEL中,并且由EXCEL进行整理* openfile参数:打开的文件绝对完整路径及名称。splitchar参数:分隔符。ReplaceChars参数:一个二维数组,用于整理后替换相关字符的数组,第一维为查找字符串* ,第二维为要替换的字符串。allowtodataset参数:是否允许整理后生成一个dataset对象。ValidResult参数:指定有效的字段生成数,如果小于1则不进行判断,否则如果* 生成的最终列数与此值不符,则生成错误信息。StartCol参数:指定额外的分隔列策略,大于0为不处理。小于1则表示以最大列加上此值为基准行进行倒序删除,* 删除位移为offerset参数指定的数值。ExtraSplit参数:是否指定一系列列值进行删除,这些列可能是无规律的,如1、6、19列等。这些列的值将在Esplits参数数组中定义* 注意Esplits数组的指定生效顺序在StartCol参数之后,如果StartCol参数有效的话。obj_table参数:是否有目标参照表SQL语句返回的结果与文本列进行对应* XmlCfg 文件,如果您有XML配置文件,则可以忽略除openfile以外所有的参数传递,本函数将分析此配置文件的内容,如果分析失败则整个函数将失败*ref_maxcolid,由用户指定在打开文本文件之后应该生成的最大的列,一般这个参数用于最后一列都为空的情况,因为这样EXCEL无法定位最后一个单元格,如果为0则跳过
*/
public object[] OpenTextToExcelFile(string OpenFile, string SplitChar, string[,] ReplaceChars, int ValidResult, bool ExtraSplit, int[] Esplits, object[,] AddCols, int ref_maxcolid, int StartCol = 1, int offerset = 1)
{object[] rv = new object[4];rv[0] = ""; //存储返回生成的EXCEL文件rv[1] = ""; //返回错误信息或附加的信息rv[2] = null;rv[3] = "";try{//创建EXCEL应用对象ExcelApplication excel = new ExcelApplication();Workbooks workbook = excel.Workbooks;object[,] dlist = new object[ref_maxcolid, 2];for (int i = 0; i < ref_maxcolid; i++){dlist[i, 0] = i + 1;dlist[i, 1] = Excel.XlColumnDataType.xlTextFormat;}workbook.OpenText(OpenFile, 20936, 1, Excel.XlTextParsingType.xlDelimited,Excel.XlTextQualifier.xlTextQualifierDoubleQuote, false, false, false, false, false, true, SplitChar,dlist,Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);Excel.Range _range;int maxcolid = excel.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Column;if (ref_maxcolid > 0){maxcolid = ref_maxcolid;}int maxrowid = excel.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Row;int _addcol = 0;if (AddCols != null){_addcol = AddCols.GetLength(0);}int delcount = 0;if (StartCol <= 0){for (int i = (maxcolid + StartCol); i >= 1; i -= offerset){_range = excel.get_Range(excel.Cells[1, i], excel.Cells[65536, i]);_range.Select();_range.Delete(Type.Missing);delcount++;}}if ((ExtraSplit) && (Esplits != null)){for (int j = 0; j < Esplits.GetLength(0); j++){int colid = Esplits[j];_range = excel.get_Range(excel.Cells[1, colid], excel.Cells[65536, colid]);_range.Select();_range.Delete(Type.Missing);delcount++;}}if ((ValidResult > 0) && ((maxcolid - delcount + _addcol) != ValidResult)){rv[1] = "生成的最终数据结果与指定的列数目不符合。\r\n用户指定的有效列为:" +ValidResult.ToString() + "\r\n系统生成的列:" + (maxcolid - delcount).ToString() + "附加的列:" + _addcol.ToString() +"\r\n系统检测到的最大列:" + maxcolid.ToString(); //返回错误信息return rv;}//创建模板的映像解析文件,最终以变量 desfilename 为输出对象FileEx commonApi = new FileEx();string _file = "", _path = "";_path = Path.GetDirectoryName(OpenFile);if (_path.Length > 3){_path += "\\";}_file = Path.GetFileNameWithoutExtension(OpenFile);string _validfilename = commonApi.GetValidFileName(_path, _file, ".xlsx");string _lastfile = _path + _validfilename;rv[0] = _lastfile;if (File.Exists(_lastfile)){File.Delete(_lastfile);}Worksheet worksheet = (Worksheet)excel.ActiveSheet;//解决替换字符的要求if (ReplaceChars != null){for (int i = 0; i < ReplaceChars.GetLength(0); i++){string _find = ReplaceChars[i, 0], _rep = ReplaceChars[i, 1];worksheet.Cells.Replace(_find, _rep, Excel.XlLookAt.xlPart, Excel.XlSearchOrder.xlByRows, false, false, false, false);}}_range = excel.get_Range(excel.Cells[1, 1], excel.Cells[1, 1]);_range.EntireRow.Insert(Type.Missing, Type.Missing);if (AddCols != null){int ref_col = 0;string ref_fname = "", ref_fvalue = "";Excel.Range _newrange;for (int ad = 0; ad < AddCols.GetLength(0); ad++){ref_col = (int)AddCols[ad, 0];ref_fname = AddCols[ad, 1].ToString();ref_fvalue = AddCols[ad, 2].ToString();_range = excel.get_Range(excel.Cells[1, ref_col], excel.Cells[1, ref_col]);_range.EntireColumn.Insert(Type.Missing, Type.Missing);//						ref_col=_newrange.Column;excel.Cells[1, ref_col] = ref_fname;if (maxrowid > 0){excel.Cells[2, ref_col] = ref_fvalue;_newrange = excel.get_Range(excel.Cells[2, ref_col], excel.Cells[2, ref_col]);_newrange.Copy(excel.get_Range(excel.Cells[2, ref_col], excel.Cells[maxrowid + 1, ref_col]));}}}worksheet.SaveAs(@_lastfile, Excel.XlFileFormat.xlAddIn, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);excel.ActiveWorkbook.Close(false, Type.Missing, Type.Missing);excel.Quit();rv[1] = "准备数据成功,共有记录" + maxrowid.ToString() + "行。字段" + (maxcolid - delcount + _addcol).ToString() + "列。";}catch (Exception e){rv[0] = "";rv[1] = e.Message;}return rv;
}

调用

调用示例代码如下:

string splitchar = "#";
int validResult = 4;
int origin = 65001;  //utf-8
bool ConsecutiveDelimiter=true; //如果为 true,则将连续分隔符视为一个分隔符,如“##” 则视为“#”
object[,] AddCols = new object[1, 3];
AddCols[0,0]=4;
AddCols[0,1]="导入标志";
AddCols[0,2] = "是";object[] rv2 = OpenTextToExcelFile("d:\\std.txt", "d:\\std.xls", splitchar, null, validResult, false, null, AddCols, 0, 1, 1, origin, ConsecutiveDelimiter);Response.Write("result:"+rv2[0] + "<br>" + rv2[1]);

导入的文本文件示例(以两个#号为分隔符)如下图:

 

 导入成功后如下图所示:

小结

1、OpenTextToExcelFile方法是一种兼容旧 EXCEL 版本的写法(如2003),我们可以根据实际需要进行改造。

2、许多参数是根据我们在使用过程中的实际需要而设置,以满足特殊需要,简化后期处理。

3、方法的核心是使用 EXCEL COM 的 OpenText 方法,关于该方法的详细介绍请参考如下链接:

https://learn.microsoft.com/zh-cn/office/vba/api/Excel.Workbooks.OpenText#parameters

4、原始文件的编码请参照本文Excel 的文本文件导入功能部分的图示所示,选择框中就是对应的编码代码,如65001表示UTF-8,这也是默认值。20936 则表示简体中文(GB2312-80)等等。

本方法仅做参考,感谢阅读,希望本文能够对您有所帮助。

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

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

相关文章

TCP/IP和HTTP协议

TCP/IP OSI 七层模型在提出时的出发点是基于标准化的考虑&#xff0c;而没有考虑到具体的市场需求&#xff0c;使得该模型结构复杂&#xff0c;部分功能冗余&#xff0c;因而完全实现 OSI 参考模型的系统不多。而 TCP/IP 参考模型直接面向市场需求&#xff0c;实现起来也比较…

一文掌握:Clipboard API ,让前端顺畅操作剪贴板,无论怎么复制,都显示你网站信息。

一、Clipboard API是什么 Clipboard API 是一个 Web API&#xff0c;它提供了一种在网页上读取和写入剪贴板内容的方式。通过 Clipboard API&#xff0c;网页可以访问用户的剪贴板&#xff0c;从中读取文本、图像或其他数据&#xff0c;并且可以将数据写入剪贴板&#xff0c;以…

计算机毕业设计python_django宠物领养系统z6rfy

本宠物领养系统主要包括两大功能模块&#xff0c;即管理员模块、用户模块。下面将对这两个大功能进行具体功能需求分析。 &#xff08;1&#xff09;管理员&#xff1a;管理员登录后主要功能包括个人中心、用户管理、送养宠物管理、地区类型管理、失信黑名单管理、申请领养管理…

封装umi-request时通过 AbortController 配置取消请求

一、关键部分 一、在封装的request.ts中 声明一个 abortControllers 对象用于存储要取消的请求&#xff08;我用了-s表示复数&#xff0c;多个abortcontroller对象&#xff0c;与下面&#x1f447;的单个abortController区分&#xff09;封装取消请求的函数cancelRequest, 传入…

038——基于STM32和I.MX6uLL实现uart控制GPS(失败者总结)

目录 1、GPS模块简介 2、GPS数据格式 3、方案梳理 1、GPS模块简介 全球定位系统(Global Positioning System&#xff0c; GPS)是一种以空中卫星为基础的高精度无线电导航的定位系统&#xff0c;它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间…

邦注科技 温控箱对企业的重要性

注塑加工是将加热的熔融塑料注入模具中形成所需产品的工艺过程。良好的注塑加工工艺需要控制好许多参数&#xff0c;其中最重要的因素之一就是模具的温度。模具温度的不稳定会导致产品尺寸大小、表面缺陷等方面的问题&#xff0c;甚至会导致生产不良品&#xff0c;加大生产成本…

【webrtc】MessageHandler 5: 基于线程的消息处理:以PeerConnection信令线程为例

peerconn的信令是通过post 消息到自己的信令线程消息来处理的PeerConnectionMessageHandler 是具体的处理器G:\CDN\rtcCli\m98\src\pc\peer_connection_message_handler.hMachinery for handling messages posted to oneself PeerConnectionMessageHandler 明确服务于 signalin…

数据仓库和数据仓库分层

一、数据仓库概念 数据仓库(Data Warehouse)&#xff0c;可简写为DW或DWH。数据仓库&#xff0c;是为企业所有级别的决策制定过程&#xff0c;提供所有类型数据支持的战略集合。它是单个数据存储&#xff0c;出于分析性报告和决策支持目的而创建。 为需要业务智能的企业&#…

CGAL 点云数据生成DSM、DTM、等高线和数据分类

原文链接 CGAL 点云数据生成DSM、DTM、等高线和数据分类 - 知乎 在GIS应用软件中使用的许多传感器(如激光雷达)都会产生密集的点云。这类应用软件通常利用更高级的数据结构&#xff1a;如&#xff1a;不规则三角格网 (TIN)是生成数字高程模型 (DEM) 的基础&#xff0c;也可以利…

2024深圳杯数学建模竞赛A题(东三省数学建模竞赛A题):建立火箭残骸音爆多源定位模型

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓&#xff08;浏览器打开&#xff09; https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 2024深圳杯数学建模竞赛A题&#xff08;东三省数学建模竞赛A题&#xff0…

PyVista 3D数据可视化 Python 库 简介 含源码

Pyvista是一个用于科学可视化和分析的Python库 &#xff1b;我认为它适合做一些网格数据的处理&#xff1b; 它封装了VTK&#xff08;Visualization Toolkit&#xff09;之上&#xff0c;提供了一些高级接口&#xff0c; 3D数据可视化变得更加简单和易用。 1.安装 pyvista&…

开发一个语音聊天社交app小程序H5需要多少钱?

社交&#xff0c;即时通讯APP系统。如何开发一个社交App||开发一个即时通信应用是一项复杂而充满挑战的任务&#xff0c;需要考虑多个技术、开发时间和功能方面的因素。以下是一个概要&#xff0c;描述了从技术、开发时间和功能角度如何开发这样的应用&#xff1a; 1. 技术要点…

70.网络游戏逆向分析与漏洞攻防-角色与怪物信息的更新-整理与角色数据更新有关的数据

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

基于python的舞蹈经验分享交流网站django+vue

1.运行环境&#xff1a;python3.7/python3.8。 2.IDE环境&#xff1a;pycharmmysql5.7/8.0; 3.数据库工具&#xff1a;Navicat11 4.硬件环境&#xff1a;windows11/10 8G内存以上 5.数据库&#xff1a;MySql 5.7/8.0版本&#xff1b; 运行成功后&#xff0c;在浏览器中输入&am…

新唐的nuc980/nuc972的开发3-官方源码编译

上一节中bsp已经安装&#xff0c;交叉环境已经搭建&#xff0c;理应就可以正常的编写上层的应用程序啦。 但是系统启动次序是- uboot-> kernel内核 ->挂载文件系统 ->上层应用程序 下面是bsp安装后的文件&#xff1a; 因此本章节&#xff0c;将讲解 uboot-> kerne…

刷代码随想录有感(51):从中序和后序前序和中序构造二叉树

中后题干&#xff1a; 第一步&#xff1a;如果数组大小为零的话&#xff0c;说明是空节点了。 第二步&#xff1a;如果不为空&#xff0c;那么取后序数组最后一个元素作为节点元素。 第三步&#xff1a;找到后序数组最后一个元素在中序数组的位置&#xff0c;作为切割点 第四…

Large Language Models for Test-Free Fault Localization

基本信息 这是24年2月发表在ICSE 24会议&#xff08;CCF A&#xff09;的一篇文章&#xff0c;作者团队来自美国卡内基梅隆大学。 博客创建者 武松 作者 Aidan Z.H. Yang&#xff0c;Claire Le Goues&#xff0c;Ruben Martins&#xff0c;Vincent J. Hellendoorn 标签 …

启明云端2.4寸屏+ESP32-S3+小型智能调速电动家用除草机案例 触控三档调速,能显示电压故障码

今天给大家分享个启明云端2.4寸屏ESP32-S3小型智能调速电动家用除草机案例&#xff0c;国外有草坪文化&#xff0c;这个机器能智能触控三档调速&#xff0c;带屏能显示电压故障码&#xff0c;数显档位&#xff08;3档最大&#xff09;&#xff0c;触控屏&#xff0c;长按3秒就能…

使用 langchain 连接 通义千问 并用 fastApi 开放接口

安装 langchain 方法 https://www.cnblogs.com/hailexuexi/p/18087602 安装 fastapi fastapi 是一个用于构建高性能 Web 应用的 Python 框架&#xff0c;它提供了简洁、高效的 API 开发体验。 pip install fastapi 安装 uvicorn uvicorn 是一个用于运行 FastAPI 应用的服务…

C语言学习/复习37--进阶总结与题目练习

一、题目练习 1. 循环与无符号char的取值范围 注意事项&#xff1a;0~255 -128~127 char类的取值范围看做循环图 2.ASCLL值与循环 3.按位操作与bit位 4 .结构体的大小 注意事项&#xff1a;结构体嵌套结构体的大小计算 5.循环条件 6.数据类型与原反补码 7.指针访问字符串数…