C#实现Excel合并单元格数据导入数据集

这篇具有很好参考价值的文章主要介绍了C#实现Excel合并单元格数据导入数据集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

功能需求

Excel与DataSet的映射关系

范例运行环境

Excel DCOM 配置

设计实现

组件库引入

​方法设计

返回值 

参数设计

打开数据源并计算Sheets

拆分合并的单元格

创建DataTable

将单元格数据写入DataTable

总结


功能需求

将Excel里的worksheet表格导入到DataSet里,是项目应用里常用的一种操作。一般情况下,worksheet是一个标准的二维数组,如下图:

C#实现Excel合并单元格数据导入数据集,微软Office计算中心,c#,excel,asp.net,.net

我们可以效仿 MS SQL SERVER 的一些基本导入选项,如首行是否包含数据,要导入哪个Sheet?还是遍历Sheets?

实际的情况,客户经常会提供一些合并单元格的Excel表格,如下图中的“所在部门名称”列:

C#实现Excel合并单元格数据导入数据集,微软Office计算中心,c#,excel,asp.net,.net

再畅想一下,假设有跨列的情况如下:

C#实现Excel合并单元格数据导入数据集,微软Office计算中心,c#,excel,asp.net,.net

解决导入,一种方法,是让客户进行单元格拆分或技术服务人员进行拆分后再导入。另一种就是我们要继续完善应用,处理实现合并单元格的自动化处理。

Excel与DataSet的映射关系

下图是 Excel 与 DataSet 的映射关系图:

1、Excel应用的Workbook对象与 DataSet 同为容器对象

2、Worksheets和Tables均代表各自的表集合

3、Worksheet与Table进行对应,产生和导入实际的数据

C#实现Excel合并单元格数据导入数据集,微软Office计算中心,c#,excel,asp.net,.net

范例运行环境

操作系统: Windows Server 2019 DataCenter

操作系统上安装 Office Excel 2016

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

开发工具:VS2019  C#

Excel DCOM 配置

请参考我的文章《C# 读取Word表格到DataSet》有对Office DCOM详细配置介绍,这里不再赘述,Excel的对应配置名称如下图所示:

C#实现Excel合并单元格数据导入数据集,微软Office计算中心,c#,excel,asp.net,.net

  

设计实现

组件库引入

C#实现Excel合并单元格数据导入数据集,微软Office计算中心,c#,excel,asp.net,.net

方法设计

设计  object[] ExcelAsDataSet(string _filename,bool hastitle,string startaddress,string endaddress) 方法

返回值 

方法返回object数组,共包括两个object对象,如果成功转化则 object[0] 存储 DataSet对象,否则为 null。如果不成功则 object[1] 存储string 错误信息对象,可根据object[1].ToString()!="" 来判断是否转化成功。

参数设计
  1. string _filename:Excel 数据源文件路径
  2. bool hastitle: 是否包含标题,如果设置为true,则表示首行数据为列名称定义
  3. string startaddress:可指定有效的起始单元格地址,不设置则默认为“A1”(即第一个单元格)
  4. string endaddress:可指定有效的截止单元格地址,不设置则默认为最后一个有值单元格(即XlCellType.xlCellTypeLastCell 枚举) 

    通过3、4参数的定义,可以定义出有效的导入矩形区域。

打开数据源并计算Sheets

			object[] rv=new object[2];
			rv[0]=null;
			rv[1]="";

			//创建一个名为ExcelApp的组件对象
//			ExcelApplication excel = new ExcelApplication();
            Excel.Application excel = new Excel.Application();
			excel.DisplayAlerts=false;
			excel.AskToUpdateLinks=false;
			Excel.Workbook xb=excel.Workbooks.Add(_filename);
//获取活动的 worksheet和 excel sheet的个数,准备遍历sheets
			Worksheet worksheet = (Worksheet) excel.ActiveSheet;
			sheetCount=excel.Sheets.Count;  
			int	startSheetIndex=1;
			int	endSheetIndex=sheetCount;
			DataSet ds=new DataSet();
//遍历sheets
            for (int currentIndex = startSheetIndex; currentIndex <= endSheetIndex; currentIndex++)
            {
                worksheet = (Worksheet)excel.Worksheets[currentIndex];
                worksheet.Activate();
                
                //处理每一个sheet.....

            }

拆分合并的单元格

在获取有效的单元格区域后,就开始遍历单元格对象,判断单元格对象 MergeCells 属性即可,判断 Cell.MergeCells.ToString() == "True"  即表示该单元格为合并单元格对象。

示例代码如下:

//获取起始单元和截止单元格,以确定有效区域

                Excel.Range _startcell=worksheet.Range["A1","A1"]; //默认为第一个单元格
				if(startaddress!="")
				{
					try
					{
						_startcell=worksheet.Range[startaddress,startaddress];
					}
					catch(Exception ex)
					{
						rv[1]+=string.Format("{1}指定的起始单元格地址{0},不是合法的地址。\r\n",startaddress,worksheet.Name);
						//					KillProcessByStartTime("EXCEL",beforetime,aftertime);
						continue;
					}
				}

				Excel.Range _lastcell=worksheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell,Type.Missing);
//默认获取有值的最后一个有效的单元格
				if(endaddress!="")
				{
					try
					{
						_lastcell=worksheet.Range[endaddress,endaddress];
					}
					catch(Exception ex)
					{
						rv[1]+=string.Format("{1}指定的结束单元格地址{0},不是合法的地址。\r\n",endaddress,worksheet.Name);
						//					KillProcessByStartTime("EXCEL",beforetime,aftertime);
						//						return rv;
						continue;
					}
				}


//遍历有效区域单元格

                    foreach (Excel.Range aicell in worksheet.Range[_startcell,_lastcell])
                    {
                        if (aicell.MergeCells.ToString() == "True")
                        {
                            //处理合并单元格
                            object temp_merge_value = aicell.Value2; //备份单元格的值
                            int u_row = aicell.Row;  //记录单元格的首行索引
                            int u_rows = aicell.MergeArea.Rows.Count; //记录单元格的合并区域包含的行数
                            int u_col = aicell.Column; //记录单元格的首列索引
                            int u_cols = aicell.MergeArea.Columns.Count; //记录单元格的合并区域包含的列数
                            aicell.MergeArea.UnMerge();  //取消合并,拆分单元格
                            Excel.Range new_aicell = worksheet.Range[worksheet.Cells[u_row, u_col], worksheet.Cells[u_row + u_rows - 1, u_col + u_cols - 1]];  //获取拆分后单元格后的有效区域
                            new_aicell.Value2 = temp_merge_value; //将拆分的单元格重新赋值(备份值)
                        }
                    }

创建DataTable

如果首行是列数据,则以该行的值创建表结构,否则自动创建以“C”为前缀的列名,如C1、C2...Cn以此类推。

				System.Data.DataTable dt=ds.Tables.Add();
				dt.TableName=worksheet.Name;  //表名为worksheet的名称
				for(int i=_startcell.Column;i<=_lastcell.Column;i++)
				{
					Excel.Range _cell=worksheet.Range[worksheet.Cells[_startcell.Row,i],worksheet.Cells[_startcell.Row,i]];
								string _colname=hastitle==true?_cell.Value2.ToString():"C"+(i-_startcell.Column+1).ToString(); //如果第一行是标题,则赋单元格的值,否则以C开头加序号
						DataColumn dc=dt.Columns.Add();
						dc.ColumnName=_colname;
						dc.DataType=System.Type.GetType("System.String");
						dc.AllowDBNull=true;
				}
				

将单元格数据写入DataTable

object[,] cells=null;  定义二维对象数组
    if(hastitle) //如果首行包含列,则加行索引加1取数据行
	{
		startrow=_startcell.Row+1;  
    }
//将有效区域单元格转化赋值为 object[,]	
cells=(object[,])worksheet.Range[worksheet.Cells[startrow,_startcell.Column],worksheet.Cells[_lastcell.Row,_lastcell.Column]].Value2;

//遍历数组,添加行数据到 DataTable里
int _rowcount=cells.GetLength(0);
int _colcount=cells.GetLength(1);
for(int i=0;i<_rowcount;i++)
{
	object[] newrowdata=new object[_colcount];
	for(int j=0;j<_colcount;j++)
	{
		newrowdata[j]=cells[i,j];
	}
	DataRow dr=dt.Rows.Add(newrowdata);
}

总结

在实际的应用中,还可以设定多种参数选项:

1、如导入单元格的数据,是格式化后的数据(ExcelReport.ImportDataType.FormattingValue),还是原始数据(ExcelReport.ImportDataType.OriginalValue),这也是Cell.Value和Cell.Value2的区别

2、创建表列名字段过度依赖于单元格的值,可能会创建失败,建议定义参数指定是否重写列名

3、是否只导入指定的sheet或活动的sheet。

这些选项都可以根据实际的业务进行扩展,我们在此仅讲述了一些操作Excel相关的关键方法和属性,这里仅作参考,欢迎大家评论指教!文章来源地址https://www.toymoban.com/news/detail-785480.html

到了这里,关于C#实现Excel合并单元格数据导入数据集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 快速将数据写入 Excel 单元格

    目录 性能问题 Excel元素结构及写入原理 范例运行环境 配置Office DCOM 实现代码 组件库引入 核心代码 WriteArrayToExcel 神奇的 911 事件 小结 将生成或查询到的数据,导出到 Excel 是应用中常用的一项功能。其中一些标准的写入单元格的方法如下: 请注意,office 元素大多的起始序号

    2024年04月15日
    浏览(28)
  • C# Winfrom将DataGridView数据导入Excel

      1.项目添加Word和Excel的COM类型库引用 2.创建Excel工作表 3.设置Excel表格的标题 4.加载数据进入Excel表格 5.显示和释放工作簿对象 6.补充         一:                 在前面老是用到Microsoft.Office.Interop.Excel这个命名空间,可以给它起个别名方便书写                 例

    2024年02月16日
    浏览(41)
  • C#将数据库数据导出到Excel & 将Excel文件导入到数据库

    1、读取Excel数据并写入到SQLServer数据库中; 2、将SQLServer数据库中的数据写入到Excel表中; 以下部分程序代码:  完整代码程序及配套测试数据库数据如下: https://download.csdn.net/download/XueJiaoKui/85331183 https://download.csdn.net/download/XueJiaoKui/85331183

    2024年02月16日
    浏览(46)
  • C#使用MiniExcel导入导出数据到Excel/CSV文件

    MiniExcel简介 简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。 目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。 特点: 低内存耗用,避免

    2024年02月19日
    浏览(56)
  • C# Winfrom通过COM接口访问和控制Excel应用程序,将Excel数据导入DataGridView

    1.首先要创建xlsx文件 2.在Com中添加引用 3. 添加命名空间         using ApExcel = Microsoft.Office.Interop.Excel;         --这样起个名字方面后面写 4.样例 5.获取sheet.Cells值的时候也可以不使用强制转换,还要注意这个的下标是从1开始的

    2024年02月11日
    浏览(46)
  • 【java】EasyPoi导出导入(合并单元格)

    2024年02月14日
    浏览(44)
  • Excel通用表头及单元格合并

    要在Java中实现XLS文件中的通用表头合并和单元格合并,您可以使用Apache POI库。下面是一个示例代码,展示了如何实现这两个功能: 上述代码创建一个工作簿和工作表,并在工作表中创建通用表头行和数据行。然后使用 addMergedRegion() 方法执行表头合并和单元格合并操作。 对

    2024年02月11日
    浏览(43)
  • 基于 SheetJS 的前端合并单元格复杂表头导入

    项目功能 任意层级合并单元格复杂表头解析 自动转化为目标层级的数据结构 自动生成基于 antdv 的 table 列配置数据 columns 及对于数据源 dataSource。在页面端复现 Excel 效果。 在线示例 步骤零:如需快速测试,可点击顶部的示例按钮,可快速填充测试数据,并自动下载对应的

    2024年01月16日
    浏览(48)
  • Java导出Excel并合并单元格

    需求:需要在导出excel时合并指定的单元格 项目基于若伊框架二次开发,本着能用现成的就不自己写的原则,先是尝试了@Excel注解中needMerge属性 查了一圈别人的使用,大致是需要定义一个List集合,集合元素为对象,对象中的属性标注@Excel注解,并表明name属性 照葫芦画瓢 查

    2024年01月19日
    浏览(37)
  • Pandas读取excel合并单元格的正确姿势(openpyxl合并单元格拆分并填充内容)

    在pandas读取excel经常会遇到合并单元格的问题。例如: 此时使用pandas读取到的内容为: 如果去百度,几乎所有人会说应该用如下代码: 这样看起来没问题,但是,该解决方案并不能适用于所有场景,甚至会造成数据错误。 例如: 对班级和备注填充后: 孙武空本来是数据缺

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包