C#实战028:OleDb操作-Excel数据写入

前面写了C#实战021:OleDb操作-新增Excel中的sheet工作表,接下来我们就要在新增的表中添加数据了,在网上找了很多方法,都没有OleDb对excel表操作批量操作,后来通过对mysql的研究终于还是找到了合适的方法。

我们先来新建一个带表头的空表单,为表单先创建个表头,相当于在mysql先建立些空字段。

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

建完表单我们并无法再该表中添加数据,因为这时候该表是0行的,既然没有行自然就没法再对应的单元格进行赋值的,所以我们还需要插入一定的行数,这个数量就看你的需求了,我在这里写了一个序列,相信每个表都需要有这一列吧。

for (int i = 1; i < sheet2Rows; i++)
{
    cmd.CommandText = " insert into 刀具预估数量 (序号) values (" + Convert.ToString(i) + ")";
    cmd.ExecuteNonQuery();
    //Console.WriteLine("这是新增的数据" + i);
}

有了对应的行数我们就可以将该表存到内存中去了,这样内存中就有了对应的行和列的一个空表单

string sheet4 = "select*from[刀具预估数量$]";//定义Excel工作表单
OleDbDataAdapter Command4 = new OleDbDataAdapter(sheet4, myCon);//从工作表中查询数据
DataSet sheetdata4 = new DataSet(); //创建数据集对象
Command4.Fill(sheetdata4, "刀具预估数量");//填充数据集 

接下来就可以给对应的单元格进行赋值了,这里需要注意的是OleDb操作Excel时它的起始是0,而不是1(而且表头除外)。

在我们将数据写入到Excel表中之前,我们最好现将数据写入对应的缓存表中,这样在后面的计算中才能找到我们所需的数据(要想计算的快,最好从缓存中提取数据,而非再次读取Excel)。

 // 添加数据
for (int i = 1; i < sheet2Rows; i++)
{
    sheetdata4.Tables[0].Rows[i - 1]["夹位"] = sheetdata2.Tables[0].Rows[i][1].ToString().Trim(); //夹位
    sheetdata4.Tables[0].Rows[i - 1]["刀号"] = sheetdata2.Tables[0].Rows[i][2].ToString().Trim();//刀号
    sheetdata4.Tables[0].Rows[i - 1]["刀具规格"] = sheetdata2.Tables[0].Rows[i][5].ToString().Trim();//刀具规格
    //Console.WriteLine("成功赋值:"+i);
}

然后我们再从缓存中区提取要写入Excel中的数据,因为是数据库读取的数据,所以数据再插入时并不能像Excel组件那样循环写入了,它只能一个字段字段的写入,所以这里我们只能列循环,而无法行循环。

for (int i = 1; i < sheet2Rows; i++)
{
    string d1 = Convert.ToString(i);
    string d2 = sheetdata4.Tables[0].Rows[i - 1]["夹位"].ToString().Trim();
    string d3 = sheetdata4.Tables[0].Rows[i - 1]["刀号"].ToString().Trim();
    string d4 = sheetdata4.Tables[0].Rows[i - 1]["刀具规格"].ToString().Trim();
    //Console.WriteLine(d2);
    //Console.WriteLine(d3);
    //Console.WriteLine(d4);
    cmd.CommandText = "UPDATE  [" + sheetName1 + "] SET 夹位='" + d2 + "' WHERE 序号=" + d1 + "";
    cmd.ExecuteNonQuery();
    cmd.CommandText = "UPDATE  [" + sheetName1 + "] SET 刀号='" + d3 + "' WHERE 序号=" + d1 + "";
    cmd.ExecuteNonQuery();
    cmd.CommandText = "UPDATE  [" + sheetName1 + "] SET 刀具规格='" + d4 + "' WHERE 序号=" + d1 + "";
    cmd.ExecuteNonQuery();
    //Console.WriteLine("这是新增的数据" + i);
}

这样我们就需要在对应的列表中写入循环就可以将数据一列列的写入到Excel表中了。

由于OleDb操作对Excel的控制性不高,所以要想把表格属性也控制好,这时候我们可以结合Excel组件来帮助我们完成,只要把处理数据这重要的部分交给OleDbl来操作即可。

//设置表单样式
App = new Excel.Application();       //创建 Excel对象
object missing = Missing.Value;            //获取缺少的object类型值
wb = App.Workbooks.Open(ExcelName, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
Excel.Worksheet ws1 = ((Excel.Worksheet)wb.Worksheets["刀具预估数量"]);//方法一:指定工作表名称读取
Excel.Worksheet ws2 = ((Excel.Worksheet)wb.Worksheets["Forecast"]);//方法一:指定工作表名称读取
ws1.get_Range("A1", "P1").Interior.ColorIndex = 14;//填充背景色
ws1.get_Range("A1", "P1").Borders.LineStyle = 1;//设置表格的线宽
ws2.get_Range("A1", "P1").Interior.ColorIndex = 14;//填充背景色
ws2.get_Range("A1", "P1").Borders.LineStyle = 1;//设置表格的线宽
ws1.get_Range("A1").ColumnWidth = 5;   //固定宽度
ws1.get_Range("B1").ColumnWidth = 10;
ws1.get_Range("C1").ColumnWidth = 10;
ws1.get_Range("D1").ColumnWidth = 15;
ws2.get_Range("A1").ColumnWidth = 5;   //固定宽度
ws2.get_Range("B1").ColumnWidth = 25;
ws2.get_Range("C1").ColumnWidth = 15;
wb.Save();
App.Visible = true;

首发百度经验:  C#实战023:OleDb操作-Excel数据写入 

猜你喜欢

转载自blog.csdn.net/kevinfan2011/article/details/84797066