C#:使用OleDb从Excel表格中读取信息到DataTable

从Excel表格中将数据读入到DataTable数据类型中,我是通过使用OLEDB来实现的

(OLEDB是Object Linking and Embedding Database的缩写)

现有一个扩展名为xlsx的工作簿文件“节气表.xlsx”,在工作表Sheet1中有24个节气的信息

本文中的示例程序(代码将在后面给出)读取这个数据表后的效果如下图:

可以看出:OleDb读入一个Excel工作表(Sheet)的数据后,工作表的第一行会变成标题,第二行起,逐行变为DataTable的一个数据行(Row)

示例程序控件说明:

程序代码:

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

namespace ExcelReader
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            txtXlsxPath.Text = @"节气表.xlsx";
            txtSheetName.Text  = @"Sheet1";
        }

        /// <summary>
        /// 按钮:从EXCEL工作簿中读取信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRead_Click(object sender, EventArgs e)
        {
            dgvTable.DataSource = ReadFromExcel(txtXlsxPath.Text, txtSheetName.Text);
        }

        /// <summary>
        /// 从EXCEL工作簿中读取信息到DataTable(需要System.Data.OleDb)
        /// </summary>
        /// <param name="sXlsxPath">EXCEL工作簿文件地址</param>
        /// <param name="sSheetName">工作表名称</param>
        private DataTable ReadFromExcel(string sXlsxPath, string sSheetName)
        {
            string sExt = System.IO.Path.GetExtension(sXlsxPath);
            string sConn = "";
            if (sExt == ".xlsx") //Excel2007
            {
                sConn =
                     "Provider=Microsoft.ACE.OLEDB.12.0;" + 
                     "Data Source=" + sXlsxPath + ";" + 
                     "Extended Properties=‘Excel 12.0;HDR=YES‘";
            }
            else if (sExt == ".xls") //Excel2003
            {
                sConn =
                    "Provider=Microsoft.Jet.OLEDB.4.0;" +
                    "Data Source=" + sXlsxPath + ";" +
                    "Extended Properties=Excel 8.0";
            }
            else
            {
                throw new Exception("未知的文件类型");
            }
            OleDbConnection oledbConn = new OleDbConnection(sConn);
            oledbConn.Open();

            OleDbDataAdapter command = new OleDbDataAdapter(
                "SELECT * FROM [" + sSheetName + "$]", oledbConn);
            DataSet ds = new DataSet();
            command.Fill(ds, sSheetName);

            oledbConn.Close();
           
            return ds.Tables[sSheetName];
        }
    }
}

编写这个程序的时候遇到过两个异常,解决方法如下:

1)异常“外部表不是预期的格式”:

写连接表达式时(上面代码中的sConn),要对扩展名为.xlsx和.xls分类讨论

2)异常:“找不到可安装的ISAM”:

读取.xlsx格式的Excel表格时,连接表达式的Extended Properties部分,等于号后面的字符是用单引号括起来的,如果漏写单引号引起的,补上就好了

END

时间: 2024-10-09 16:23:47

C#:使用OleDb从Excel表格中读取信息到DataTable的相关文章

laravel5.4将excel表格中的信息导入到数据库中

1.首先在得有需要导入的文件,这个过程可以利用laravel中的文件上传功能完成, 详情可以参考laravel文档http://laravelacademy.org/post/6885.htm,这里不再多说文件上传 2.假定现在要导入到数据库的表格在 storage下面的test.xls public function daoru() { $filePath = 'storage/' . iconv('UTF-8', 'GBK', 'test') . '.xls'; $ret = []; Exc

利用java反射机制实现读取excel表格中的数据

如果直接把excel表格中的数据导入数据库,首先应该将excel中的数据读取出来. 为了实现代码重用,所以使用了Object,而最终的结果是要获取一个list如List<User>.List<Book>等,所以需要使用泛型机制去实现.下面会给出代码,可能会稍微复杂一点,但注释很清晰,希望大家耐心阅读. 在上代码之前简单说一下思路: 1.excel表格必须有表头,且表头中各列的值要与实体类的属性相同: 2.先读取表头信息,然后获取表头列数,接着确定需要使用的set方法的名称,并存到数

根据excel表格中的内容更新Sql数据库

关于[无法创建链接服务器 "(null)" 的 OLE DB 访问接口 SQL Server 2008读取EXCEL数据时,可能会报这个错误:无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "MSDASC" 的实例. 1. 此错误主要是在使用代码读取数据时发生: insert into 数据库表名 select * from OpenDataSource ('Microsoft.Ace.OLEDB.12.0','Data Sou

C#中导出数据到Excel表格中

之前PM交给我一个自动化测试的Case,让我抓取页面上的数据到Excel表格中,刚好又接了一个之前人家做的系统, 刚好看到可以用NPOI导数据,就动手试试,成功导出. 由于鄙人比较菜,也比较懒, 怕自己忘记了,今天就总结一下,以防下次用可以参考. 1.要使用NPOI,首先需要在Project中Install NPOI的 Package. 右键点击Project------>Manage NuGet Packages---->Search NPOI----->点击搜索到的NPOI然后点击等

Java -&gt; 把Excel表格中的数据写入数据库与从数据库中读出到本地 (未完善)

写入: private void insertFile(HttpServletRequest request, HttpServletResponse response) throws IOException { String path_member = request.getParameter("path_member"); List list = this.insert("f:/tmp001.xls", "gs_sale_members");

VBA取得EXCEL表格中的行数和列数

VBA取得EXCEL表格中的行数和列数 初学EXCEL宏的童鞋,总是很想知道表格中含有数据的行数和列数,尤其是行数和列数不确定的情况下.这样可以避免很多的错误,并且可以提高效率.但每次用到的时候到网上查找时,总是给了很多无用的答案,往往找不到想要的结果.笔者也是每次使用时,临时查找总是很头疼.偶然发现一篇博客,上面详细记录了不同的方法,笔者测试了几种发现真的很好用.本着分享万岁的精神,将博客内容共享出来.希望对大家有所帮助. 来源:http://www.okexcel.com.cn/bbs/vi

excel表格中如何将内容粘贴到筛选后的可见单元格[转]

默认情况下,筛选后excel表格进行复制粘贴,会贴到隐藏的表格. 可以添加两个辅助列来完成操作:1.在筛选前在表格右边添加"辅助1"列,在第二行输入1,按Ctrl+鼠标左键往下拉到相应行.2.执行你的"自动筛选"过程.3.在右边再添加的一"辅助2"列,用鼠标选定该列所有行,输入1,按Ctrl+回车.(即在所有筛选结果行的该列增加一个1,其他被隐藏的行该列为空白)4.退出筛选状态,将全表按"辅助2"列排序,你的筛选结果就集中在连

C# 如何在Excel表格中插入、编辑和删除批注

概述 为文档添加必要的批注可以给文档使用者提供重要的提示信息,下面的示例中,将介绍通过C#编程语言来给Excel表格中的指定单元格内容添加批注,此外,对于已有的批注,如果需要修改,我们也可以进行编辑或者删除批注.示例内容将包含以下主要内容:1.插入批注1.1 插入文本1.2 插入图片2.编辑批注2.1 修改批注内容2.1 设置批注可见性3.删除批注 工具 Spire.XLS for .NET 8.0 提示:在进行代码操作之前,需下载安装Spire.Xls,并添加引用dll文件,添加如下using

Excel表格中的&quot;=&quot;功能强大,这几个不为人知的技巧你会吗?

你知道"="在Excel表格中的技巧吗?今天就给大家分享一下在单元格中输入等于号之后,会有哪些神奇的技巧,一起来看看吧! 快速对比数据差异 在单元格中输入"=A2=B2",下拉填充,显示"TRUE"表示数据一致,"FALSE"表示数据不一致. 具体操作如下: 快速将一列数据转为多列 在单元格中输入"=A6",分别向下,向右填充直到出现0值,把两列数据进行复制粘贴转换为数值,最后删除多余的数据. 具体操作如下