当前位置: 首页 > article >正文

读取excel并且显示进度条

读取excel并且显示进度条 

通过C#实现DataGridView加载EXCEL文件,但加载时不能阻塞UI刷新线程,且向UI显示加载进度条。

 #region 左上角导入
        private async void  ToolStripMenuItem_ClickAsync(object sender, EventArgs e)
        {
           
            dataGridView1.DataSource = null;
            dataGridView1.Rows.Clear();
            dataGridView1.Columns.Clear();
            progressBar1.Value = 0;
            progressBar1.Visible = true;

            // 打开文件对话框选择 Excel 文件
            OpenFileDialog file = new OpenFileDialog();
            file.Filter = "Excel文件|*.xlsx";
            if (file.ShowDialog() == DialogResult.OK)
            {
                string fname = file.FileName;
                await LoadExcelDataAsync(fname);  // 异步加载数据
            }
        }
        // 异步加载 Excel 数据
        private async Task LoadExcelDataAsync(string filePath)
        {
            var progress = new Progress<int>(value =>
            {
                progressBar1.Value = value;  // 更新进度条
                label11.Text = $"{value}%";   // Update label to show percentage
            });

            // 在后台线程中执行加载数据的任务
            System.Data.DataTable dataTable = await Task.Run(() => LoadExcelData(filePath, progress));

            // 加载完成后,将数据绑定到 DataGridView
            dataGridView1.DataSource = dataTable;
            progressBar1.Visible = false;  // 隐藏进度条
            label11.Visible = false;  // 隐藏进度条
        }
        // 使用 EPPlus 按行读取 Excel 数据并动态更新进度
        private System.Data.DataTable LoadExcelData(string filePath, IProgress<int> progress)
        {
            FileInfo fileInfo = new FileInfo(filePath);
            using (var package = new ExcelPackage(fileInfo))
            {
        
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
                int rowCount = worksheet.Dimension.Rows;
                int columnCount = worksheet.Dimension.Columns;

                // 创建 DataTable 来存储数据
                System.Data.DataTable dt = new System.Data.DataTable();

                // 为 DataTable 添加列
                for (int col = 1; col <= columnCount; col++)
                {
                    dt.Columns.Add(worksheet.Cells[1, col].Text);  // 第一行作为列名
                }

                // 逐行读取数据并添加到 DataTable 中
                int progressInterval = rowCount / 100;  // 每读取一定行数更新进度
                int progressPercentage = 0;
                int rowCountProcessed = 0;

                for (int row = 2; row <= rowCount; row++)  // 跳过第一行作为标题行
                {
                    DataRow newRow = dt.NewRow();
                    for (int col = 1; col <= columnCount; col++)
                    {
                        newRow[col - 1] = worksheet.Cells[row, col].Text;
                    }
                    dt.Rows.Add(newRow);

                    rowCountProcessed++;
                    if (rowCountProcessed % progressInterval == 0)
                    {
                        progressPercentage = (int)((float)rowCountProcessed / rowCount * 100);
                        progress.Report(progressPercentage);  // 更新进度条
                    }
                }

                return dt;
            }
        }


http://www.kler.cn/a/385709.html

相关文章:

  • leetcode206. Reverse Linked List
  • 如何使用IDEA创建Maven/SSM工程?
  • 灵活就业,真的等同于失业吗?“三无人员”如何齐短板获贷款
  • btstack协议栈实战篇--SDP Client - Query Remote SDP Records
  • docker compose 多个 Dockerfile
  • 自动驾驶为什么需要时间同步?高精度时间同步如何实现?
  • 367.有效地完全平方数
  • 出海企业如何借助云计算平台实现多区域部署?
  • linux---vi和vim快捷键
  • 「QT」几何数据类 之 QMatrix4x4 4x4矩阵类
  • window 利用Putty免密登录远程服务器
  • 【目标检测】目标检测中全连接层(Fully Connected Layer)
  • 听说你想要快速搭建 Web 应用?轻量应用服务器绝对适合你
  • 【Python有哪些优点和缺点】
  • 【工具类】JAVA开发从SFTP服务器下载文件
  • Python函数和对象
  • 【Rust.Crate之tracing 诊断系统】
  • 星空天文 2.0.1| 完全免费的观星软件,无注册登录,天文爱好者必备。
  • 如何让3dsMax渲染效果更逼真好看?
  • HarmonyOS 移
  • Unity网络通信(part7.分包和黏包)
  • 3.2cpu
  • 初级数据结构——顺序表
  • Pr 视频过渡:沉浸式视频 - VR 球形模糊
  • 音视频入门基础:FLV专题(23)——FFmpeg源码中,获取FLV文件音频信息的实现(下)
  • MySQL 和 PostgreSQL 常见区别和联系