2009年5月28日 星期四

C#-.NET調用Excel API

寫程式需要輸出資料的時候,希望能夠整理的很漂亮,常常會希望能夠輸出成xls或xlsx的Excel檔案,
雖然也可以使用csv檔案格式,但是觀看的時候,沒辦法直接用Excel開啟,用記事本打開又不漂亮。

過去微軟沒有直接提供調用Excel函式的功能,不過在.NET時代,微軟總算整合進去了。

下面將要介紹簡單的Excel操作方法,包括開檔、存檔,以及填入表格的功能。
範例是利用WinForm去選擇欄位,並填入資料,最後會再存成一個xlsx檔案(Excel 2007格式)。

  1. 要使用Excel,需要先引入Excel的DLL檔案(Microsoft.Office.Interop.Excel)
    VS.NET2008有兩個DLL檔,11.0版為Excel 2003;12.0版為Excel 2007的。
    匯入Excel的DLL檔案
  2. Excel的架構是活頁簿(Excel的檔案)、工作表(一個檔案可以有多個工作表Sheet)、欄位(由欄、列來組成)。
    因此,使用上需要幾個類別實體來操作:
    (A) Application
    (B) Workbook - 操作活頁簿
    (C) Worksheet - 操作工作表
    (D) Range - 操作欄位(可以為某個矩形範圍,如 A3-C5

    using Microsoft.Office.Interop.Excel;
    //引用Excel Application類別
    _Application myExcel = null;
    //引用活頁簿類別
    _Workbook myBook = null;
    //引用工作表類別
    _Worksheet mySheet = null;
    

  3. 首先,在範例裡面,我在載入WinForm後,將Excel的實體初始化。動作上就如前面說的,依序把Application, 活頁簿, 工作表初始化,並且設定焦點。

    private void InitExcel()
    {
          //開啟一個新的應用程式
          myExcel = new Microsoft.Office.Interop.Excel.Application();
          //加入新的活頁簿
          myExcel.Workbooks.Add(true);
          //停用警告訊息
          myExcel.DisplayAlerts = false;
          //讓Excel文件可見 
          myExcel.Visible = true;
          //引用第一個活頁簿
          myBook = myExcel.Workbooks[1];
          //設定活頁簿焦點
          myBook.Activate();
          //引用第一個工作表
          mySheet = (_Worksheet)myBook.Worksheets[1];
          //命名工作表的名稱為 "Array"
          mySheet.Name = "測試";
          //設工作表焦點
          mySheet.Activate();
    }
    

  4. 需要設定欄位資料的時候,再調用Range來做事。
    範例中,是利用兩個Textbox來選定欄位(.get_Range),再利用第三個Textbox來給定值(.Value2)。

    private void buttonSet_Click(object sender, EventArgs e)
    {
    string col = (string)comboBoxCol.SelectedItem;
    string row = (string)comboBoxRow.SelectedItem;
    Range myRange = null;
    myRange = mySheet.get_Range(col + row, Type.Missing);
    myRange.Value2 = textBoxData.Text;
    }
    

  5. 最後,在程式終了時,將Excel存檔(.SaveAs),並釋放資源。

    private void button1_Click(object sender, EventArgs e)
    {
          //另存活頁簿
          myBook.SaveAs(filename, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
          //關閉活頁簿
          myBook.Close(false, Type.Missing, Type.Missing);
          //關閉Excel
          myExcel.Quit();
          //釋放Excel資源
          System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
          myBook = null;
          mySheet = null;
          myExcel = null;
          GC.Collect();
    }
    


範例程式畫面如下:

範例程式

範例程式下載:Excel範例程式

2009年4月25日 星期六

倉木麻衣 - Time After Time~花舞う街で~



Time After Time~花舞う街で~
這首歌是名偵探柯南 第七部劇場版(2003) 迷宮的十字路口的ED,
Ed搭配了日本的國花櫻花,
整體拍攝手法相當漂亮,
或許是因為是柯南劇場版的MV吧,
所以是少數麻衣的作品裡MV拍攝的不錯的作品。

這首歌同時收錄於第15張同名單曲(2003),以及第4張專輯If I Believe(2003),和第1張精選輯Wish You The Best(2004)。

這首歌最喜歡的應該是整個譜曲相當的優美,
因此也有許多不同樂器的伴奏版本,
在麻衣的柯南系列裡面,應該是排名第一的歌曲吧!
和多數人認識的Secret of My Heart不太一樣! :as24:

下一次預計介紹我第一喜歡的風のららら!

2009年4月22日 星期三

C#-.NET計算運算時間

進行研究、程式、演算法的開發時,
常常會需要計算運算時間,
.NET提供了不錯,且方便的類別工具(Stopwatch)來進行時間的計算。

使用方法很簡單:

首先必須要引入System.Diagnostics的名稱空間。
using System.Diagnostics;

只要在想要開始計算時間時,利用StartNew()函式開始一個新的Counter。

Stopwatch sw;
sw = new Stopwatch();    //Stopwatch類別在System.Diagnostics命名空間裡
sw.Reset();
sw = Stopwatch.StartNew();

再結束計算時間的時候,使用Stop()函式結束計時功能即可。

sw.Stop();

最後,再利用TimeSpan把時間顯示出來即可。

TimeSpan el = sw.Elapsed;
String Text = el.ToString();

附件檔案是利用WPF撰寫的一個DEMO程式。
功能是點下Start按鈕的時候,開始計算時間。按下End按鈕的時候,結束計算時間。

其他還有一些TimeSpan類別還有提供各種顯示時間的方法,
包括以時、分、秒或是日之類的方式顯示,都可以在MSDN上查到。

附件檔案:計算運算時間範例程式

2009年4月11日 星期六

替WordPress增加洋蔥頭外掛

WordPress內建的功能已經很夠架設一個還不錯的Blog了,
但是WordPress最有趣且方便的地方,
就是WordPress可以自由且方便的安裝各式各樣的外掛。

表情符號是寫文章很長使用的工具,
然而,WordPress就跟phpBB一樣,
內建的表情符號非常的虛,且不好看。

就像實驗室的討論區一樣,
我也替它增加了一些新的表情符號,
並且加入了方便使用的工具。

2009年4月10日 星期五

倉木麻衣 - 明日へ架ける橋



這首歌叫做"明日へ架ける橋",中文應該是翻作"通往明日的橋樑",

2009年4月9日 星期四

Konica軟片廣告-李立群版

過去相當知名的Konica軟片(底片)的廣告-『他抓的住我,一次OK』



李立群說的台詞,是從網路上找的,
當時播出的時候聽的還挺清楚的,
不知道是不是轉錄成電腦檔的關係,
有一部分(最可怕的那部分)聽不清楚了!
台詞如下:

我說 人為什麼要拍照
人活得好好的他為什麼要拍照
喔 到底是為了要回味兒
回什麼味兒
回自己的味兒
回自己和大家生活的味兒
回經歷和體驗的味兒
回感受深刻的味兒
回悲歡離合喜怒哀樂的味兒
什麼味兒的照片才叫好呢
拍得漂亮拍得瀟灑拍得清楚拍得得意拍得精彩拍得出色拍得深情拍得智慧
拍得天真浪漫返樸歸真
拍得喜事連連無怨無悔
拍得恍然大悟破鏡重圓
拍得平常心是道拍得日日好日年年好年如夢似真止於至善!
我的天啊!什麼軟片這麼好啊
啪啦!KONICA COLOR
它抓得住我 一次OK

2009年4月8日 星期三

C#-字元與字串切割方法

字元切割-在字串裡面,依指定字元(範例中的,)切割成數個子字串回傳的方法。
字串切割-在字串裡面,依指定字串(範例中的##)切割成數個子字串回傳的方法。

String str = "a,b,c";
String str1 = "a##b##C";
Console.WriteLine("字元切割:");

//字元切割
String[] s = str.Split(',');
foreach (String k in s)
{
        Console.WriteLine(k);
}
Console.WriteLine("字串切割:");

//字串切割
String[] s1 = System.Text.RegularExpressions.Regex.Split(str1, "##");
foreach (String k in s1)
{
        Console.WriteLine(k);
}


這是程式執行的結果:

2009年4月6日 星期一

以Windows Form實現視窗最小化至通知區域

  1. 建立一個Windows Form專案
  2. 替專案加入一個Notify Icon控制項

  3. 替Notify ICON控制項加入一個圖示("ICON"),必須為ico格式,可以利用ToYcon製作。
    若沒有製作的話,會無法在通知區域顯示該圖示。
    並且替Notify ICON控制項設定"Text"以及"Name"。

  4. 替NotifyICON設定項加入一個"DoubleClick事件",並加入下述程式碼
  5. private void notifyIcon1_DoubleClick(object sender, EventArgs e)
    {
        if (this.WindowState == FormWindowState.Minimized)
        {
            this.ShowInTaskbar = true;          // 顯示在系統任務欄
            this.WindowState = FormWindowState.Normal;      // 還原視窗
            notifyIcon1.Visible = false;         //Notify Icon圖示隱藏
        }
    }
    
  6. 替Form加入一個"SizeChanged事件",並加入下述程式碼
  7. private void Form1_SizeChanged(object sender, EventArgs e)
    {
        if (this.WindowState == FormWindowState.Minimized)  // 目前視窗是否為最小化
        {
            this.ShowInTaskbar = false;     //不顯示在系統任務欄
            notifyIcon1.Visible = true;      //Notify Icon圖示顯示
        }
    }
    

這樣就完成了,可以執行測試看看。
點選視窗最小化的時候,可以把視窗縮小到系統通知區。
在系統通知區內點兩次程式的ICON,就可以恢復視窗程式了!

範例程式下載:


ToYcon v0.6下載:

你知道一心,二聖,三多...的意義嗎?

很多人都知道高雄市舊的十條大馬路有個有趣的口訣可以記:
『一心、二聖、三多、四維、五福、六和、七賢、八德、九如、十全』

但是有多少人還記得這些路名怎麼來的嗎?

根據高雄市政府新聞處的『認識高雄』文章內所述,
這幾條路是高雄市首任市長連謀先生在規劃高雄市時所想出來的,
這十條路取自"數字美德":

一心路:取一心一德,萬眾一心,要全體市民同心協力,共創美好未來。
二聖路:在古書上稱周朝文王、武王為二聖,也有稱周公和孔子為二聖,不管何者
皆是令人景仰的古聖先賢,藉此期勉市民見賢思齊。
三多路:「三多」原本是對人的祝賀詞,以此期勉港都人涵養性靈,超凡入聖。
四維路:禮義廉恥正是立國重要基礎,勉勵大家愛鄉愛國,做中流砥柱。
五福路:古書中把「壽、富、康寧、好德、老終命」合稱五福,代表富貴吉祥。
六合路:「六合」指的是天地、四方,也就是「宇宙」,希望市民能胸懷天下,共創大同世界。
七賢路:中國晉朝有「竹林七賢」,淡泊名利,學富五車,足以塑造為港都人楷模,以收潛移默化功效。
八德路:忠孝仁愛信義和平八德,乃為人處事的準則,修身養性的標竿。
九如路:「九如」是祝賀詞,代表人間吉祥。
十全路:十全十美,正是圓滿無缺,更是港都一切建設的最高目標。

而其他類似的路名有以發揚民族精神命名的自由、平等、博愛…等;宣揚三民主義的民族、民權、民生…等;
紀念國家元首的中山、中正…等;省份的福建、廣東…等;當地地名的左營、楠梓…等;根據居民意見的果貿、福東…等。
也算是相當有趣的一段歷史。

尤其前面說的十條路名,更是十條依序一路北上,橫貫東西高雄的十條路,更方便當地人記住路名。

如何解決MathType放入word後會放大行距的問題

MathType是一個相當優秀的數學方程式編輯器,
它依據Windows OLE設計,
因此在word文件內是一個物件,放大縮小不會破壞物件的樣式。
而且功能也比office內建的方程式編輯器強大許多(廢話,內建的是3.0版,目前已經出到6.5版本了!)
而且MathType也支援TEX語法輸入,以及將MathType建立的方程式轉換成TEX語法。
並且MathType也可以輸出成網頁,將建立的方程式放到網頁上。