内容:1.dataset转excel函数代码

2.excel转dataset函数代码

3.运用实例:

3.1写入excel

3.2读取excel

dataset格式写入excel函数如下:

    public void DSToExcel(string Path, DataSet oldds)
{
//先得到汇总Excel的DataSet 主要目的是获得Excel在DataSet中的结构
string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
//string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件
//string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=No; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)
//备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。//      "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = "select * from [Sheet1$]";
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
System.Data.OleDb.OleDbCommandBuilder builder = new OleDbCommandBuilder(myCommand);
//QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。
builder.QuotePrefix = "[";     //获取insert语句中保留字符(起始位置)
builder.QuoteSuffix = "]"; //获取insert语句中保留字符(结束位置)
DataSet newds = new DataSet();
myCommand.Fill(newds, "Table1");
for (int i = 0; i < oldds.Tables[0].Rows.Count; i++)
{
//在这里不能使用ImportRow方法将一行导入到news中,
//因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。
//在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added
DataRow nrow = newds.Tables["Table1"].NewRow();
for (int j = 0; j < oldds.Tables[0].Columns.Count; j++)
{
nrow[j] = oldds.Tables[0].Rows[i][j];
}
newds.Tables["Table1"].Rows.Add(nrow);
}
myCommand.Update(newds, "Table1");
myConn.Close();
}

读取excel函数如下:

 public DataSet ExcelToDS(string Path)
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
string strExcel = "";
OleDbDataAdapter myCommand = null;
DataSet ds = null;
strExcel = "select * from [sheet1$]";
myCommand = new OleDbDataAdapter(strExcel, strConn);
ds = new DataSet();
myCommand.Fill(ds, "table1");
return ds;
}

运用例子:

添加一个opendiog用于选择要写入的excel

引用命名空间:

using System.Data.SqlClient;
using System.Data.OleDb;
using System.IO;

定义dataset转excel函数:

      public void DSToExcel(string Path, DataSet oldds)
{
//先得到汇总Excel的DataSet 主要目的是获得Excel在DataSet中的结构
string strCon= "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
//string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件
//string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=No; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)
//备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。//      "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = "select * from [Sheet1$]";
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
System.Data.OleDb.OleDbCommandBuilder builder = new OleDbCommandBuilder(myCommand);
//QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。
builder.QuotePrefix = "[";     //获取insert语句中保留字符(起始位置)
builder.QuoteSuffix = "]"; //获取insert语句中保留字符(结束位置)
DataSet newds = new DataSet();
myCommand.Fill(newds, "Table1");
for (int i = 0; i < oldds.Tables[0].Rows.Count; i++)
{
//在这里不能使用ImportRow方法将一行导入到news中,
//因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。
//在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added
DataRow nrow = newds.Tables["Table1"].NewRow();
for (int j = 0; j < oldds.Tables[0].Columns.Count; j++)
{
nrow[j] = oldds.Tables[0].Rows[i][j];
}
newds.Tables["Table1"].Rows.Add(nrow);
}
myCommand.Update(newds, "Table1");
myConn.Close();
} 

写入按钮代码(从sql数据库中提取一些数据到dataset中,把datatable写入excel中):

 private void button1_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=Student;User ID=sa;Password=123;");
conn.Open();
SqlDataAdapter adapter = new SqlDataAdapter();
SqlCommand cmdSelect = new SqlCommand("select * from score");
cmdSelect.Connection = conn;
adapter.SelectCommand = cmdSelect;
DataSet ds = new DataSet();
adapter.Fill(ds,"class");
this.dataGridView1.DataSource = ds;
this.dataGridView1.DataMember="class";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string path=openFileDialog.FileName;
DSToExcel(openFileDialog.FileName, ds);
MessageBox.Show("写入结束");
}
}

可能遇到的问题:

1.不能连接数据库

解决方法:

(1)注意连接语句的版本是否正确

string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";//string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件

//string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=No; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)

(2)检查路径是否正确

(3)路径时检查文件夹是否有写入权限

2.操作必须使用一个可更新的查询

注意连接的参数,这里 我用IMEX=0时才能写入成功

A: HDR ( HeaDer Row )设置
    若指定值为Yes,代表 Excel 档中的工作表第一行是栏位名称

若指定值為 No,代表 Excel 档中的工作表第一行就是資料了,沒有栏位名称

B:IMEX ( IMport EXport mode )设置

     IMEX 有三种模式,各自引起的读写行为也不同,容後再述:
     0 is Export mode
     1 is Import mode
     2 is Linked mode (full update capabilities)

我这里特别要说明的就是 IMEX 参数了,因为不同的模式代表著不同的读写行为:

当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。

当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。

当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。

3.无法找到列

观察到 我们这里的newds.Tables["Table1"]表是通过 select * from [Sheet1$]产生的,则它的表结构跟excel的表结构一样

如果你的dataset有4列,而excel是空表(默认为一列),则会报这个错误

所有我们要先打开excel,定好有多少列

最终结果:

好 写入完成 下面是读取

定义读取函数:

  public DataSet ExcelToDS(string Path)
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
string strExcel = "";
OleDbDataAdapter myCommand = null;
DataSet ds = null;
strExcel = "select * from [sheet1$]";
myCommand = new OleDbDataAdapter(strExcel, strConn);
ds = new DataSet();
myCommand.Fill(ds, "table1");
return ds;
}

读取按钮的代码:

    private void button2_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
DataSet da=ExcelToDS(openFileDialog.FileName);
this.dataGridView1.DataSource = da;
this.dataGridView1.DataMember = "table1";
}
}

c#操作excel方式二:采用OleDB操作Excel文件相关推荐

  1. Java操作数据库方式二DBCP使用详解

    ##概述 DBCP的全称是:DataBase connection pool,翻译是:数据库连接池. 在Java操作数据库方式一JDBC使用详解中说到直接使用JDBC非常消耗资源.为了避免频繁关闭链接 ...

  2. java操作Excel有两种方式 方式1:jxl操作Excel jxl的API

    java操作Excel有两种方式 方式1:jxl操作Excel 方式2:poi操作Excel 下面介绍jxl API: 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用 ...

  3. VB.NET 使用 OleDb 操作 Access 数据库(来自 MSDN)

    VB.NET 使用 OleDb 操作 Access 数据库 这里采用 OleDb 方式对 Access 数据库进行访问,主要内容都来自 MSDN 帮助文档.建议新手注意 MSDN 的用途.下面的代码只 ...

  4. Java操作数据库方式(六)DataSource详解

    ##概述 在java世界里操作数据库有很多方式,在众多方式中除了JDBC外都有DataSource对象. DataSource可以看作数据源,它封装了数据库参数,连接数据库,程序中操作DataSour ...

  5. oledb 操作 excel

    oledb excel http://wenku.baidu.com/search?word=oledb%20excel&ie=utf-8&lm=0&od=0 [Asp.net ...

  6. C# 采用系统委托的方式处理线程内操作窗体控件(转载)

    C# 采用系统委托的方式处理线程内操作窗体控件 C# / asp.net / j 2009-12-25 10:04:47 阅读138 评论0   字号:大中小 订阅 一.System.Windows. ...

  7. C#使用oledb操作excel文件的方法

    本文实例讲述了C#使用oledb操作excel文件的方法.分享给大家供大家参考.具体分析如下: 不管什么编程语言都会提供操作Excel文件的方式,C#操作Excel主要有以下几种方式: 1.Excel ...

  8. Python中利用openpyxl对Excel的各种相关详细操作(二十一种常用操作<代码+示例>)

    目录 一.对工作簿中对应工作表的相关操作 1.创建工作簿.工作表并指定活动工作表 2.加载创建的工作簿.修改工作表名字 3.复制活动工作表 4.删除指定工作表 二.对工作表中行.列.单元格的相关操作 ...

  9. (Excel)常用函数公式及操作技巧之四:文本与页面设置(二)

    (Excel)常用函数公式及操作技巧之四:文本与页面设置(二) (Excel)常用函数公式及操作技巧之四: 文本与页面设置(二) --通过知识共享树立个人品牌. Excel打印中如何不显示错误值符号 ...

最新文章

  1. LINQ to Entities 基于方法的查询语法
  2. 50 【Go版本变化】
  3. 机器人教育发展_得于人工智能发展,机器人教育低龄化越来越普及
  4. 深度优化LNMP之MySQL
  5. C#------引用System.Data.Entity后DbContext依然无法继承解决方法
  6. 计算机图形学(一) 视频显示设备_3_随机扫描显示器
  7. AI发展“风口”在哪里?陪伴才是“蓝海”
  8. DIV 内滚动条 样式的写法
  9. MySQL类型float double decimal的区别
  10. 位运算初步入门状态压缩操作
  11. 字符串的迷之算法——KMP,AC自动机,后缀数组
  12. Python中IO编程-StringIO和BytesIO
  13. OperationTrident游戏开发总结
  14. 用微信公众号写博客就是玩,要动真格的还是得WordPress!
  15. 自然语言处理 情绪识别
  16. defcon-ctf qualifer crypto writeup
  17. STM32第一课(Keil, Type, macro)
  18. win10安装Geany编辑器
  19. json大文件导入数据库
  20. 鱼眼参数的数值计算优化方法

热门文章

  1. navicat 怎么导入运行bak文件,详细教程
  2. 天猫国际网页(部分)
  3. 慧数汽车大数据:中国轿跑/运动型SUV市场研究报告(2018简版)
  4. FTP集合(ZT, 不知是真是假)
  5. 浏览器内核-Webkit
  6. 天猫淘宝“双十一”交易额191亿
  7. Memtest86安装详细教程
  8. 选择游戏开发工具的原则
  9. JAVA计算机毕业设计网上花店系统(附源码、数据库)
  10. 平面设计中常用的6种排版构图方式广州协众信息