C# WinFrom 导入Excel文件,显示进度条

因为WINForm程序是在64位上运行如果使用另外一种快速的读取Excel的方法会报“未在本地计算机上注册“Microsoft.Jet.OLEDB.12.0”提供程序”

所以我就换了现在这种读取有点慢的方式

PS 采用上一种方式要更改成32位,由于我的系统有其他需求只有64位支持,所以不得不放弃,而且也需要客户端注册这个

Form1

控件 一个显示路径的TextBox: txt_ExcelPath

两个按钮 Button:btn_selectpath,btn_savedata

一个backgroundWorker1组件

 

 /// <summary>
        /// 选择Excel文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_selectpath_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFile = new OpenFileDialog();
            openFile.Filter = "Excel(*.xlsx)|*.xlsx|Excel(*.xls)|*.xls";
            openFile.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            openFile.Multiselect = false;
            if (openFile.ShowDialog() == DialogResult.OK)
            {
                txt_ExcelPath.Text = openFile.FileName;
            }
        }
 /// <summary>
        /// 数据导入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_datainto_Click(object sender, EventArgs e)
        {
            dt = new System.Data.DataTable();
            this.backgroundWorker1.RunWorkerAsync(); // 运行 backgroundWorker 组件 
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
RadProcessBar form
= new RadProcessBar(this.backgroundWorker1);// 显示进度条窗体 form.ShowDialog(this); form.Close(); }

此处的RadProcessBar 是显示进度条的窗体(进度条期间禁止其他操作)

以下是backgroundWorker1组件的一些事件

        /// <summary>
        /// 完成进程工作之后的处理动作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message);
            }
            else if (e.Cancelled)
            {
                dt = new System.Data.DataTable(); //如果取消重新定义datatable
            }
            else
            {
                dataGridView1.DataSource = dt;
            }
        }

         private  System.Data.DataTable dt = new System.Data.DataTable();

        //你可以在这个方法内,实现你的调用,方法等。
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            //System.Data.DataTable dt = GetDataFromExcelByCom();
            //dataGridView1.DataSource = dt;
            BackgroundWorker worker = sender as BackgroundWorker;           
            string[] columnName = { "1", "2", "3", "4", "5", "6", "7", "8" };
            string excelFilePath = txt_ExcelPath.Text.Trim();
            Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Sheets sheets;
            object oMissiong = System.Reflection.Missing.Value;
            Microsoft.Office.Interop.Excel.Workbook workbook = null;
           

            try
            {
                if (app == null) return ;
                workbook = app.Workbooks.Open(excelFilePath, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong,
                    oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong);
                sheets = workbook.Worksheets;

                //将数据读入到DataTable中
                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets.get_Item(2);//读取第二张表 次数我的测试Excel中数据在2表中  
                if (worksheet == null) return ;

                int iRowCount = worksheet.UsedRange.Rows.Count;
                int iColCount = 8;// worksheet.UsedRange.Columns.Count;//个人根据需求选择数据源的列数
                //生成列头
                for (int i = 0; i < iColCount; i++)
                {
                    var name = columnName[i]; //"column" + i;
                    while (dt.Columns.Contains(name)) name = name + "_1";//重复行名称会报错。
                    dt.Columns.Add(new DataColumn(name, typeof(string)));
                }
                //生成行数据
                Microsoft.Office.Interop.Excel.Range range;
                int rowIdx = 2;//第一行为标题 实际数据从第二行开始
                for (int iRow = rowIdx; iRow <= iRowCount; iRow++)
                {
                    DataRow dr = dt.NewRow();
                    for (int iCol = 1; iCol <= iColCount; iCol++)
                    {
                        range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[iRow, iCol];
                        dr[iCol - 1] = (range.Value2 == null) ? "" : range.Text.ToString();
                    }
                    dt.Rows.Add(dr);
                    Thread.Sleep(0);
                    worker.ReportProgress(iRow*100/iRowCount);//加载进度条
                    if (worker.CancellationPending)  // 如果用户取消则跳出处理数据代码 
                    {
                        e.Cancel = true;
                        break;
                    }
                    
                }

            }
            catch { return; }
            finally
            {
                workbook.Close(false, oMissiong, oMissiong);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                workbook = null;
                app.Workbooks.Close();
                app.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                app = null;
            }
        }

进度条Form RadProcessBar

一个progressBar1 一个按钮

public partial class RadProcessBar : Form
    {
        
        private BackgroundWorker backgroundWorker1; //ProcessForm 窗体事件(进度条窗体) 

        public RadProcessBar(BackgroundWorker backgroundWorker1)
        {
            InitializeComponent();

            this.backgroundWorker1 = backgroundWorker1;
            this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
            this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        }

        void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.Close();//执行完之后,直接关闭页面
        }

        void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
        }

        private void btn_cancel_Click(object sender, EventArgs e)
        {
            this.backgroundWorker1.CancelAsync();
            this.btn_cancel.Enabled = false;
            this.Close();
        }
    }

 

posted on 2015-07-08 17:36  Jruik.shen 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/Jruik/p/Excel.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在CSDN上,我可以分享一段Winform导入Excel保存到数据库的源码。首先,我们需要创建一个Winform窗体,然后添加一个按钮用于触发导入Excel的操作。接着,我们可以编写代码来实现Excel导入操作,具体步骤如下: 1. 引用所需的命名空间: ```csharp using System.Data; using System.Data.OleDb; using System.Windows.Forms; ``` 2. 在按钮的点击事件中编写Excel导入的代码: ```csharp private void btnImport_Click(object sender, EventArgs e) { // 打开文件选择窗口,选择要导入Excel文件 OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Excel文件|*.xls;*.xlsx"; if (openFileDialog.ShowDialog() == DialogResult.OK) { string filePath = openFileDialog.FileName; // 构建Excel连接字符串 string connStr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';", filePath); // 使用OleDb连接到Excel文件 using (OleDbConnection conn = new OleDbConnection(connStr)) { conn.Open(); DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); if (dt != null && dt.Rows.Count > 0) { string sheetName = dt.Rows[0]["TABLE_NAME"].ToString(); // 从Excel中读取数据 string sql = string.Format("SELECT * FROM [{0}]", sheetName); OleDbDataAdapter adapter = new OleDbDataAdapter(sql, conn); DataTable data = new DataTable(); adapter.Fill(data); // 将数据保存到数据库 // 这里可以编写将DataTable中的数据保存到数据库的代码 } } } } ``` 3. 编写保存到数据库的代码: 根据自己的实际情况,可以使用ADO.NET或者Entity Framework等方法将DataTable中的数据保存到数据库。 以上就是简单的Winform导入Excel保存到数据库的代码,希望对你有所帮助。如果需要完整的代码示例,可以在CSDN上搜索相关文章或者向我索取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值