在資料呈現上高階主管總是希望一目瞭然,所以很多主管都希望下屬在報告時儘可能用圖形的方式來說明,然而在Visual Studio 2003&2005並沒有內建Chart的控製項(2008有Chart Control,但需要自行下載),下面是我目前所知道在ASP.NET下常用的Chart元件,但我並不會全部說明
接下來的幾天我會陸續介紹WebChart、OWC、Zedgraph、Microsoft Chart Controls for .Net 3.5 ,Dundas的元件是付費所以我不介紹,另外Reporting Service我也不介紹(我不喜歡以嵌入的方式來處理圖形)
2009年7月12日 星期日
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做覆寫,至於詳細的欄位格式,可以參考這裡。
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或當做外部指令應用,底下是它所提供的功能
參與演出角色

浮水印內容

步驟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則會像郵票一樣貼在合併後文件的上面,更詳細的內容請點選這裡。

- 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)
參與演出角色
- 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)
上面的寫法只是提供另一個思維,真正在撰寫時可能要考慮更多東西(例如資料型態的轉型)
一般寫法
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如果沒有加判斷條件會發生一些狀況
原本的程式
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如果沒有加判斷條件會發生一些狀況
- 當mystring = "1"; 時,用Substring則mystring最後值等於"" (理論上是"1");
- 當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"/>
}
上方程式片段有二個重點
<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);";
}
參考來源
首先來看MasterPage(因為筆者的程式有引用MasterPage)的程式片段
<script type="text/javascript" src="../js/jquery.js">
<script type="text/javascript">
function SelectAllCheckboxes(chk) {
<asp:literal id="litCheckAll" runat="server"/>
}
上方程式片段有二個重點
- 需嵌入jquery
- 要利用Literal控制項(因為Literal在產生Html碼時不會加入Html Tag)
<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檔案的內容




希望對大家有些幫助
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檔案的內容
希望對大家有些幫助
訂閱:
文章 (Atom)