c # 读取excel 合并单元格中的部分文字

laixilaixi 2010-01-13 11:45:05
各位达人,我现在想用C#,读取一个EXCEL表中的数据,但是,这个表中的前三行是合并单元格,我想读其中第二行的合并单元格中的,有关“监测日期:2009年10月2日”这个内容,请问,如何做到?
同时,读完后,我想把这个内容,作为一列,插入到当前EXCEL中,如何做到?
谢谢啦。请多出手帮助。
...全文
2743 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
highreport 2012-08-07
  • 打赏
  • 举报
回复
请参考
http://blog.csdn.net/shangxinyu123/article/details/7840314
潘少博 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 songcau 的回复:]
主要是通过判断是否为合并单元格,和判断是否有值 , 以及 Excel 合并单元格只去最左上的一个单元格作为合并单元格的数据 来实现该获取值的方法。
代码如下:

private string GetCellText(int row,int col,Excel._Worksheet oSheet)
{
string result = "";
bool isFound = ……
[/Quote]
15楼的函数非常很实用
但是有一点点小错误。
在向上和向前寻找合并单元格的时候,如果刚好当前单元格的值就是null,在向前找的单元格刚好是一个合并单元格,以程序则会取出它前面合并单元格的数据。而非我们要找的单元格的数据


// 倒序遍历该列所有行(从倒2行开始),判断是否有合并单元格且有值,如果遇到则已求出,
// 如果遇到非合并单元格,则行+1(倒回1行),列同样倒序进行
for( int r = row-1; r >=1 ;r--)
{
oRng = (Excel.Range)worksheet.Cells[r,col];
//错在下面这个判断,如果这个单元格实际是null,而这个单元格前面的单元格也是合并单元格呢?下面的判断还是会通过,则取出了前面单元格的数据。
if((bool)oRng.MergeCells )
//改为这样就好了
//if((bool)oRng.MergeCells && oRng.MergeCells.Equals((Excel.Range)worksheet.Cells[row,col]))
{
try
{
if(oRng.Value2 != null)
{
result = oRng.Value2.ToString();
isFound = true;
break;
}
}
catch(Exception)
{}
}
else
{
rowEnd = r+1;
break;
}

不过还是感谢15l的代码,帮我解决的了大问题。因为我的程序在excel中的合并单元格操作也不是特别复杂,更复杂的单元格我还没测试。等下班回家测测看。
喜剧登场 2010-03-08
  • 打赏
  • 举报
回复
主要是通过判断是否为合并单元格,和判断是否有值 , 以及 Excel 合并单元格只去最左上的一个单元格作为合并单元格的数据 来实现该获取值的方法。
代码如下:

private string GetCellText(int row,int col,Excel._Worksheet oSheet)
{
string result = "";
bool isFound = false;
int rowEnd = 1;
int colEnd = 1;

Excel.Range oRng = (Excel.Range)oSheet.Cells[row,col];
if(oRng.Value2 != null)
{
result = oRng.Value2.ToString();
isFound = true;
}
else
{
if(!(bool)oRng.MergeCells) // 如果该单元格无值且不是合并的,则返回 null
{
result = null;
isFound = true;
}
}
if(!isFound)
{
// 倒序遍历该列所有行(从倒2行开始),判断是否有合并单元格且有值,如果遇到则已求出,
// 如果遇到非合并单元格,则行+1(倒回1行),列同样倒序进行
for( int r = row-1; r >=1 ;r--)
{
oRng = (Excel.Range)oSheet.Cells[r,col];
if((bool)oRng.MergeCells)
{
try
{
if(oRng.Value2 != null)
{
result = oRng.Value2.ToString();
isFound = true;
break;
}
}
catch(Exception)
{}
}
else
{
rowEnd = r+1;
break;
}
}
if(!isFound)
{
// 倒序遍历该行所有列,判断是否有合并单元格且有值,如果遇到则已求出,如果遇到非合并单元格,则说明数据非法。。。
for( int c = col-1; c >=1 ;c--)
{
oRng = (Excel.Range)oSheet.Cells[rowEnd,c];
if((bool)oRng.MergeCells)
{
try
{
if(oRng.Value2 != null)
{
result = oRng.Value2.ToString();
isFound = true;
break;
}
}
catch(Exception)
{}
}
else
{
colEnd = c+1;
break;
}
}
}
if(!isFound)
{
result = null;
}
}

return result;
}

获取值测试:

private void GetAllText()
{
Excel.Application oXL;
Excel._Workbook oWB;
Excel._Worksheet oSheet;
object missing = System.Type.Missing;

//创建Excel实例
oXL = new Excel.Application();

//打开已有的工作簿
oWB = oXL.Workbooks.Open(@"E:\BookTest.xls",missing,missing,missing,missing,missing,missing,
missing,missing,missing,missing,missing,missing,missing,missing);
oSheet = (Excel.Worksheet)oWB.Sheets.get_Item(1);

// 遍历获取 10行 10列 数据
for(int i=1;i<10;i++)
{
for(int j=1;j<10;j++)
{
string str = GetCellTest(i,j,oSheet);
richTextBox1.AppendText(" i : "+i.ToString() + " , j : "+ j.ToString() + " , value : "+ str +" \r\n ");
}
}
}
laixilaixi 2010-01-19
  • 打赏
  • 举报
回复
Excel操作类我这几天也试过了,放弃了。呵呵。
目前想用olbdb方式,连接数据库方式,来实现。
无奈,C#、SQL自己从来没接触过。呵呵,买了几本书,《C#入门经典》感觉真是烂,想不明白,网上为什么那么多人推荐它。难道自己水平差得连书都看不懂了?!!!,还有两本也是讲得东一句西一句,哎。
哪位仁兄,推荐一下学习C#基础的好书,有体系的。
在此也谢谢了。
laixilaixi 2010-01-19
  • 打赏
  • 举报
回复
帮看一下,哪出错了?
laixilaixi 2010-01-19
  • 打赏
  • 举报
回复
呵呵,没学过C#,也没学过,SQL,现在要写这个程序,真是感到,工作真是没办法呀。
现在从EXCEL取到日期了,但是插入不进去。


程序如下:
string strname = "Provider=Microsoft.Jet.OleDb.4.0; Data Source= " + textBoxInput.Lines[0] + "; Extended Properties=Excel 8.0;";
OleDbConnection Conn = new OleDbConnection(strname);
Conn.Open();
string ss = "select * from [Sheet1$A2:A2] ";
OleDbCommand CMD = new OleDbCommand(ss,Conn);
OleDbDataReader RAD = CMD.ExecuteReader();
string NAME = RAD.GetName(0);
string TIME = NAME.Substring(24,11);

//插入一列日期。
string INS = "insert into [Sheet1$I3:I4] (备注) values(TIME)";//????
OleDbCommand CMD2 = new OleDbCommand(INS, Conn);
CMD2.ExecuteNonQuery();
Conn.Close();
BeyondYV 2010-01-14
  • 打赏
  • 举报
回复
本人也是菜鸟,但觉得不是很难,说说思路,代码LZ想想办法。
1,2行是合并成一个单元格?如果这样读出第一行第一列的文本数据,用正则表达式获取日期(很久没弄了,具体表达式写不了,当应该不难。),再不然,用笨点的字符串操作,反正目的就是读出日期。完了从第三行开始在正文结束的下一个个空白列加上这个日期,就可以了嘛。

laixilaixi 2010-01-14
  • 打赏
  • 举报
回复
请达人出手呀,自己顶一下。
wartim 2010-01-13
  • 打赏
  • 举报
回复

编号 姓名 金额 F4
48 7884 12.3
2 3____________9
wartim 2010-01-13
  • 打赏
  • 举报
回复
一个excel文件:

编号 姓名 金额 F4
48 7884 12.3
2 3 9

第2行的3是个合并单元格


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;

namespace WindowsApplication290
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

DataGridView DGV = new DataGridView();
DGV . Parent = this;
DGV.Dock = DockStyle.Fill;

using (OleDbConnection Connection = new OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0;Data Source="
+ @"D:\wt\BatchFillAndPay\BatchFillAndPay\bin\Release\复件 Data.xls"
+ ";Extended Properties=Excel 8.0"))
{
OleDbDataAdapter DataAdapter = new OleDbDataAdapter("Select * from [Sheet1$]", Connection);
DataTable DT = new DataTable();
DataAdapter.Fill(DT);
DGV.DataSource = DT;

Connection.Open();
DataAdapter =new OleDbDataAdapter("INSERT INTO [Sheet1$] (编号, 姓名, 金额, F4) VALUES (@编号, @姓名, @金额, @F4)",Connection );
DataAdapter.SelectCommand.Parameters.AddWithValue("编号",1);
DataAdapter.SelectCommand.Parameters.AddWithValue("姓名",2);
DataAdapter.SelectCommand.Parameters.AddWithValue("金额",3);
DataAdapter.SelectCommand.Parameters.AddWithValue("F4",4);
DataAdapter.SelectCommand.ExecuteNonQuery();
}
}
}
}


datagridview里显示的第2行、姓名列的单元格的值就是3
而且还往excel插入一行
wzp144650 2010-01-13
  • 打赏
  • 举报
回复
Excel.dll里的range对象上应该有个MergeCells属性是判断是否是合并单元格。
反正你就取range对象吧,所有你要的属性几乎都有
BeyondYV 2010-01-13
  • 打赏
  • 举报
回复
根据我的经验,比如,单元格1和单元格2是合并单元格,数据是存在单元格1的,你读取1的内容就好。
laixilaixi 2010-01-13
  • 打赏
  • 举报
回复
能有代码给我一个示例吗,多谢。
mytimes_walker 2010-01-13
  • 打赏
  • 举报
回复
laixilaixi 2010-01-13
  • 打赏
  • 举报
回复
能详细讲一下吗,我是初手,谢谢。
owenliangbin 2010-01-13
  • 打赏
  • 举报
回复
抄宏代码,呵呵
laixilaixi 2010-01-13
  • 打赏
  • 举报
回复
沉降监测报表
仪器型号:Dini 12电子水准仪 监测日期:2009年10月26日 累计观测时间:52天
监测点号 初始值 本次沉降量 前次累计沉降量 备注
(XS)DB-09-01 4418.55 -0.17 2.64  
(XS)DB-09-02 4423.28 -0.15 2.50  
(XS)DB-09-03 4399.82 -0.12 3.51  
(XS)DB-10-01 4425.92 -0.15 2.56  
(XS)DB-10-02 4424.92 -0.17 2.37  
(XS)DB-10-03 4414.65 -0.23 3.46  
(XS)DB-10-04 4416.93 -0.29 3.45  
(XS)DB-12-04 4435.82 -0.02 -0.94  
(XS)DB-12-06 4420.99 0.39 2.40  
监测说明  
工况 现基坑土方开挖,桩间网喷。

///////////////////////////////////////////////////////////
把EXCEL表放上来,给大家看一下。
其中最前面两行都是合并单元格,最后两行,也分别是合并单元格。
我现在想,读取第二行中的“监测日期:2009年10月26日”,并把它作为一列,插入到这个表的第三行中,使得每个数据有一个对应的日期。即,变成如下格式:
/////////////////////////////////////////////////////////////
沉降监测报表
仪器型号:Dini 12电子水准仪 监测日期:2009年10月26日 累计观测时间:52天
监测点号 初始值 本次沉降量 前次累计沉降量 备注 监测日期
(XS)DB-09-01 4418.55 -0.17 2.64 2009年10月26日  
(XS)DB-09-02 4423.28 -0.15 2.50 2009年10月26日 
(XS)DB-09-03 4399.82 -0.12 3.51 2009年10月26日  
(XS)DB-10-01 4425.92 -0.15 2.56 2009年10月26日  
(XS)DB-10-02 4424.92 -0.17 2.37 2009年10月26日  
(XS)DB-10-03 4414.65 -0.23 3.46 2009年10月26日  
(XS)DB-10-04 4416.93 -0.29 3.45 2009年10月26日  
(XS)DB-12-04 4435.82 -0.02 -0.94 2009年10月26日  
(XS)DB-12-06 4420.99 0.39 2.40 2009年10月26日  
监测说明  
工况 现基坑土方开挖,桩间网喷。


110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧