You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OLEDB库在C# WinForm中显示Excel数据失败问题排查

问题排查与解决方案

1. 先确认数据是否成功加载

在adapter.Fill(ds);后添加调试代码,验证DataSet是否真的获取到了数据:

int loadedRows = adapter.Fill(ds);
MessageBox.Show($"加载行数:{loadedRows},表数量:{ds.Tables.Count}");

如果显示0行,说明数据根本没加载进来;如果有行数但DataGridView没显示,再排查绑定问题。

2. 修正连接字符串与驱动兼容性

  • 规范连接字符串写法:.xlsx对应的Extended Properties建议用Excel 12.0 Xml,避免格式歧义:
    connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={path};Extended Properties=\"Excel 12.0 Xml;HDR=Yes;IMEX=2\"";
    
  • 检查ACE驱动位数:确保安装的Microsoft Access Database Engine 2016 Redistributable位数与项目平台目标一致(右键项目→属性→生成→平台目标,选x86或x64)。若已装Office,需安装同位数驱动,可通过setup.exe /passive命令被动安装避免冲突。
  • 移除冗余的fileName变量:path已经是完整文件路径,直接用Path.GetExtension(path)即可,避免因fileName拼写错误导致的扩展名判断失误。

3. 修复DataGridView绑定逻辑

  • 确认控件名称正确性:检查窗体上的DataGridView控件Name属性确实是dataGridView1,避免拖控件时名字被修改。
  • 绑定后强制刷新并调整列宽:
    dataGridView1.AutoGenerateColumns = true;
    dataGridView1.DataSource = ds.Tables[0];
    dataGridView1.Refresh();
    dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); // 避免列宽为0导致看不到内容
    

4. 调整查询语句范围

当前查询SELECT * FROM [Sheet1$A1:C10]限定了固定范围,若Excel数据不在此区间会导致空结果。先改为读取整个工作表测试:

adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn);

修改后的完整测试代码

using System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private OleDbConnection conn;
        private OleDbDataAdapter adapter;
        private DataSet ds;
        private string path = @"C:\Users\Hamed\Desktop\ConsoleApp1\sample.xlsx";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string connectionString = "";
            string fileExtension = Path.GetExtension(path);
            
            if (fileExtension.Equals(".xls", StringComparison.OrdinalIgnoreCase))
            {
                connectionString = $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={path};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
            }
            else if (fileExtension.Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
            {
                connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={path};Extended Properties=\"Excel 12.0 Xml;HDR=Yes;IMEX=2\"";
            }

            try
            {
                conn = new OleDbConnection(connectionString);
                adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn);
                ds = new DataSet();
                int loadedRows = adapter.Fill(ds);

                MessageBox.Show($"成功加载{loadedRows}行数据");

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    dataGridView1.AutoGenerateColumns = true;
                    dataGridView1.DataSource = ds.Tables[0];
                    dataGridView1.Refresh();
                    dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
                }
                else
                {
                    MessageBox.Show("未加载到有效数据");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"加载出错:{ex.Message}");
            }
            finally
            {
                conn?.Close();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                OleDbCommandBuilder cmdBuilder = new OleDbCommandBuilder(adapter);
                int updatedRows = adapter.Update(ds.Tables[0]);
                MessageBox.Show($"成功更新{updatedRows}行数据");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"更新出错:{ex.Message}");
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者user3123721

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:13:20