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.rhkb.cn/news/321647.html

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

相关文章

ZooKeeper以及DolphinScheduler的用法

目录 一、ZooKeeper的介绍 数据模型 ​编辑 操作使用 ①登录客户端 ​编辑 ②可以查看下面节点有哪些 ③创建新的节点&#xff0c;并指定数据 ④查看节点内的数据 ⑤、删除节点及数据 特殊点&#xff1a; 运行机制&#xff1a; 二、DolphinScheduler的介绍 架构&#…

FreeBSD RISCV 在QEME中实践-网络配置

在前一篇文章中&#xff0c;我们一起进行了FreeBSD RISCV 在QEME中实践 现在&#xff0c;让我们配置好网络吧&#xff01; 先上结论&#xff1a;用默认配置启动即可&#xff0c;网络就加载好了&#xff0c;只是不能ping罢了。因为不能ping&#xff0c;以为网络没通&#xff0…

php使用服务器端和客户端加密狗环境部署及使用记录(服务器端windows环境下部署、linux环境宝塔面板部署、客户端部署加密狗)

php使用服务器端和客户端加密狗环境部署及使用记录 ViKey加密狗环境部署1.windows环境下部署开发文档验证代码提示Fatal error: Class COM not found in 2.linux环境下部署&#xff08;宝塔面板&#xff09;开发文档验证代码提示Fatal error: Uncaught Error: Call to undefine…

软胶囊弹性检测:确保药品质量与患者安全的关键步骤

软胶囊弹性检测&#xff1a;确保药品质量与患者安全的关键步骤 在医药领域&#xff0c;软胶囊作为一种常见的药物载体&#xff0c;其质量的优劣直接关系到药物的有效性和患者的安全。软胶囊的弹性作为其质量评估的重要指标之一&#xff0c;不仅影响其储存和运输的稳定性&#x…

校园论坛系统基于PHP的校园管理系统毕设校园好感度系统 校园文化建设系统APP小程序H5前后端源码交付支持二开,一次付款,终生使用

APP小程序H5前后端源码交付&#xff0c;支持二开&#xff0c;一次付款&#xff0c;终身使用&#xff0c;免费更新系统本身源码。 校园社交网络系统开发是一个复杂且综合性的项目&#xff0c;旨在为学生、教师和管理人员提供一个互动、分享和交流的平台。以下是一个关于校园社交…

C语言 联合和枚举

目录 1. 联合体1.1 联合体类型的声明1.2 联合体变量的创建1.3 联合体的特点1.4 联合体在内存中的存储1.5 联合体使用举例 2. 枚举类型2.1 枚举类型的声明2.2 枚举变量的创建和初始化2.3 枚举类型的大小2.4 枚举类型的优点 正文开始 上次我们通过《C语言 结构体详解》学习了结构…

在拥有多个同名称密码的ap环境中,如何连接到指定信道或mac的ap路由器?

在给客户做ESP32-C3入墙开关项目时&#xff0c;客户问&#xff1a;在拥有多个同名称密码的ap环境中&#xff0c;如何连接到指定信道或mac的ap路由器&#xff1f;针对这个问题&#xff0c;启明云端工程师给出下面解决方法。 1、将wifi_sta_config_t配置中的channel配置为该信道…

GZIP文件格式解析和Inflate静态Huffman解压缩

GZIP是封装了Deflate压缩的格式文件&#xff1b;Deflate使用了无压缩、HuffmanLZ77进行压缩&#xff1b;解压是Inflate&#xff0c;Huffman包括静态Huffman压缩和动态Huffman压缩两种模式。 Java语言实现了GZIP格式解析、Inflate的静态Huffman解压缩、CRC32校验 算法。 gzip文…

使用Maven对Java独立应用程序进行编译打包

一、 安装Maven 1.解压&#xff0c;移动安装包 sudo tar -zxf ~/apache-maven-3.9.6-bin.tar.gz -C /usr/local/ cd /usr/local/ sudo mv apache-maven-3.9.6/ ./maven-3.9.6 sudo chown -R qiangzi ./maven-3.9.6 二、Java应用程序代码 1.版本信息&#xff1a; Spark-2.1…

jsp校园商城派送系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 校园商城派送系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用serlvetdaobean mvc 模式&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8.…

Leetcode—2079. 给植物浇水【中等】

2024每日刷题&#xff08;130&#xff09; Leetcode—2079. 给植物浇水 实现代码 class Solution { public:int wateringPlants(vector<int>& plants, int capacity) {int ans 0;int step 0;int cap capacity;bool flag false;for(int i 0; i < plants.siz…

求知导刊-知网收录//旬刊//如何投稿?

求知导刊-知网收录//旬刊//如何投稿&#xff1f; 《求知导刊》栏目设置 理论探索、课堂教学、教改课改、教育管理、教师教育、教学案例、学科进展、学术论坛。 《求知导刊》征稿对象&#xff1a; 全国科技工作者、教育工作者&#xff0c;各级科技与教育部门的领导者以及管理…

一文读懂 SOLID 原则

大家好&#xff0c;我是孔令飞&#xff0c;字节跳动云原生开发专家、前腾讯云原生技术专家、云原生实战营 知识星球星主、《企业级 Go 项目开发实战》作者。欢迎关注我的公众号【令飞编程】&#xff0c;Go、云原生、AI 领域技术干货不错过。 在 Go 项目开发中&#xff0c;你经常…

北邮22级信通院DSP:实验三(1):FFT变换、IFFT变换(附每步8点变换蝶形图)保姆级讲解+用C++程序实现复数域的FFT变换和IFFT变换+C++中的chrono头文件讲解

北邮22信通一枚~ 跟随课程进度更新北邮信通院DSP的笔记、代码和文章&#xff0c;欢迎关注~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院DSP_青山入墨雨如画的博客-CSDN博客 目录 一、预备知识 1.1 FFT算法 1.2.1由DFT到FFT 1.2.2 基2时域抽选算法 …

Spring+Vue的卓越托管中心管理系统的设计与实现+PPT+论文+讲解+售后

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低运营人员成本&#xff0c;实现了卓越托管中心管理系统的标准化、制度化、程序化的管理&#xff0c;有效地防止了卓越托管中心管理系统的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能…

【LAMMPS学习】八、基础知识(5.11)磁自旋

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

最新版Ceph( Reef版本)块存储简单对接k8s

当前ceph 你的ceph集群上执行 1.创建名为k8s-rbd 的存储池 ceph osd pool create k8s-rbd 64 642.初始化 rbd pool init k8s-rbd3 创建k8s访问块设备的认证用户 ceph auth get-or-create client.kubernetes mon profile rbd osd profile rbd poolk8s-rbd部署 ceph-rbd-csi c…

Nginx配置Https缺少SSL模块

1、Linux下Nginx配置https nginx下载和安装此处就忽略&#xff0c;可自行百度 1.1、配置https 打开nginx配置文件 vim /opt/app/nginx/conf/nginx.conf相关https配置 server {listen 443 ssl; #开放端口server_name echarts.net;#域名#redirect to https#ssl on; #旧版#ssl证…

c#实现音乐的“vip播放功能”

文章目录 前言1. c#窗体2. 功能3. 具体实现3.1 添加文件3.2 音乐播放3.3 其他功能 4. 整体代码和窗口5. 依赖的第三方库 前言 最近在QQ音乐里重温周杰伦的歌&#xff0c;觉得好听到耳朵怀孕&#xff0c;兴起想要下载下来反复听&#xff0c;发现QQ音乐VIP歌曲下载下来的格式居然…

微信小程序 手机号授权登录

手机号授权登录 效果展示 这里面用的是 uni-app 官方的登录 他支持多端发布 https://zh.uniapp.dcloud.io/api/plugins/login.html#loginhttps://zh.uniapp.dcloud.io/api/plugins/login.html#login 下面是代码 <template><!-- 授权按钮 --><button v-if&quo…