C#取Excel 合并单元格的对应数据 怎么取

C#取Excel 合并单元格的对应数据 怎么取,第1张

private DataSet BindDsFromExcel(string strFileDir, string strDataName)

{

string strConn;

strConn = "Provider=MicrosoftJetOLEDB40;Data Source=" + strFileDir + ";Extended Properties='Excel 80;HDR=False;IMEX=1'";

OleDbConnection OleConn = new OleDbConnection(strConn);

OleConnOpen();

String sql = "SELECT FROM [" + strDataName + "$]";//如果不知道名字就用Sheets[1] OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn);

DataSet OleDsExcle = new DataSet();

OleDaExcelFill(OleDsExcle, strDataName);

OleConnClose();

return OleDsExcle;

} ADONET 如何读取 Excel (上)

经常需要在数据库与Execl之间互导数据。net时代,ADONET可以使用使用MicrosoftJetOleDb访问访问Excel,网上已经有很多类似的资源,最典型也是最简单的可能如下:(aspnet环境) // 连接字符串

string xlsPath = ServerMapPath("~/app_data/somefilexls"); // 绝对物理路径

string connStr = "Provider=MicrosoftJetOLEDB40;" +

"Extended Properties=Excel 80;" +

"data source=" + xlsPath;

// 查询语句

string sql = "SELECT FROM [Sheet1$]"; DataSet ds = new DataSet();

OleDbDataAdapter da = new OleDbDataAdapter(sql, connStr);

daFill(ds); // 填充DataSet

// 在这里对DataSet中的数据进行操作 // 输出,绑定数据

GridView1DataSource = dsTables[0];

GridView1DataBind();

很简单吧?!一切就像操作数据库一样,只是需要注意的是:

1。数据提供程序使用Jet,同时需要指定Extended Properties 关键字设置 Excel 特定的属性,不同版本的Excel对应不同的属性值: 用于 Extended Properties 值的有效 Excel 版本。

对于 Microsoft Excel 80 (97)、90 (2000) 和 100 (2002) 工作簿,请使用 Excel 80。 对于 Microsoft Excel 50 和 70 (95) 工作簿,请使用 Excel 50。 对于 Microsoft Excel 40 工作簿,请使用 Excel 40。 对于 Microsoft Excel 30 工作簿,请使用 Excel 30。 ref: http://msdnmicrosoftcom/library/chs/defaultaspurl=/library/CHS/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodatasetasp2。数据源路径使用物理绝对路径(同Access)3。如何引用表名?

对 Excel 工作簿中表(或范围)的有效引用。

若要引用完全使用的工作表的范围,请指定后面跟有美元符号的工作表名称。例如: select from [Sheet1$]

若要引用工作表上的特定地址范围,请指定后面跟有美元符号和该范围的工作表名称。例如: select from [Sheet1$A1:B10]

若要引用指定的范围,请使用该范围的名称。例如: select from [MyNamedRange]

ref: http://msdnmicrosoftcom/library/chs/defaultaspurl=/library/CHS/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodatasetasp

说明:

可以引用Excel 工作簿中的三种对象:

整张工作表:[Sheet1$] ,Sheet1 就是工作表的名称

工作表上的命名单元格区域:[MyNamedRange] (不需要指定工作表,因为整个xls中命名区域只能唯一)

XLS命名方法:选中单元格范围》插入》名称》定义

工作表上的未命名单元格区域 :[Sheet1$A1:B10]

(在关系数据库提供的各种对象中(表、视图、存储过程等),Excel 数据源仅提供相当于表的对象,它由指定工作簿中的工作表和定义的命名区域组成。命名区域被视为“表”,而工作表被视为“系统表”)注意:

必须使用[](方括号),否将报:

FROM 子句语法错误

必须跟$(美元符号),否则报:

Microsoft Jet 数据库引擎找不到对象'Sheet2'。请确定对象是否存在,并正确地写出它的名称和路径。

如果工作表名称不对,或者不存在,将报:

'Sheet2$' 不是一个有效名称。请确认它不包含无效的字符或标点,且名称不太长。

在 如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据 中提到可以使用

~ 和 '(波浪线和单引号)代替[],使用ADO。NET测试没有成功,报:

FROM 子句语法错误

当引用工作表明名([Sheet1$])时,数据提供程序认为数据表从指定工作表上最左上方的非空单元格开始。比如,工作表从第 3 行,C 列开始,第3行,C列之前以及第1、2行全为空,则只会显示从第3行,C列开始的数据;以最后表最大范围内的非空单元结束;

因此,如需要精确读取范围,应该使用命名区域 [NamedRange],或者指定地址:[Sheet1$A1:C10]4。如何引用列名?

根据默认连接字符串中,数据提供程序会将有效区域内的第一行作为列名,如果此行某单元格为空则用F1、F2表示,其中序数,跟单元格的位置一致,从1开始;

如果希望第一行作为数据显示,而非列名,可以在连接串的 Extended Properties 属性指定:HDR=NO

默认值为:HDR=NO (应该为 HDR=YES,即默认将第一行作为列名,竟然一直没有发现这个错误,汗upadted 2007年8月18日)格式如下: string connStr = "Provider=MicrosoftJetOLEDB40;" +

"Extended Properties=\"Excel 80;HDR=NO\";" +

"data source=" + xlsPath;

注意: Excel 80;HDR=NO 需要使用双引号(这里的反斜扛,是C#中的转义)ref:ms-help://MSVSCCv80/MSMSDNv80/MSVisualStudiov80chs/WD_ADONET/html/745c5f95-2f02-4674-b378-6d51a7ec2490htm 中 《连接Excel》节(说明:在我自己的MSDN中,它的例子使用了两个双引号是错的,测试没有通过,原文这样说的:注意,Extended Properties 所需的双引号必须还要加双引号。

)在这种情况下,所有的列名都是以F开头,然后跟索引,从F1开始,F2,F3。。。。。。。5。为什么有效单元格数据不显示出来?

出现这种情况的可能原因是,默认连接中,数据提供程序根据前面单元格推断后续单元个的数据类型。

可以通过 Extended Properties 中指定 IMEX=1 “IMEX=1;”通知驱动程序始终将“互混”数据列作为文本读取

ref:同4PS:在baidu这个问题的时候,有网友说,将每个单元都加上引号,这固然是格方案,但是工作量何其大啊,又不零活,庆幸自己找到”治本药方“

more ref:

如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据

http://dotnetaspxcc/ShowDetailaspxid=C673E2CD-3F1E-4919-8CE0-D69B894A0599

ADONET 如何读取 Excel (下)

应用程序经常需要与Excel进行数据交互,在上一篇文章ADONET 如何读取 Excel (上)阐述了基于ADONET 读取Excel的基本方法与技巧。今天这里要介绍是如何动态的读取Excel数据,这里的动态指的是事先不知道Excel文件的是什么样的结构,或者无法预测,比如一张xls文件有多少张sheet,而且每张sheet的结构可能都不一样等等。

其实我们可以通过获取Excel的“架构信息”来动态的构造查询语句。这里的“架构信息”与数据库领域的“数据库架构信息”意义相同(也称“元数据”),对于整个数据库,这些“元数据”通常包括数据库或可通过数据库中的数据源、表和视图得到的目录以及所存在的约束等;而对于数据库中的表,架构信息包括主键、列和自动编号字段等。

在ADONET 如何读取 Excel (上)提到在关系数据库提供的各种对象中(表、视图、存储过程等),Excel 数据源仅提供相当于表的对象,它由指定工作簿中的工作表和定义的命名区域组成。命名区域被视为“表”,而工作表被视为“系统表”)这里我们将Excel也当作一个“数据库”来对待,然后利用OleDbConnectionGetOleDbSchemaTable 方法

要获取所需的架构信息,该方法获取的架构信息与ANSI SQl-92是兼容的:注意:对于那些不熟悉 OLE DB 架构行集的人而言,它们基本上是由 ANSI SQL-92 定义的数据库构造的标准化架构。每个架构行集具有为指定构造提供定义元数据的一组列(称作 NET 文档中的“限制列”)。这样,如果请求架构信息(例如,列的架构信息或排序规则的架构信息),则您会明确知道可以得到哪种类型的数据。如果希望了解更多信息,请访问 Appendix B:Schema Rowsets。ref: http://wwwmicrosoftcom/china/msdn/library/office/office/odatanet2mspxmfr=true以下是读取Excel文件内“表”定义元数据,并显示出来的的程序片断: // 读取Excel数据,填充DataSet

// 连接字符串

string xlsPath = ServerMapPath("~/app_data/somefilexls");

string connStr = "Provider=MicrosoftJetOLEDB40;" +

"Extended Properties=\"Excel 80;HDR=No;IMEX=1\";" + // 指定扩展属性为 Microsoft Excel 80 (97) 90 (2000) 100 (2002),并且第一行作为数据返回,且以文本方式读取

"data source=" + xlsPath;

string sql_F = "SELECT FROM [{0}]"; OleDbConnection conn = null;

OleDbDataAdapter da = null;

DataTable tblSchema = null;

IList<string> tblNames = null; // 初始化连接,并打开

conn = new OleDbConnection(connStr);

connOpen(); // 获取数据源的表定义元数据

//tblSchema = connGetSchema("Tables");

tblSchema = connGetOleDbSchemaTable(OleDbSchemaGuidTables, new object[] { null, null, null, "TABLE" }); GridView1DataSource = tblSchema;

GridView1DataBind(); // 关闭连接

connClose();GetOleDbSchemaTable 方法的详细说明可以参考:

http://msdn2microsoftcom/zh-CN/library/systemdataoledboledbconnectiongetoledbschematableaspx接着是一段利用“架构信息”动态读取Excel内部定义的表单或者命名区域的程序片断:

// 读取Excel数据,填充DataSet

// 连接字符串

string xlsPath = ServerMapPath("~/app_data/somefilexls");

string connStr = "Provider=MicrosoftJetOLEDB40;" +

"Extended Properties=\"Excel 80;HDR=No;IMEX=1\";" + // 指定扩展属性为 Microsoft Excel 80 (97) 90 (2000) 100 (2002),并且第一行作为数据返回,且以文本方式读取

"data source=" + xlsPath;

string sql_F = "SELECT FROM [{0}]"; OleDbConnection conn = null;

OleDbDataAdapter da = null;

DataTable tblSchema = null;

IList<string> tblNames = null; // 初始化连接,并打开

conn = new OleDbConnection(connStr);

connOpen(); // 获取数据源的表定义元数据

//tblSchema = connGetSchema("Tables");

tblSchema = connGetOleDbSchemaTable(OleDbSchemaGuidTables, new object[] { null, null, null, "TABLE" }); //GridView1DataSource = tblSchema;

//GridView1DataBind(); // 关闭连接

//connClose(); tblNames = new List<string>();

foreach (DataRow row in tblSchemaRows) {

tblNamesAdd((string)row["TABLE_NAME"]); // 读取表名

} // 初始化适配器

da = new OleDbDataAdapter();

// 准备数据,导入DataSet

DataSet ds = new DataSet(); foreach (string tblName in tblNames) {

daSelectCommand = new OleDbCommand(StringFormat(sql_F, tblName), conn);

try {

daFill(ds, tblName);

}

catch {

// 关闭连接

if (connState == ConnectionStateOpen) {

connClose();

}

throw;

}

} // 关闭连接

if (connState == ConnectionStateOpen) {

connClose();

} // 对导入DataSet的每张sheet进行处理

// 这里仅做显示

GridView1DataSource = dsTables[0];

GridView1DataBind(); GridView2DataSource = dsTables[1];

GridView2DataBind(); // more codes

//

这里我们就不需要对SELEC 语句进行“硬编码”,可以根据需要动态的构造FROM 字句的“表名”。不仅可以,获取表明,还可以获取每张表内的字段名、字段类型等信息:

tblSchema = connGetOleDbSchemaTable(OleDbSchemaGuidColumns, new object[] { null, null, null, null });

在ADOnET 1x 时候只有OleDb提供了GetOleDbSchemaTable 方法,而SqlClient或者OrcaleClient没有对应的方法,因为对应数据库已经提供了类似功能的存储过程或者系统表供应用程序访问,比如对于Sql Server: SELECT

FROM NorthwindINFORMATION_SCHEMACOLUMNS

WHERE TABLE_NAME = N'Customers'而在ADONET 20中每个xxxConnenction都实现了基类SystemDataCommonDbConnection的 GetSchemal 方法

来获取数据源的架构信息。

 1、小清新

  适用范围:三颗星

  适用要点:

  曝光准确

  最好有阳光

  最好大光圈

  满足第一点基本上可以做这种风格,满足后两点是最好不过了。

  下图只满足第一点,不过也还是能够出效果的:

  2、黑白

  适用范围:五颗星

  接触摄影这么些年,不得不说黑白简直就是废片的上帝,当调色彩调得心烦意乱的时候,直接黑白处理,别说有时候还真是就增加了那么一些艺术的气息。

  朋友,请你记住,如果你对色彩不敏感,或者有时候没有调色的灵感,或者照片本身就比较废,黑白处理吧,一键省心又高效!

  至于黑白处理方法,在图像-调整-黑白。这个功能算是比较全面的了,可以对各通道进行调整,如果你不知道怎么详细调,直接自动吧,效果也还不错哦!

  3、HDR

  适用范围:两颗星

  要点:

  一:老人的皱纹容易出效果。

  二:大光比场景。

  人像也还可以HDR事实上的确如此。

  因为适用范围不广,我就不展开陈述了。

  大家看我这篇文章里面:《超高手教程!如何模拟任意一张照片的后期》

  最后关于HDR的软件介绍,就可以基本上有所了解了。

  4、胶片

  适用范围:四颗星。

  数码时代如何凸显自己的与众不同胶卷呗,胶卷时代所有的题材都是用胶卷拍摄的,所以理论上适用范围是五颗星,但是吧,胶卷的一些特性决定了其相对于数码的劣势,所以忍痛四颗星吧!

  至于处理方法嘛,我还是推荐那款我推了N次的插件:alien skin exposure 4

  对比图:

  5、**

  适用范围:四颗星。

  照理说,**的适用范围也应该是五颗星,但出于对摄影的尊重(靠,这是什么理由好吧,我也不知道这是什么理由),所以,只给四颗星吧。

  我这里讨论的只是仿**效果,而非**效果,所以千万不要来批判我这种做法的不合理性或非专业性 – - !

  一般而言,营造**感的要点有:加上下黑边,加黑角,提高对比度,加文字,制造色偏。

Sub 单元格自动插入()

'选定起始单元格后,按一定行数(1-n)自动往返插入各种格式的,

'并在单元格中写入插入的名称。

Pf = "ai,"

Pf = Pf & "bmp,bmz"

Pf = Pf & "cdr,cgm,"

Pf = Pf & "dib,dwg,dxf,"

Pf = Pf & "emf,emz,eps,exf,exif,"

Pf = Pf & "fpx,"

Pf = Pf & "gfa,gif,"

Pf = Pf & "hdr,"

Pf = Pf & "ico,"

Pf = Pf & "jfif,jpe,jpeg,jpg,"

Pf = Pf & "pcd,pct,pcx,pcz,pict,png,psd,"

Pf = Pf & "raw,rle,"

Pf = Pf & "svg,"

Pf = Pf & "tga,tif,tiff,"

Pf = Pf & "ufo,"

Pf = Pf & "wdp,wmf,wmz,"

K = InputBox("插入行数,1=按列挿入", "插入行数", 1)

If K = "" Then Exit Sub

Dim Rng As Range: Set Rng = ActiveCell

OpenFile = ApplicationGetOpenFilename("Picture Files(),", , "打开目标文件夹后选择任一即可指定文件夹。或按取消则会将当前文件所在文件夹认作指定文件夹。")

If OpenFile = False Then

myDir = ThisWorkbookPath & "\"

Else

myDir = Left(OpenFile, InStrRev(OpenFile, "\"))

End If

Filename = Dir(myDir)

ApplicationScreenUpdating = False

Do While Filename <> ""

If InStr(Pf, LCase(Right(Filename, Len(Filename) - InStrRev(Filename, "")))) > 0 Then

RngCells(1 + n \ K, n Mod K + 1)Select

ActiveCell = Left(Filename, InStrRev(Filename, "") - 1)

ActiveSheetPicturesInsert(myDir & Filename)Select

With Selection

Placement = xlMoveAndSize

ShapeRangeLockAspectRatio = msoFalse

Top = ActiveCellTop

Left = ActiveCellLeft

Height = ActiveCellHeight

Width = ActiveCellWidth

End With

n = n + 1

End If

Filename = Dir

Loop

ApplicationScreenUpdating = True

RngSelect

End Sub

问题一:行与列怎样区分 横着的就是一行

竖着的就是一列

问题二:电脑的exCEL怎么区分 行与列 再好有图说明 直接上图,行列就是这个样子

问题三:Excel 怎么来判断一个数字,在一行中第几列 如果要判断B2单元格在第3行的第几列,那么输入

=MATCH(B2,3:3,0)

问题四:点阵怎么区分行和列 行和列是相对的。看你这么个看,单色点阵行和列是没有区分,就是在布板的时候你这么摆了。

问题五:怎么区分EXCEL中的数据产生在行或列 以数据区域 生成图表时,正常列标题会成为“图例项”,行内容会成为“水平轴标签”。

如果需要切换行/列,在已经生成的图表位置,单击鼠标右键,“选择数据”,然后点击“切换行/列”,即可。

问题六:图纸中行和列怎么区分 在表格中,与各种行业一样‘横行纵列’;在平面图里只认横轴、纵轴。只有在单层多跨厂房平面图里,有纵列柱的叫法,如‘中列柱’、‘边列柱’,但无横行的叫法。

问题七:在excel里怎么来分清楚绝对行还是列? 选中有公式的那个单元格--然后看里面的公式,例如

=A1+B1

那么就是相对引用A1,B1

往下拉就会出现=A2+B2

往右就会出现=B1+C1

如此

如果是=&A1+B1,则

往下拉就会出现=$A2+B2

往右拉就会出现=$A1+C1

因为列是绝对引用了,如此理解就知道了,也就是只要是出现$这个符号的就是绝对引用

出现在列之前就是列绝对引用,出现在行之前就是行绝对引用,如果两个都出现的话就是行列绝对引用,那么这个单元格也就是固定的了,不知道清楚吗

问题八:C# 怎么判断excel的第一行是标题还是列名 hdr=yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用,此处,我的为yes,结果标题变成读取的DataTable的标题,f2就找不到了,只需要HDR=no即可,此时标题变成数据,主动会加上列名F1,F2等

DCR是标清摄像机

HDR是高清摄像机

——SR是硬盘摄像机

——HC是磁带摄像机

——DVD是DVD摄像机

——CX是记忆棒摄像机

HVR是专业摄像机

——HD是1080高清摄像机

使用了VBNET开发一个访问excel读取数据并修改的小程序,有一些经验性的东西和大家共享,如果有误还请大家指正。

大致分为这样几个部分来说明:

1、 准备部分:

准备部分我们需要添加excel library的引用到工程中:我使用office2003,它的库文件为 Microsoft excel 110 object library。如果使用excel2000,那么它使用的是Microsoft excel 90 object library。

有需要时,我们添加Imports 命名空间。

我在这个程序中只是访问了excel的数据,不需要命名空间了哈。

2、 声明一些对象:

这些对象并不是都需要,前面三个应该有,后面的,你需要什么对象就声明:

Dim excelapp As ExcelApplication ‘声明一个application对象

Dim excelworkbook As ExcelWorkbook ‘声明一个工作簿对象

Dim excelsheet As ExcelWorksheet ‘声明一个工作表对象

等等…如:

Dim excelrange As ExcelRange ‘声明一个范围对象

3、 访问一个excel文件:

excelapp = New ExcelApplication

excelworkbook = excelappWorkbooksOpen(strfile) ‘访问到工作簿:这个strfile 是文件的路径,我从打开文件对话框中得到的。

excelsheet = excelworkbookSheetsItem(1) ‘访问到工作表:item使用索引值来得到sheet对象的引用

excelsheetactivate

我们可以得到此文件中的值:

定义一个string变量:

Dim strcellvalue as string

Strcellvalue=excelsheetcells(1,1)value ‘得到A1单元格的内容。

修改的时候反过来就可以了:

excelsheetcells(1,1)value= Strcellvalue

4、 善后:

在程序的每一个退出口操作excel对象,保存或者不保存:

Excelworkbooksave

Excelworkbookclose

Excelapp=nothing

5其它:

需要注意~上面的代码需要一些容错机制,比如:

If Not excelworkbook Is Nothing Then 这样的话来达到程序的正确运行

需要判断现在excel又没有打开。如果有excel进程正在运行。你的代码很可能会影响到打开的excel,像Excelworkbookclose这样的语句虽然前面已经很好的唯一指定了工作簿,但不能很武断的进行鲁莽的操作,我们需要判断现在excel的运行情况。

另外,VBNET 读取Excel 2007的xlsx文件和读取老的xls文件是一样的,都是用Oledb读取,仅仅连接字符串不同而已。读取xlsx 用的是MicrosoftAceOleDb120;具体操作方法如下:

Public Shared Function GetExcelToDataTableBySheet(ByVal FileFullPath As String, ByVal SheetName As String) As DataTable

'string strConn = "Provider=MicrosoftJetOleDb40;" + "data source=" + FileFullPath + ";Extended Properties='Excel 80; HDR=NO; IMEX=1'"; //此连接只能操作Excel2007之前(xls)文件

Dim strConn As String = ("Provider=MicrosoftAceOleDb120;" & "data source=") + FileFullPath & ";Extended Properties='Excel 120; HDR=NO; IMEX=1'"

'此连接可以操作xls与xlsx文件

Dim conn As New OleDbConnection(strConn)

connOpen()

Dim ds As New DataSet()

Dim odda As New OleDbDataAdapter(StringFormat("SELECT FROM [{0}]", SheetName), conn)

'("select from [Sheet1$]", conn);

oddaFill(ds, SheetName)

connClose()

Return dsTables(0)

End Function

读取Excel文件时,可能一个文件中会有多个Sheet,因此获取Sheet的名称是非常有用的。根据Excel物理路径获取Excel文件中所有表名的具体操作方法如下:

Public Shared Function GetExcelSheetNames(ByVal excelFile As String) As [String]()

Dim objConn As OleDbConnection = Nothing

Dim dt As SystemDataDataTable = Nothing

Try

'string strConn = "Provider=MicrosoftJetOleDb40;" + "data source=" + excelFile + ";Extended Properties='Excel 80; HDR=NO; IMEX=1'"; //此连接只能操作Excel2007之前(xls)文件

Dim strConn As String = ("Provider=MicrosoftAceOleDb120;" & "data source=") + excelFile & ";Extended Properties='Excel 120; HDR=NO; IMEX=1'"

'此连接可以操作xls与xlsx文件

objConn = New OleDbConnection(strConn)

objConnOpen()

dt = objConnGetOleDbSchemaTable(OleDbSchemaGuidTables, Nothing)

If dt Is Nothing Then

Return Nothing

End If

Dim excelSheets As [String]() = New [String](dtRowsCount - 1) {}

Dim i As Integer = 0

For Each row As DataRow In dtRows

excelSheets(i) = row("TABLE_NAME")ToString()

i += 1

Next

Return excelSheets

Catch

Return Nothing

Finally

If objConn IsNot Nothing Then

objConnClose()

objConnDispose()

End If

If dt IsNot Nothing Then

dtDispose()

End If

End Try

End Function

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/shuma/791229.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-07
下一篇2023-08-07

随机推荐

发表评论

登录后才能评论
保存