当前位置: 首页 > news >正文

网站构成的基本结构seo技术学院

网站构成的基本结构,seo技术学院,oa软件多少钱一套,网页制作网页目录 功能完善 Excel与DataSet的映射关系 运行环境 Excel DCOM 配置 设计实现 组件库引入 方法更新 返回值 参数设计 打开数据源并计算Sheets 拆分合并的单元格 创建DataTable 将单元格数据写入DataTable 删除虚拟列 总结 功能完善 在我的文章 《C#实现Excel…

 

目录

功能完善

Excel与DataSet的映射关系

运行环境

Excel DCOM 配置

设计实现

组件库引入

方法更新

返回值 

参数设计

打开数据源并计算Sheets

拆分合并的单元格

创建DataTable

将单元格数据写入DataTable

删除虚拟列 

总结


功能完善

在我的文章 《C#实现Excel合并单元格数据导入数据集》里讲述了可以将具有合并单元格的Excel文件数据导入到DataSet里,在实际使用情况中遇到如下情况,如下图:

如图中的 H 列,它是一个合并单元格,但它也属于一个特殊的单元格,即 worksheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell,Type.Missing) 最后一个内容单元格,由于其合并单元格的地址问题(),导入程序可能会计算成为一行数据:

如图 H1 列假设为标题列(字段名),那么 H2 列为数据行的第一行,作为最后一个单元格,因此可能会被识别为只有一行数据,而忽略后面所有的行。

因此比较快速的一种解决方案是在右侧增加一个虚拟列:

如图通过增加列标题(“虚拟列”)达到重新计算出 最后单元格 ,根据最后单元格的地址,可以计算出新的行数,以达到计算出正确行数据的目的。

Excel与DataSet的映射关系

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

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

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

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

运行环境

操作系统: Windows Server 2019 DataCenter

操作系统上安装 Office Excel 2016

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

开发工具:VS2019  C#

Excel DCOM 配置

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

  

设计实现

组件库引入

方法更新

设计  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的个数,准备遍历sheetsWorksheet worksheet = (Worksheet) excel.ActiveSheet;sheetCount=excel.Sheets.Count;  int	startSheetIndex=1;int	endSheetIndex=sheetCount;DataSet ds=new DataSet();
//遍历sheetsfor (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);
//默认获取有值的最后一个有效的单元格excel.Cells[1, _lastcell.Column + 1] = "vcol"+ (_lastcell.Column + 1).ToString();_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; //将拆分的单元格重新赋值(备份值)}}

程序中通过 excel.Cells[1, _lastcell.Column + 1] = "vcol"+ (_lastcell.Column + 1).ToString(); 设置增加虚拟列列名,以达到重新计算最后单元格的目的。

创建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);
}

删除虚拟列 

重新计算最后单元格,删除 DataSet 最后列(虚拟列),这样就达到正确输出数据集数据的目的。 代码如下:

_lastcell = excel.Cells[_lastcell.Row, _lastcell.Column - 1];
dt.Columns.Remove(dt.Columns[dt.Columns.Count - 1]);

总结

在实际的应用中,还可能遇到更多的合并情况,我们要进行进一步的情况判断和功能完善,让导入功能变得更强大,本文示例提供了一些操作Excel相关的关键方法和属性,这里仅作参考,欢迎大家评论指教!

http://www.hrbkazy.com/news/15952.html

相关文章:

  • 产品市场推广方案范文爱站seo综合查询
  • 做网站那个php好用网站优化公司上海
  • 任县网站建设服务价格关键词
  • 网站域名的密码国际要闻
  • 长沙做痔疮东大医院de网站seo综合查询什么意思
  • 网站运营软件怎么在平台上做推广
  • 设计师网上接单的网站百度关键词seo排名优化
  • 企业线上推广方案吉林百度seo公司
  • wordpress和woo西安网站seo费用
  • 沈阳市有做网站的公司seo排名哪家正规
  • 关键词排名点击软件网站搜索营销
  • 互联网创业项目网站不属于网络推广方法
  • 国内做网站比较好的公司有哪些企业网站制作方案
  • 网站登记表青岛seo霸屏
  • 怎样做网站信箱bt磁力猪
  • 免费网站建设平台 iis怎样注册一个自己的平台
  • 做内容的网站长春seo按天计费
  • 山东网站营销朋友圈广告推广平台
  • 怎么自己给自己的网站做推广网站推广宣传语
  • 推荐扬中网站建设今日热点新闻排行榜
  • 四川城乡和住房建设厅网站首页外贸seo站
  • 雷军做的网站国家优化防控措施
  • 寓意八方来财的公司名字宁波seo快速优化公司
  • 中小企业网站建设效果代发关键词包收录
  • 网站建设优化服务如何semantic scholar
  • 360的网站排名怎么做seo职位描述
  • 不知道是谁做的网站 输入学号无线网络优化是做什么的
  • 直播网站建设方案网页推广平台
  • 自己的网站怎么接广告产品营销推广
  • 哈尔滨网站建设还不如百度pc网页版