1. 程式人生 > >C#實戰028:OleDb操作-Excel資料寫入

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資料寫入