首页 > Office专区 > Excel教程 >

C#实战022:OleDb操作Excel功能集合

来源:互联网 2023-02-21 15:51:54 412

市场提出需求,希望我们能写一个Excel计算软件帮他们提升工作效率,因为大量的数据计算和反复的查询消耗了太大的人力和时间,而且是经常需要如此反复的操作,工作枯燥一不小心就容易算错。Chy办公区 - 实用经验教程分享!

C#实战022:OleDb操作Excel功能集合Chy办公区 - 实用经验教程分享!

工具/原料

  • Excel
  • C#

方法/步骤

  • 1

    原始数据较多,需多表单操作,同时需要反复计算并提取计算后的结果在进行二次计算。Chy办公区 - 实用经验教程分享!

    一开始我用Excel组件写了一个程序,虽然功能实现了,但是因为时刻操作者excel表,所以导致计算效率有点慢,整个计算过程话费了2-3分钟,不太理想。Chy办公区 - 实用经验教程分享!

    C#实战022:OleDb操作Excel功能集合Chy办公区 - 实用经验教程分享!

  • 2

    所以这次改用OleDb来计算,OleDb可以把excel文件作为数据源来读取,直接用Sql语句来操作数据,并且不需要安装Office Excel就可以使用,所以用OLEDB方式读取EXCEL的速度是非常快的。Chy办公区 - 实用经验教程分享!

  • 3

    //链接数据库Chy办公区 - 实用经验教程分享!

    string strConn = "";Chy办公区 - 实用经验教程分享!

    //创建进程对象Chy办公区 - 实用经验教程分享!

    Process[] ExcelProcess = Process.GetProcessesByName("Excel");Chy办公区 - 实用经验教程分享!

    //关闭进程Chy办公区 - 实用经验教程分享!

    foreach (Process p in ExcelProcess)Chy办公区 - 实用经验教程分享!

    {Chy办公区 - 实用经验教程分享!

    p.Kill();Chy办公区 - 实用经验教程分享!

    }Chy办公区 - 实用经验教程分享!

    Liststring> tableName = new Liststring>();Chy办公区 - 实用经验教程分享!

    #regionChy办公区 - 实用经验教程分享!

    Chy办公区 - 实用经验教程分享!

    #endregionChy办公区 - 实用经验教程分享!

    if (File.Exists(ExcelName))//判断文件是否存在Chy办公区 - 实用经验教程分享!

    {Chy办公区 - 实用经验教程分享!

    FileInfo file = new FileInfo(ExcelName);//读取excel文件名Chy办公区 - 实用经验教程分享!

    string fileType = file.Extension;//提取excel文件名后缀,判断文件名类型Chy办公区 - 实用经验教程分享!

    //----------------------------获取Excel表格数据---------------------------Chy办公区 - 实用经验教程分享!

    if (fileType == ".xls")Chy办公区 - 实用经验教程分享!

    //读取“.xls”时使用"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" ExcelPath ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'" Office 07及以上版本 不能出现多余的空格 而且分号注意Chy办公区 - 实用经验教程分享!

    strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" ExcelName @";Extended Properties='Excel 8.0;HDR=Yes;IMEX=0'";Chy办公区 - 实用经验教程分享!

    elseChy办公区 - 实用经验教程分享!

    //读取“.xlsx”时使用 "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" ExcelPath ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'"Office 07以下版本Chy办公区 - 实用经验教程分享!

    strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" ExcelName @";Extended Properties='Excel 8.0;HDR=Yes;IMEX=0'";Chy办公区 - 实用经验教程分享!

    }Chy办公区 - 实用经验教程分享!

    Chy办公区 - 实用经验教程分享!

    OleDbConnection myCon = new OleDbConnection(strConn); //连接数据库 Chy办公区 - 实用经验教程分享!

    myCon.Open();//打开数据库Chy办公区 - 实用经验教程分享!

    C#实战022:OleDb操作Excel功能集合Chy办公区 - 实用经验教程分享!

  • 4

    //查询Excel中的工作表Chy办公区 - 实用经验教程分享!

    DataTable dt = myCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //获取所有sheet的名字Chy办公区 - 实用经验教程分享!

    foreach (DataRow row in dt.Rows)Chy办公区 - 实用经验教程分享!

    {Chy办公区 - 实用经验教程分享!

    string SheetTableName = row["TABLE_NAME"].ToString();Chy办公区 - 实用经验教程分享!

    if (SheetTableName.Contains("$") && SheetTableName.Replace("'", "").EndsWith("$")) //过滤无效SheetNameChy办公区 - 实用经验教程分享!

    {Chy办公区 - 实用经验教程分享!

    SheetTableName = SheetTableName.Replace("'", "");Chy办公区 - 实用经验教程分享!

    SheetTableName = SheetTableName.Substring(0, SheetTableName.Length - 1);Chy办公区 - 实用经验教程分享!

    tableName.Add(SheetTableName);Chy办公区 - 实用经验教程分享!

    }Chy办公区 - 实用经验教程分享!

    }Chy办公区 - 实用经验教程分享!

    C#实战022:OleDb操作Excel功能集合Chy办公区 - 实用经验教程分享!

  • 5

    //缓存数据到内存中Chy办公区 - 实用经验教程分享!

    string sheet1 = "select*from[客户排配计划$]";//定义Excel工作表单Chy办公区 - 实用经验教程分享!

    OleDbDataAdapter Command1 = new OleDbDataAdapter(sheet1, myCon);//从工作表中查询数据Chy办公区 - 实用经验教程分享!

    DataSet sheetdata1 = new DataSet(); //创建数据集对象Chy办公区 - 实用经验教程分享!

    Command1.Fill(sheetdata1, "客户排配计划");//填充数据集Chy办公区 - 实用经验教程分享!

    Chy办公区 - 实用经验教程分享!

    string sheet2 = "select*from[刀具寿命$]";//定义Excel工作表单Chy办公区 - 实用经验教程分享!

    OleDbDataAdapter Command2 = new OleDbDataAdapter(sheet2, myCon);//从工作表中查询数据Chy办公区 - 实用经验教程分享!

    DataSet sheetdata2 = new DataSet(); //创建数据集对象Chy办公区 - 实用经验教程分享!

    Command2.Fill(sheetdata2, "刀具寿命");//填充数据集Chy办公区 - 实用经验教程分享!

    C#实战022:OleDb操作Excel功能集合Chy办公区 - 实用经验教程分享!

  • 6

    //创建新的工作表Chy办公区 - 实用经验教程分享!

    OleDbCommand cmd = myCon.CreateCommand();//创建工作表命令Chy办公区 - 实用经验教程分享!

    string sheetName1 = "刀具预估数量";Chy办公区 - 实用经验教程分享!

    if (tableName.Contains(sheetName1))Chy办公区 - 实用经验教程分享!

    {Chy办公区 - 实用经验教程分享!

    cmd.CommandText = "DROP TABLE 刀具预估数量";Chy办公区 - 实用经验教程分享!

    cmd.ExecuteNonQuery();// 执行创建sheet的语句Chy办公区 - 实用经验教程分享!

    }Chy办公区 - 实用经验教程分享!

    cmd.CommandText = "CREATE TABLE 刀具预估数量 ([序号] INTEGER, [夹位] VarChar, [刀号] VarChar,[刀具规格] VarChar,[1月] VarChar,[2月] VarChar,[3月] VarChar,[4月] VarChar,[5月] VarChar,[6月] VarChar,[7月] VarChar,[8月] VarChar,[9月] VarChar,[10月] VarChar,[11月] VarChar,[12月] VarChar)";Chy办公区 - 实用经验教程分享!

    cmd.ExecuteNonQuery();Chy办公区 - 实用经验教程分享!

    C#实战022:OleDb操作Excel功能集合Chy办公区 - 实用经验教程分享!

  • 7

    这里有个重点,要想在新的工作表中存入数据,就必有有对应的行数,也就是必须先插入相应的行才能为后续的数据提供存储的位置Chy办公区 - 实用经验教程分享!

    for (int i = 1; i sheet2Rows; i )Chy办公区 - 实用经验教程分享!

    {Chy办公区 - 实用经验教程分享!

    cmd.CommandText = " insert into 刀具预估数量 (序号) values (" Convert.ToString(i) ")";Chy办公区 - 实用经验教程分享!

    cmd.ExecuteNonQuery();Chy办公区 - 实用经验教程分享!

    //Console.WriteLine("这是新增的数据" i);Chy办公区 - 实用经验教程分享!

    }Chy办公区 - 实用经验教程分享!

    C#实战022:OleDb操作Excel功能集合Chy办公区 - 实用经验教程分享!

  • 7该信息未经授权抓取自百度经验
  • 8

    #region 判断Forecast中的值并进行赋值Chy办公区 - 实用经验教程分享!

    for (int i = 1; i 5; i )//基数判断Chy办公区 - 实用经验教程分享!

    {Chy办公区 - 实用经验教程分享!

    for (int j = 2; j sheet3Columns; j )Chy办公区 - 实用经验教程分享!

    {Chy办公区 - 实用经验教程分享!

    double a = 0;Chy办公区 - 实用经验教程分享!

    if (sheetdata3.Tables[0].Rows[i][j].ToString() == "" || sheetdata3.Tables[0].Rows[i][j].ToString() == "/")Chy办公区 - 实用经验教程分享!

    {Chy办公区 - 实用经验教程分享!

    a = 1;Chy办公区 - 实用经验教程分享!

    }Chy办公区 - 实用经验教程分享!

    elseChy办公区 - 实用经验教程分享!

    {Chy办公区 - 实用经验教程分享!

    bool ws4value1 = double.TryParse(sheetdata3.Tables[0].Rows[i][j].ToString(), out a);Chy办公区 - 实用经验教程分享!

    }Chy办公区 - 实用经验教程分享!

    sheetdata3.Tables[0].Rows[i][j] = a;Chy办公区 - 实用经验教程分享!

    //Console.WriteLine("成功修改第 " a);Chy办公区 - 实用经验教程分享!

    }Chy办公区 - 实用经验教程分享!

    }Chy办公区 - 实用经验教程分享!

    #endregionChy办公区 - 实用经验教程分享!

    C#实战022:OleDb操作Excel功能集合Chy办公区 - 实用经验教程分享!

  • 9

    网上都说OleDb没法再特定的单元格进行赋值,其实并不是不能,而是没找到对方法,想要用OleDb插入数据你就要懂得mysql数据库的操作方法。Chy办公区 - 实用经验教程分享!

    在插入数据之前最好先将数据缓存到内存中,别直接赋值,不然到后面找不到数据了(我一开始就是忽略了这点,在数据比对时怎么也没法查到数据)Chy办公区 - 实用经验教程分享!

    C#实战022:OleDb操作Excel功能集合Chy办公区 - 实用经验教程分享!

  • 以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!Chy办公区 - 实用经验教程分享!


    标签: excel实战操作功能集合

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码