2013年12月27日 星期五

Excel相關應用

常常需要透過程式與Excel檔案做一些互動,用久了不外乎就是那幾種應用,這邊做個歸納供需要的時候取用。

一、產生新的Excel檔案
    1.先確定方案總管的參考裡面有Microsoft.Office.Interop.Excel 如果沒有請自行安裝。
    2.using Microsoft.Office.Interop.Excel;
    3.
    //建立Excel物件
    Microsoft.Office.Interop.Excel.Application xlapp =                     
    new Microsoft.Office.Interop.Excel.Application();
    
    //顯式檔案
    xlapp.Visible = true;
    
    //建立WorkBook物件
    Workbook wb = xlapp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
            
    //建立WorkSheet物件
    Worksheet ws = (Worksheet)wb.Sheets[1];

    //指定要控制的藍為範圍
    Range rg = ws.get_Range("A:K", System.Type.Missing);
    
    //字型大小
    rg.Font.Size = 10;

    //字型粗體
    rg.Font.Bold = true;

    //儲存格設為純文字
    rg.NumberFormatLocal = "@";

    //背景顏色    
    rg.Cells.Interior.Color = ColorTranslator.ToOle(Color.FromArgb(255,255,0));
    
二、讀取現有的Excel檔案
 
    //宣告路徑字串
    string sFileWithPath = null;

    //宣告開檔對話框的物件  
    OpenFileDialog OFDialog1 = new OpenFileDialog();
 
    //指定預設開己的路徑為桌面
    OFDialog1.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
         
    //預設顯式Excel檔案
    OFDialog1.Filter = "*.xlsx|*.XLSX|*.xls|*.XLS";

    if (OFDialog1.ShowDialog() == DialogResult.OK)
    {
        sFileWithPath = OFDialog1.FileName;
        xlapp.Visible = true;
        Workbook wb = xlapp.Workbooks.Open(sFileWithPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        Worksheet ws = (Worksheet)wb.Sheets[1];     //指定第1個Sheet

        Range rg = ws.get_Range("L:X", System.Type.Missing);    //設定要控制的欄位區間
    .......
    ....
    }

三、金額處理
 若有一金額為99,999,用字串時需要千分位符號,計算時需拿掉。
   String to Double:
      string sMoney = "99,9999";
      double dMoneyCount = Convert.ToDouble(sMoney.Replace(",",""));
  Double to String:
      double dMoneyCount = 999999.0;
      string sMoney = dMoneyCount.ToString("#,##");


















2013年11月22日 星期五

將PDF檔加密碼 Encrypt PDF File

1.download iTextSharp.dll,Please find it by yourself

At VS2012 or other version:
2.import iTextSharp to reference
3.using System.IO;
   using iTextSharp.text;
   using iTextSharp.text.pdf;
4.At Button Event:
 private void button1_Click(object sender, EventArgs e)
        {
            Stream myStream = null;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            openFileDialog1.InitialDirectory = "c:\\";
            openFileDialog1.Filter = "pdf files (*.pdf)|*.pdf|All files (*.*)|*.*";
            //openFileDialog1.FilterIndex = 2;
            openFileDialog1.RestoreDirectory = true;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    string filename = Path.GetFileName(openFileDialog1.FileName);
                   
                    if ((myStream = openFileDialog1.OpenFile()) != null)
                    {
                        textBox1.Text = filename;

                        string WorkingFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                        string InputFile = Path.Combine(WorkingFolder, "xx.pdf");
                        string OutputFile = Path.Combine(WorkingFolder, "xx_enc.pdf");

                        using (Stream input = new FileStream(InputFile, FileMode.Open, FileAccess.Read, FileShare.Read))
                        {
                            using (Stream output = new FileStream(OutputFile, FileMode.Create, FileAccess.Write, FileShare.None))
                            {
                                PdfReader reader = new PdfReader(input);
                                PdfEncryptor.Encrypt(reader, output, true, "secret", "secret", PdfWriter.ALLOW_SCREENREADERS);
                               
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
                }
            }
        }

2013年11月14日 星期四

Download file from FTP Server

    try
            {
                string FileNameToDownload = "filename.txt";  //檔名
                string DownloadFilePath = @"D://";  //存檔路徑
                FileStream outputStream = new FileStream(DownloadFilePath + "\\" + FileNameToDownload, FileMode.Create);

                string FTPip = "192.168.100.100"; //FTP Server IP
                FtpWebRequest repFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://"+FTPip+"/path/"+FileNameToDownload));
                repFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                repFTP.UseBinary = true;
                repFTP.Proxy = null;
                string ftpUserID = "user";
                string ftpPassword = "password";
                repFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);

                FtpWebResponse response = (FtpWebResponse)repFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                long cl = response.ContentLength;
                int buffersize = 2048;
                int readCount;
                byte[] buffer = new byte[buffersize];

                readCount = ftpStream.Read(buffer, 0, buffersize);
                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);
                    readCount = ftpStream.Read(buffer, 0, buffersize);
                }
                ftpStream.Close();
                outputStream.Close();
                response.Close();
                MessageBox.Show("Complete!");
            }
            catch (WebException ex)
            {
                String status = ((FtpWebResponse)ex.Response).StatusDescription;
                MessageBox.Show(status);
            }

2013年8月20日 星期二

VS2012編譯出來的執行檔在XP 32執行

專案 -> 屬性


應用程式 -> 目標Framework(G):.NET Framwork 4


建置 -> 平台目標:x86

2013年8月8日 星期四

Which RadioButton selected inside GroupBox or Panel

foreach (RadioButton rb in groupBox5.Controls.OfType<RadioButton>())
{
    if(rb.Checked)
        MessageBox.Show(rb.text);
}

在Windows Form上面放一個Table,動態產生XY軸及控制項

我不會將Code鉅細靡遺通通放上來,基本操作是programer的基本功,應該自己想辦法弄懂。

1.依指定的XY數量產生表格:先放一個TableLayoutPanel元件,建立一個Function:

//定益表格參數
int y = 3;
int x = 2;          
tableLayoutPanel1.Visible = false;
tableLayoutPanel1.BackColor = Color.FromArgb(192, 255, 192);
tableLayoutPanel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
tableLayoutPanel1.Controls.Clear();
tableLayoutPanel1.ColumnStyles.Clear();
tableLayoutPanel1.RowStyles.Clear();
tableLayoutPanel1.Refresh();
tableLayoutPanel1.RowCount = y;
tableLayoutPanel1.ColumnCount = x;

for (int co = 0; co < x; co++)
{
    ColumnStyle cs = new ColumnStyle(SizeType.Percent, 100 / x);
    tableLayoutPanel1.ColumnStyles.Add(cs);
}

for (int ro = 0; ro < y; ro++)
{
    RowStyle rs = new RowStyle(SizeType.Percent, 100 / y);
    tableLayoutPanel1.RowStyles.Add(rs);
}

2.以下範例,可在產生表格後、分別產生第一列及第一欄的Label
             //產生第一欄Label
             for (int co = 0; co < x; co++)
            {
                ColumnStyle cs = new ColumnStyle(SizeType.Percent, 100 / x);
                tableLayoutPanel4.ColumnStyles.Add(cs);

                if (co == 0)
                {
                    for (int r = 0; r < y; r++)
                    {
                        if (r != 0)
                        {
                            Label LblName;
                            LblName = new Label();
                            LblName.Dock = DockStyle.Fill;//填滿表格
                            LblName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;//文字置中
                            LblName.BackColor = Color.FromArgb(255, 255, 192);//背景顏色
                            LblName.Font = new Font(LblName.Font, FontStyle.Bold);//粗體字
                            LblName.ForeColor = Color.Red;//字體紅色
                            if(x >=16)
                                LblName.Font = new Font("標楷體", 7);
                            LblName.Name = "R" + Convert.ToInt16(r);
                            LblName.Text = "R" + Convert.ToInt16(r);
                            tableLayoutPanel1.Controls.Add(LblName, 0, r);
                        }
                    }
                }
            }

            //產生第一列Label
            for (int ro = 0; ro < y; ro++)
            {
                RowStyle rs = new RowStyle(SizeType.Percent, 100 / y);
                tableLayoutPanel4.RowStyles.Add(rs);

                if (ro == 0)
                {
                    for (int c = 0; c < x;c++)
                    {
                        if (c != 0)
                        {
                            Label LblName;
                            LblName = new Label();
                            LblName.Dock = DockStyle.Fill;//填滿表格
                            LblName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;//文字置中
                            LblName.BackColor = Color.FromArgb(255, 255, 192);//背景顏色
                            //LblName.Font = new Font(LblName.Font, FontStyle.Bold);//粗體字
                            LblName.ForeColor = Color.Red;//字體紅色
                            if (x >= 17)
                                LblName.Font = new Font("標楷體", 8);
                            if (x >= 20)
                                LblName.Font = new Font("標楷體", 7);
                            LblName.Name = "C" + Convert.ToInt16(c);
                            LblName.Text = "C" + Convert.ToInt16(c);
                            tableLayoutPanel1.Controls.Add(LblName, c, 0);
                        }
                    }
                }
            }

3.點選TableLayoutPanel時,動態產生Label:從TableLayoutPanel的MouseClick事件
                int row = 0;
                int verticalOffset = 0;
                tableLayoutPanel1.Visible = false;//產生Label的過程,畫面會跑來跑去,所以先隱藏掉
                foreach (int h in tableLayoutPanel1.GetRowHeights())
                {
                    int column = 0;
                    int horizontalOffset = 0;
                    foreach (int w in tableLayoutPanel1.GetColumnWidths())
                    {
                        Rectangle rectangle = new Rectangle(horizontalOffset, verticalOffset, w, h);
                        if (rectangle.Contains(e.Location))
                        {
                            //產生Label
                            Label LblName;
                            LblName = new Label();
                            LblName.Dock = DockStyle.Fill;//填滿表格
                            LblName.ForeColor = Color.Red;//字體紅色
                            LblName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;//文字置中
                            LblName.Font = new Font(LblName.Font, FontStyle.Bold);//粗體字
                            LblName.Font = new Font("標楷體", 10);
                            LblName.Name = "A1";
                            LblName.Text = "A1";
                            tableLayoutPanel1.Controls.Add(LblName, column, row);
                           
                            LblName.Click += new System.EventHandler(LblName_Click);//動態事件
                            tableLayoutPanel4.Visible = true;
                            return;
                        }
                        horizontalOffset += w;
                        column++;
                    }
                    verticalOffset += h;
                    row++;

                }

4.宣告點擊動態產生的Label
 private void LblName_Click(object sender, System.EventArgs e)

 {
      dosomething;
 }

2013年6月25日 星期二

用System.DirectoryServices.AccountManagement管理AD帳號

http://www.codeproject.com/Articles/38344/Using-System-DirectoryServices-AccountManagement
根據已上網址資料,改以中文方式簡要說明:

1.System.DirectoryServices.AccountManagement 這是.NET Framework 3.5以後才有的,
.NET Framework 2.0 則是使用 DirectoryEntry,
2者相較,System.DirectoryServices.AccountManagement效能較佳。

2.相關物件說明:
PrincipalContext:與AD的連接物件
Principal:提供AD單元儲存、刪除、新增
GroupPrincipal:由Principal衍生而來,對Group單元做儲存、刪除、新增
UserPricipal:Principal衍生而來,對User單元做儲存、刪除、新增

3.程式範例:
新增帳號
using (var pc = new PrincipalContext(ContextType.Domain,"domain.com", "DC=domain,DC=com"))
{
    using (var up = new UserPrincipal(pc))
    {
        UserPrincipal usr = UserPrincipal.FindByIdentity(pc, "NewUser");
        if (usr != null)
        {
            MessageBox.Show("NewUser,此帳號已經存在!");
            return;
        }
        else
        {
            try
            {
                up.SamAccountName = textBox1.Text;
                up.SetPassword("P@ssw0rd");
                up.Enabled = true;
                //up.PasswordNeverExpires = true;//密碼永久有效
                up.ExpirePasswordNow();//下次登入時更改密碼
                up.Save();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fail!:" + ex);
                Application.Exit();
            }
        }
    }

}

將新增的帳號加入群組
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "domain.com", DC=com");
GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx,"Domain Users");
if (grp != null)
{
    grp.Members.Add(ctx,IdentityType.Name,"NewUser");
    grp.Save();
    grp.Dispose();
}
ctx.Dispose();

2013年3月27日 星期三

Delete、Truncate、Drop Table的差別

資料來源:
月神的咖啡館


許多情況下,我們需要刪除整個資料表內的資料,重新輸入新資料,有三種方法可以參考使用,分別是使用Delete、Trancate與Drop,那使這三種方式的差異為何呢?
一、使用Delete :
使用Delete語法,不加任何Where條件下,是可以移除整個Table的資料,這個方式簡單易懂,但是卻會耗用大量資源,因為Delete語法:
1.Delete屬DML命令,不加任何Where條件下,會一筆一筆的移除資料列,且在交易記錄中每筆刪除的資料,都會記錄成一個項目,當整個Table的資料移除完時,已耗用許多時間。
2.若Table存在刪除的觸發程序(Trigger)時,將會引發觸發程序
3.如果該Table包含識別欄位,使用Delete陳述式刪除資料表中所有資料時,並不會讓識別編號重置,所以後續再新增的資料,仍會從之前最後一個編號之後繼續編號下去

二、使用Truncate :
使用Truncate Table 會移除資料表中的所有資料列,但會保留資料表結構及其欄位、條件約束、索引等。
如果該Table包含識別欄位,這個識別編號會重設為原本定義的初始值。如果未定義任何初始值,就會使用預設值 1。
Trance Table 與Delete 比較的優點為:
1.使用的交易記錄空間較少:Truncate Table會取消配置用來儲存資料表資料的資料頁,以移除資料,所以交易記錄只會記錄頁面的取消配置。
2.通常會使用較少鎖定:Delete會鎖定每一筆資料,以便執行刪除,但Truncate Table只鎖定資料表和頁面,不會鎖定每個資料列。
3.速度較快:綜合以上兩點,Truncate Table會比Delete快!
Truncate Table 語法範例:
TRUNCATE TABLE MyTestTable


三、使用Drop Table:
使用Drop Tablec會移除一或多個資料表定義及這些資料表的所有資料、索引、觸發程序、條件約束和權限規格,也就是完全刪除一個資料表。
當卸除資料表時,資料表的規則或預設值會失去它們的繫結,資料表的任何相關條件約束或觸發程序也都會自動卸除。如果重新建立資料表,您必須重新繫結適當的規則和預設值、重新建立任何觸發程序,以及加入所有必要的條件約束。
所以使用Drop Table後,若你要重新使用被刪除的資料表,就只好重新Create Table了,但是要注意,Drop Table 和 Create Table 不得在相同批次的相同資料表上執行。否則,系統可能會發生非預期的錯誤。
Drop Table 語法範例:
DROP TABLE MyTestTable

2013年3月20日 星期三

點TextBox帶月曆、檢查日期格式為YYYY/MM/YY


需求:
有一個放日期的TextBox(YYYY/MM/YY),我希望讓user點的時候開出月曆直接點選,但也要避免被亂打其他文字或格式錯誤。


方法:
1.確認已裝好AJAX(安裝方法可參考安裝AJAX)
2.將此TextBox加入擴充項,選CalendarExtender,此控制項的屬性要另外作一些調整成需要的格式。
3.在TextBox的HTML碼裡面加入 onchange="javascript:checkDate(this);"
4.在Javascript裡面加入

function checkDate(obj)
    {
        var strDate = obj.value;
        re = /\d{4}\/\d{2}\/\d{2}/g
        if (re.test(strDate))
        {
            var DateArray = strDate.split("/");
            var dateElement = new Date(DateArray[0], parseInt(DateArray[1]) - 1, DateArray[2]);
            if (!((dateElement.getFullYear() == parseInt(DateArray[0])) && ((dateElement.getMonth() + 1) == parseInt(DateArray[1])) && (dateElement.getDate() == parseInt(DateArray[2]))))
            {
                alert("格式錯誤,請從月曆點選或輸入此格式:2013/01/01")
                obj.value = '';
            }
         
        }
        else {
            alert("格式錯誤,請從月曆點選或輸入此格式:2013/01/01")
            obj.value = '';
        }
    }

2013年3月18日 星期一

GridView 批次編輯、更新資料

如果要修改GridView資料,使用內建的編輯欄位,一次只能購編輯一個欄位,如果有很多筆資料要修改,需重覆按 編輯、更新,這種作法很不方便。
如果,點一個'編輯'鈕、整個GridView變成可編輯狀態,只要按一下'儲存',然後資料就整批更新,這樣較方便 !
作法:
1.將 GridView 裡面需要編輯的欄位改為 TemplateField,
2.編輯此欄位的樣板
3.將 ItemTemplate 的 Label 控制項改為 TextBox ,屬性 Enable 的值改為 False
4.GridView 外維放一個 Button
5.Button 的事件呼叫 GridView 的 RowDataBound 事件
6.RowDataBound 事件裡面,若RowType 為RowData 時,將 ItemTemplate 的 TextBox 屬性 Enable 的值改為 True
7.第2次按下Button後,更新資料庫

2013年1月20日 星期日

About GridView With CheckBox Column

I want validate if CheckBox has checked at GridView through JavaScript,if true then return text to Code behind.
我想用 JavaScript 確認 GridView 裡面的 CheckBox 是否有勾選資料,若有、回傳文字到Code behind.

1.在 aspx 網頁裡面放入隱藏控制項:
<asp:HiddenField ID="HDNValue" Value="0" runat="server" />


2.在 aspx 網頁裡面的 Button1 呼叫 JavaScript
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="選取" OnClientClick="returnString()"/>

3.JavaScript程式碼:
function returnString() 
{
    debugger;
    document.getElementById("HDNValue").value = "Return Text";
}

4.Button1的Click事件加入:
string sIsCheckData = HDNValue.Value;
if (sIsCheckData == "True")
{
....do something...
}

2013年1月15日 星期二

動態的陣列長度

如果迴圈裡面一開始不確定陣列長度,可用此方法宣告:

string[] _array = new string[0];
<10 br="" i=""> Array.Resize(ref _array , _array .Length + 1); //調整陣列長度