当前位置:知识问问>百科知识>C#实战022:OleDb操作Excel功能集合

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

2024-12-28 22:58:39 编辑:join 浏览量:558

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

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

原始数据较多,需多表单操作,同时需要反复计算并提取计算后的结果在进行二次计算。

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

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

//链接数据库

string strConn = "";

//创建进程对象

Process[] ExcelProcess = Process.GetProcessesByName("Excel");

//关闭进程

foreach (Process p in ExcelProcess)

{

p.Kill();

}

List tableName = new List();

#region

#endregion

if (File.Exists(ExcelName))//判断文件是否存在

{

FileInfo file = new FileInfo(ExcelName);//读取excel文件名

string fileType = file.Extension;//提取excel文件名后缀,判断文件名类型

//----------------------------获取Excel表格数据---------------------------

if (fileType == ".xls")

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

strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" + ExcelName + @";Extended Properties='Excel 8.0;HDR=Yes;IMEX=0'";

else

//读取“.xlsx”时使用 "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ExcelPath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'"Office 07以下版本

strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" + ExcelName + @";Extended Properties='Excel 8.0;HDR=Yes;IMEX=0'";

}

OleDbConnection myCon = new OleDbConnection(strConn); //连接数据库

myCon.Open();//打开数据库

//查询Excel中的工作表

DataTable dt = myCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //获取所有sheet的名字

foreach (DataRow row in dt.Rows)

{

string SheetTableName = row["TABLE_NAME"].ToString();

if (SheetTableName.Contains("$") && SheetTableName.Replace("'", "").EndsWith("$")) //过滤无效SheetName

{

SheetTableName = SheetTableName.Replace("'", "");

SheetTableName = SheetTableName.Substring(0, SheetTableName.Length - 1);

tableName.Add(SheetTableName);

}

}

//缓存数据到内存中

string sheet1 = "select*from[客户排配计划$]";//定义Excel工作表单

OleDbDataAdapter Command1 = new OleDbDataAdapter(sheet1, myCon);//从工作表中查询数据

DataSet sheetdata1 = new DataSet(); //创建数据集对象

Command1.Fill(sheetdata1, "客户排配计划");//填充数据集

string sheet2 = "select*from[刀具寿命$]";//定义Excel工作表单

OleDbDataAdapter Command2 = new OleDbDataAdapter(sheet2, myCon);//从工作表中查询数据

DataSet sheetdata2 = new DataSet(); //创建数据集对象

Command2.Fill(sheetdata2, "刀具寿命");//填充数据集

//创建新的工作表

OleDbCommand cmd = myCon.CreateCommand();//创建工作表命令

string sheetName1 = "刀具预估数量";

if (tableName.Contains(sheetName1))

{

cmd.CommandText = "DROP TABLE 刀具预估数量";

cmd.ExecuteNonQuery();// 执行创建sheet的语句

}

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)";

cmd.ExecuteNonQuery();

这里有个重点,要想在新的工作表中存入数据,就必有有对应的行数,也就是必须先插入相应的行才能为后续的数据提供存储的位置

for (int i = 1; i < sheet2Rows; i++)

{

cmd.CommandText = " insert into 刀具预估数量 (序号) values (" + Convert.ToString(i) + ")";

cmd.ExecuteNonQuery();

//Console.WriteLine("这是新增的数据" + i);

}

#region 判断Forecast中的值并进行赋值

for (int i = 1; i < 5; i++)//基数判断

{

for (int j = 2; j < sheet3Columns; j++)

{

double a = 0;

if (sheetdata3.Tables.Rows[i][j].ToString() == "" || sheetdata3.Tables.Rows[i][j].ToString() == "/")

{

a = 1;

}

else

{

bool ws4value1 = double.TryParse(sheetdata3.Tables.Rows[i][j].ToString(), out a);

}

sheetdata3.Tables.Rows[i][j] = a;

//Console.WriteLine("成功修改第+"+a);

}

}

#endregion

网上都说OleDb没法再特定的单元格进行赋值,其实并不是不能,而是没找到对方法,想要用OleDb插入数据你就要懂得mysql数据库的操作方法。

在插入数据之前最好先将数据缓存到内存中,别直接赋值,不然到后面找不到数据了(我一开始就是忽略了这点,在数据比对时怎么也没法查到数据)

标签:C#,OleDb

版权声明:文章由 知识问问 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.zhshwenwen.com/article/483428.html
热门文章