2009年7月12日 星期日

WebChart介紹1

在資料呈現上高階主管總是希望一目瞭然,所以很多主管都希望下屬在報告時儘可能用圖形的方式來說明,然而在Visual Studio 2003&2005並沒有內建Chart的控製項(2008有Chart Control,但需要自行下載),下面是我目前所知道在ASP.NET下常用的Chart元件,但我並不會全部說明
  1. WebChart(dotNet 1.1可用,2.0以上未試過,是free元件)
  2. OWC
  3. Zedgraph(授權)
  4. Dundas(付費軟體,目前為Chart元件的領導廠商)
  5. Microsoft Chart Controls for .Net 3.5 (安裝至 .NET 3.5 SP1 才能正確使用該元件,控制項核心是微軟跟Dundas公司購買 Dundas Data Visualization 元件)
  6. Reporting Service(在ASP.Net嵌入Reporting Service報表檔的url)
接下來的幾天我會陸續介紹WebChart、OWC、Zedgraph、Microsoft Chart Controls for .Net 3.5 ,Dundas的元件是付費所以我不介紹,另外Reporting Service我也不介紹(我不喜歡以嵌入的方式來處理圖形)

2009年7月2日 星期四

ASP.NET匯出Excel時,指定欄位格式

在系統開發時,使用者通常會想要網頁提供匯出Excel的功能,在我們實作這個功能時常常會遇到格式的問題,譬如說在網頁上的手機欄位顯示是正常格式(09xxxxxxxx),但匯出Excel後居然變成9xxxxxxxx,底下的程式片段可避免格式跑掉
Response.Clear();
Response.Charset = "big5";
Response.AddHeader("Content-Disposition", "attachment;filename=myExcel.xls");
Response.ContentType = "application/vnd.ms-excel";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("big5");
Response.Write("<html><body>");
Response.Write("<meta http-equiv=Content-Type content=text/html; charset=big5>"); //避免亂碼
Response.Write("<style type=text/css>");
Response.Write("td{mso-number-format:\"\\@\";}"); //將所有欄位格式改為"文字"
Response.Write("</style>");
Response.Write("<table>");
.
.
.
Response.Write("</table>");
Response.Write("</body></html>");
上方的程式碼片段是讓匯出的Excel檔儲存格格式強制為文字。那如果有部份欄位需要數字的儲存格式該如何處理?
Response.Write("<td style=\"mso-number-format:'0\\.0'\">"+欄位內容值+"</td>");
主要的做法就是利用css定義整個Excel欄位的格式,再利用td的style做覆寫,至於詳細的欄位格式,可以參考這裡

2009年6月22日 星期一

the pdf toolkit(pdftk)

今天向大家介紹一套免費的PDF工具 pdftk,為什麼會介紹這個軟體,因為它可以做command-line,所以我們可以將它整合在系統的Job或當做外部指令應用,底下是它所提供的功能
  • Merge PDF Documents
  • Split PDF Pages into a New Document
  • Rotate PDF Pages or Documents
  • Decrypt Input as Necessary (Password Required)
  • Encrypt Output as Desired
  • Fill PDF Forms with FDF Data or XFDF Data and/or Flatten Forms
  • Apply a Background Watermark or a Foreground Stamp
  • Report on PDF Metrics such as Metadata, Bookmarks, and Page Labels
  • Update PDF Metadata
  • Attach Files to PDF Pages or the PDF Document
  • Unpack PDF Attachments
  • Burst a PDF Document into Single Pages
  • Uncompress and Re-Compress Page Streams
  • Repair Corrupted PDF (Where Possible)
接下來我僅針對浮水印部份來做Demo說明
參與演出角色
  • pdftk.exe
  • 原稿PDF(取名為 in.pdf)
  • 浮水印PDF(取名為 back.pdf)
  • 產出後PDF(取名為 out.pdf)
首先我們來看原稿內容


浮水印內容


步驟1、我們將 pdftk.exe、in.pdf、back.pdf一併放置在C:\ 底下
步驟2、利用開始-執行鍵入cmd,進入命令提示字元
步驟3、在c:\ 下輸入 pdftk in.pdf background back.pdf output out.pdf


在這裡有關浮水印的參數有background及stamp,二者的差別在background會將浮水印放在合併後文件的下面,而stamp則會像郵票一樣貼在合併後文件的上面,更詳細的內容請點選這裡

2009年6月10日 星期三

Stored Procedure中為流水編號補0

在系統開發中有時需要產生一些流水編號,例如格式為yyyymmnnnn(2009060001),通常在產生新的流水編號前,我們會利用SELECT語法得出某個期間內的最後一個流水編號,以上面的格式來說,如果沒有200906開頭的流水編號,表示流水編號由1開始,相反地如果有則把流水編號加1,在這裡我只針對流水號補0來說明,底下有二段程式片段,第一段是一般寫法,第二段則是比較精簡的寫法
一般寫法
IF (LEN(@num) = 1)
BEGIN
   SET @num = '000' + @num
END
ELSE IF (LEN(@num) = 2)
BEGIN
   SET @num = '00' + @num
END
ELSE IF (LEN(@num) = 3)
BEGIN
   SET @num = '0' + @num
END

精簡寫法
SET @num = RIGHT(('0000' + @num), 4)

上面的寫法只是提供另一個思維,真正在撰寫時可能要考慮更多東西(例如資料型態的轉型)

2009年6月7日 星期日

去除字串最後一個逗號

在一些狀況下,我們可能需要傳送一連串的值給Stored Procedure,所以我們會在程式中串接字串,因為是用for-loop之類的方法,所以字串後面都會多個分隔符號,為了刪除最後一個分隔符號程式設計師大都會用String類別的一些方法去刪除,有些程式設計師會用Substring來處理,在這裡提供比較好的做法。

原本的程式
string mystring = "1,2,3,";
mystring = mystring.Substring(0, mystring.Length-1);

建議
string mystring = "1,2,3,";
mystring = mystring.TrimEnd(new char[]{','});

為什麼說TrimEnd是比較好的做法,因為要用Substring要加更多判斷條件
Substring如果沒有加判斷條件會發生一些狀況
  1. 當mystring = "1"; 時,用Substring則mystring最後值等於"" (理論上是"1");
  2. 當mystring = ""; 時,會發生System.ArgumentOutOfRangeException: 長度不可以小於零。

2009年6月5日 星期五

使用jquery全選/清除CheckBox

過去要在GridView的Header加入CheckBox的全選/清除功能,不外乎有二種做法,第一種是在Server-side做,也就是在.cs檔裡撰寫相關事件程式,第二種則是利用javascript撰寫Client端的程式,先取待Table的id (GridView的ClientID),再利用for-loop逐筆選取或清除。今天介紹一個方法(Client端做法)可以讓程式更簡潔
首先來看MasterPage(因為筆者的程式有引用MasterPage)的程式片段
<script type="text/javascript" src="../js/jquery.js">
<script type="text/javascript">
function SelectAllCheckboxes(chk) {
  <asp:literal id="litCheckAll" runat="server"/>
}

上方程式片段有二個重點
  1. 需嵌入jquery
  2. 要利用Literal控制項(因為Literal在產生Html碼時不會加入Html Tag)
接下來我們來看.aspx檔的程式片段
<HeaderTemplate>
  全選/清除
  <br />
  <asp:CheckBox ID="chkAll"
    onclick="javascript:SelectAllCheckboxes(this);" runat="server" />
</HeaderTemplate>

上方程式主要目的是要為GridView Header裡的全選/清除CheckBox加入onclick的事件

最後來看.cs檔的程式片段
if (!IsPostBack) {
//動態產生全選/清除的javascript function
//在MasterPage中已加入jquery的js檔
  ((Literal)Master.FindControl("litCheckAll")).Text = "$('#" + gvPlanList.ClientID + " >tbody >tr >td >input:checkbox').attr('checked', chk.checked);";
}

參考來源

2009年6月1日 星期一

.Net Reflector

有時候我們承接別人遺留下來的專案,看到密密麻麻的程式,心裡難免會罵一聲暗,如果程式只是一個執行檔(exe)又沒有source code,那絕對會想殺人,這裡介紹一個工具Red Gate's .NET Reflector,這個工具可以檢視.Net所撰寫的組件(dll)或執行檔(exe)的內容,首先底下是source code
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1 {
 class Program {
  static void Main(string[] args) {
   Console.Write("Hello World!");
  }
 }
}
這是一個簡易的主控台應用程式專案,專案輸出類型為類別庫(dll),接下來我們會利用Red Gate's .NET Reflector工具檢梘dll檔案的內容





希望對大家有些幫助