Thursday, July 1, 2010

背景:

大約是在三月初的時候,工作內容調整為帶領一個小團隊開發一個已經執行兩年多的專案。

專案的目標是針對某單位的舊系統轉為.NET平台上的系統。

由於有民國百年的問題,所以系統期望可以在十月份上線。

這三個月的專案執行,自己列出兩點可以改進的部份。

檢討後可以改進的地方:


1. 一開始可以先確定開發項目的重要性,優先次序。

因為此專案已經拖了很長的時間,當初的開發團隊成員都已離職,

因此待補的程式數量很多。

然而我在一開始的時候,只專注在程式預計完成日期排程和工作的安排,

忽略了應該先將所有程式依重要性排定開發的優先次序,

我一開始的想法是盡可能在截止日前完成所有項目,然而,人力上的分配,是很難達成專案目標。

後來發現,某些作業流程是配合不同的時間才需要執行,

所以不是每個功能都需要在十月份之前完成。這表示某些程式可以先完成,

某些程式可以往後推。


2. 確認系統應完成及未完成的狀態。

前面提到,由於原團隊在兩年來已經整批換過,

所以到底有那些程式要開發,那些已經完成,在一開始很難掌握。

還遇到其中一個子系統,程式的部份很多沒有撰寫,但畫面已經處理好,

而上司都以為此系統已經完成,因此過於樂觀評估進度。

確認系統完成度的困難點是在於,要先對已完成系統重新測試,

然後有問題的部份要找出原因,這些都會佔用程式開發的時間。

在專案剛交接的時候,應該要先確認整個系統的執行狀態,重新評估所需時間。


到目前為止,我遇到最大的困難是人力的問題。

由於人員的流動,新進人員訓練後,寫了一小段時間就離職。

然後再補新進人員,要花一些時間上手,之後是否又會發生一樣的狀況?

期望接下來的時間能把比較動要的程式先寫完。

Monday, March 15, 2010

利用程式將資料寫入Excel已經不是第一次了,
如果有時間,應該把這個功能寫成可重復使用的類別。
底下是記錄使用Microsoft.Office.Interop.Excel的過程。

在寫程式之前,要將Microsoft.Office.Interop.Excel加入參考。



Microsoft.Office.Interop.Excel的架構是要先有Application,
然後開啟Workbook,再使用Workbook產生Worksheet。
Worksheet則包含Range,可以存取Cell。
這個架構在下列的網址有更詳細的描述,
http://msdn.microsoft.com/en-us/library/wss56bz7%28v=VS.80%29.aspx

底下是範例程式,

[sourcecode language="csharp"]
using System.IO;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;

string fileName = @"C:\XYZ.XLS";

string[] header = { //...字串陣列 }
string firstLineTitle = "First Line";
string secondLineTitle = "Second Line";

//設定必要的物件
Application oXL = new Excel.Application();
Excel.Workbook oWB;
Excel.Worksheet oSheet;
Excel.Range oRng;

oXL.Visible = true;

//產生一個Workbook物件,並加入Application
oWB = oXL.Workbooks.Add(Missing.Value);

//設定工作表
oSheet = (Excel.Worksheet)oWB.ActiveSheet;

//在工作表的特定儲存格,設定內容
oSheet.Cells[1, 1] = firstLineTitle;
oSheet.Cells[2, 1] = secondLineTitle;


//在特定範圍設定儲存格內容
oSheet.get_Range("A4", "I4").Value2 = header;

DataTable dt = //....取得資料表

//從第五行開始,設定第一欄和第二欄的內容
//資料是從某資料表取出
int row = 5;
for (int counter = 0; counter < dt.Rows.Count; counter++)
{
oSheet.Cells[row, 1] = dt.Rows[counter]["XYZ"].ToString();
oSheet.Cells[row, 2] = dt.Rows[counter]["ABC"].ToString();

row++;
}

//設定為按照內容自動調整欄寬
oRng = oSheet.get_Range("A5", "A" + row.ToString());
oRng.EntireColumn.AutoFit();

//設定為置中
oRng = oSheet.get_Range("B5", "B" + row.ToString());
oRng.EntireColumn.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;


//設定為讓使用者從程式的開始執行後
//就可以操作Excel,例如另存新檔到不同路徑
oXL.Visible = true;
oXL.UserControl = true;

//存檔
//在這裡只設定檔案名稱(含路徑)即可
oWB.SaveAs(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Excel.XlSaveAsAccessMode.xlShared, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

[/sourcecode]

底下是參考文件,
1. http://support.microsoft.com/kb/302084
2. http://msdn.microsoft.com/en-us/library/y1xatbkd%28v=VS.80%29.aspx