發表文章

目前顯示的是有「C#」標籤的文章

郵遞區號判斷器 TZIP32

圖片
噓.....此程式請勿廣傳,因為有廠商靠這個吃飯 透過此程式來判斷郵遞區號 下載處: https://tinyurl.com/6fkv2hfk 解壓縮密碼:我愛電波 需要環境: .Net Framework 3.5 使用方式: TZIP32.exe InputFile OutputFile [-icpCodeName] [-ocpCodeName]   InputFile   輸入檔案   OutputFile  輸出檔案   -icp        選擇性,輸入檔案編碼,例如:big5,utf8,ansi....,不輸入則以系統預設編碼為主   -ocp        選擇性,輸出檔案編碼,例如:big5,utf8,ansi....,不輸入則以系統預設編碼為主 範例: TZIP32.exe in_address.txt out_address.txt TZIP32.exe 主程式 in_address.txt 需要判斷的地址資料(可以單筆/多筆,檔名不設限,需為文字檔) out_address.txt 判斷結果輸出檔案(依照輸入檔案,逐行產生,前5碼為郵遞區號) 注意: 1、輸出檔案產生前須先刪除,避免系統咬住 2、輸出檔案產生前會先產一個暫存檔,通常為輸出檔的附檔名最後一個字元變成底線     例如:out_address.tx_ → out_address.txt 3、程式中有個DBF資料夾,它是郵局3+2的DBF,如要更新可以直接去下載郵局3+2的資料庫檔案直接更新即可。 底下為輸出範例 in_address.txt 高雄市林園區鳳林路1段1號4樓 台北市中正區新生南路一段58巷12-1號2F 台北市新生南路一段138號6樓之1 臺北市大安區敦化南路2段170號2樓 台北市大安區復興南路一段144號 台北市信義區信義路5段150巷332號13樓 苗栗縣竹南鎮博愛街217號5樓 台北市中山區南京東路2段2號9樓 桃園市桃園區中山路845號6樓 桃園市桃園區中山路845號9樓 台北市大安區敦化南路1段111號12樓 台北市大安區信義路四段296號7F-2 臺北市中正區羅斯福路1段9巷2弄12號1樓 台北市木柵路一段331-9號 新北市新店區寶橋路235巷129號2F 台北市文山區萬芳路40號 台中市北區進化

Keyboard LED & HDD LED Displayer(SystemLED)

圖片
This is a simple tools for display keyboard LED status & HDD read-write status . 這是一款簡單顯示鍵盤LED狀態與硬碟讀寫LED狀態的應用程序。 Most wireless keyboards do not have special key LED display, such as Caps Lock, Scroll Lock, Num Lock . 大部分無線鍵盤都沒有特殊鍵LED顯示,例如Caps Lock , Scroll Lock , Num Lock 。 Or on the remote desktop - maybe it’s different from the keyboard on the remote . 或是在遠端桌面 - 也許和遙控端的鍵盤狀態不同 It runs on .Net Framework 4.5, please make sure your environment supports it 它是運行在.Net Framework 4.5,請先確認您的環境有支援它 Download .net framework 4.5 here :  下載.et framework 4.5 套件:     https://www.microsoft.com/zh-tw/download/details.aspx?id=42642 Download SystemLED tool : 下載 SystemLED 程序:      https://drive.google.com/file/d/1eAF3vXgHqCEr5u09Nysqq8SzQCZ7KuDF/view?usp=sharing zip password (解壓密碼) : https://radio-idea.blogspot.com You can move position everywhere on your desktop , and click right button to close . 您可以在桌面任意位置移動位置,然後單擊右鍵關閉。

C# 讓電腦不要進入螢幕保護狀態 do not let windows into screen saver(lock)

圖片
 對不起,管理員 因為公司強迫要求使用者未使用電腦情況下,5分鐘要鎖定螢幕,由於是使用AD強制控制,所以使用者沒有辦法自己去關閉。 而我,因為常有需要參考畫面上的內容,在另外一部電腦操作,因此導致這部電腦一直會進入螢幕鎖定。超級麻煩又討厭。 所以開發了一隻小程式來防止Windows進入螢幕鎖定狀態。   程式下載(我只想使用): 這裡   密碼:radio-idea.blogspot.com   平台:.Net FrameWork 4.5   注意:可能會與軟體KVM衝突 這是利用Timer不斷偵測 Idle 時間 而這個 Idle 時間則是利用 GetLastInputInfo 取得鍵盤滑鼠輸入的最後時間計算與現在的時間差得到的,當這個時間差超過預定檢測的時間(我的程式碼是設定4分鐘,因為進入螢幕鎖定是5分鐘)時,會去模擬滑鼠輸入動作,這個模擬動作是透過SendInput來達成,以上這些功能都是呼叫Windows API來處理。 由於Windows API是非託管程序(Unmanaged)因此得引用 using System.Runtime.InteropServices; 主程序: using  System; using  System.Windows.Forms; using  System.Runtime.InteropServices; using  System.Configuration; namespace  DONTSLEEP {      public partial class   Form1 : Form     {          public int  Idle_time = 240; //閒置秒數(4分鐘)          public int  CCount = 0;          public bool  shacking =  false ;                   public enum   MonitorState   : int         {             MONITOR_ON = -1,             MONITOR_OFF = 2,            

財政部電子發票平台 Turnkey 接收檔案檢測程式(小工具)

圖片
Turnkey 是財政部電子發票平台的一套傳送工具 說真的,這套工具還蠻陽春的,對於有獨立伺服器的公司來說,不是很好用。 首先,它必須在使用者登入的桌面中執行,無法作為服務使用 其次,它執行排程時,背後一堆開啟的視窗不能關掉 最後,處理狀況的查詢,只能在該機器上直接查詢,無法透過遠端查詢(這個真的麻煩,尤其伺服器不能隨便把帳號密碼給使用者) 這次會開發這個工具的原因在於, 財務單位她們有自己的系統會產生傳給Turnkey的XML檔案,並直接丟到Turnkey處理的資料夾下 有時後,財務的系統沒有正常產生,導致電子發票平台一直沒收到資料,搞到去懷疑Turnkey主機有問題。 因此,特別開發這樣的程式來檢測Turnkey處理資料夾下是否有檔案被丟進來,並且整理後發郵件告知使用者。 先看看Turnkey處理資料檔案的類型與結構 相對於Turnkey處理黨案的預設路徑在 C:\Program Files\EINVTurnkey\UpCast 該路徑下的資料夾結構會有對應的名稱 下面還有分類資料夾: 每個分類資料夾下還會有3個資料夾,分別是SRC、BAK、ERR 通常新進來的檔案都會放在SRC裏面,經由Turnkeyt處理以後會從SRC移除並分類放在BAK和ERR裏面 所以這支程式就是專門在偵測SRC的檔案出現,並收集檔案名稱並以郵件回報給相關使用者 程式名稱:TKReceiveDetect.exe ( 下載 ) 環境需求:dotNetFrameWork 4.5 它的偵測方式不是用定時檢查,而是使用Windows的是件觸發,因為定時檢查的間隔可能會造成檢查遺失,就是當檔案進入SRC資料夾後,直到Turnkey排程觸發取走檔案時,如果定時檢查錯過這段時間這時就會檢查不到,而若把定時檢查設定太短,則會削弱大量系統效能(檢查這些資料夾必須使用遞迴處理),而且檢查時,若檔案此時被Turnkey處理掉,也是會造成偵測漏洞。 使用事件觸發通知好處是非常即時,而且事件被觸發時就會告知目前檔案狀況。因此不會漏掉要接收的資訊。

C# LINQ語法與SQL語法

圖片
  LINQ語法其實跟SQL語法還蠻像的,說蠻像基本上就是拿SQL語法來程式內使用而已。 學習過SQL的人太概都知道SQL的好處,雖說不上萬能,但是在找尋資料時卻是很好用的一種語法。 很多時候,不靠SQL資料庫要處理龐大內存資料真是一種痛苦,由其是不靠資料庫處理大量檔案資料或是內存資料時就是如此。如果有兩種資料須要JOIN就會需要很多程式碼,很多for/foreach迴圈去跑,因此總會希望程式碼在處理內存資料時會有像SQL這樣簡單的語法可以使用。 當然很多地方大都有在說LINQ和SQL的詳細寫法,我這邊也不再描述,我這邊主要是讓大家看看這兩種語法相似之處。 假如我有兩個資料表 學生基本資料(Student) 和 學等(Grade): Student StudentID Name Gender AddressCity AddressArea A0001 吳山汝 Female 台北市 萬華區 A0045 卓凱耀 Male 台中市 北區 A0107 劉立沛 Male 高雄市 鼓山區 Grade StudentID Class Score A0001 1.4 550 A0045 2.5 490 A0107 3.1 581 我們看看 幾個比較 假如我要選取學生資料表(Student)裏面的姓名(Name),然後過濾條件是住在台中市(AddressCity)會怎麼做呢? SQL語法: Select a.Name From Student a Where a.AddressCity = '台中市' 這三行分別就是: 選擇輸出的資料欄(Select) 資料來源(From) 過濾條件(Where) 注意: SQL對指令沒有大小寫分別,對字串不是使用雙引號,而是單引號 其中那個 a 是『別名』 如果用LINQ來寫,就會像如下: var result = ( from a in Student                       where a.AddressCity == "台中市"                      

C# 自訂 XCOPY 類別 :複製資料夾內所有檔案與子資料夾內容到目的資料夾(並覆蓋)

圖片
Xopy.class using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Tools {     public class Xcopy     {         private string _message;         /// <summary>         /// 錯誤訊息         /// </summary>         public string Message         {             get { return _message; }         }         /// <summary>         /// 複製檔案群         /// </summary>         /// <param name="_source">來源資料夾</param>         /// <param name="_target">目的資料夾</param>         /// <param name="recursive">包含子資料夾</param>         /// <returns>成功 = 1 , 失敗 = -1</returns>         public int Copy(string _source, string _target, bool recursive = true)         {             try             {                 if (!Directory.Exists(_source))                 {                     _message = "來源資料夾不存在!";                     return

LaunchMan : start and check version and update 自訂啟動更新程式

圖片
  說明: 這支程式的用途就是和你的程式擺在一起,然後將這支程式設定成你的程式啟動用。 這支程式啟動時,會依照 INI檔的設定去幫你檢查程式版本。 如果有版本異動時,會提醒使用者要更新程式。 支援: 支援HTTP和FTP協定,可以依照你的需求把更新檔案放在WEB server或是FTP server上 環境: 僅能運行在Windows 下 由 dotNet 4.5 開發,需要作業系統支援 dotNet 4.5 的程式執行, 如果沒有,可以 下載安裝 dotNet FrameWork 4.5 套件 。 下載: LaunchMan 範例: 我有一個 kiosk 程式 main.exe 放在  C:\APP\KioskPatch 桌面上有個程式捷徑連結到 C:\APP\KioskPatch\main.exe 現在,我們把 LaunchMan 程式和這個 Kiosk 程式放在一起 (不放一起其實也可以,這樣比較好管) 修改桌面捷徑改連結到 C:\APP\KioskPatch\LaunchMan.exe 而更新檔案 有兩個 一個是 version.txt , 另一個為壓縮檔( 例如KioskPatch.ZIP ) 都放在我的網站 www.mycomp.com.tw/Patch/down/ 下 然後在 C:\APP\KioskPatch 下也放一個 version.txt 這兩個 version.txt 內容要不一樣,當內容不同時,才會啟動更新 然後,修改 INI 檔案(範例在下方) [Application] ;使用的背景圖片,自訂圖片,該圖片必須有DPI資訊才能正常顯示 LogoPicture=splash2.png ;淡入效果時間 ;Second unit FadeINDuration=3 FadeOutDuration=1 ;讓背景透明 BackgroundTransparency=true ;顯示訊息文字顏色/位置 MessageTextColor=#0000FF MessageLeftPosition=10 messageTopPosition=130 Title="Kiosk Sell System with .Net" TitleTextColor=#FF0000 TitleLeftPosition=50

C# csv 檔匯入 List 一行搞定

圖片
  我有一個CSV 檔案(data.csv),內容大約如下: 編號,姓名,性別 T001,林黃頻,男 T002,江國勘,男 T003,劉簿相,男 所以,依照欄位我會定義出一個儲存用類別(Field.cs): namespace MyApp {     class Field     {         public Field(string Line)         {             var sp = Line.Split(',');             UserNo = sp[0];             UserName = sp[1];             Gender = sp[2];         }         public string UserNo { get; set; }         public string UserName { get; set; }         public string Gender { get; set; }                 public override string ToString()         {             string output =  UserNo+ "\t" + UserName + "\t" + Gender + "\r\n";             return output;         }     } } 主要程式碼其實只要一行就可以搞定(不含using) using System.IO ‧ ‧ ‧ // 這一行讀入CSV併排除第一行標題 List<Field> content = File.ReadAllLines("D:\\data.csv", Encoding.Default).Select(line => new Data1(line)).Skip(1).ToList(); // 顯示出來 foreach(Data1 item in totl) {      textBox1.Text += item.ToString(); } ‧ ‧ ‧

使用 NPOI 設定欄位(CELL)樣式與寬度

圖片
如何使用 NPOI 來設定CELL(欄位)的樣式:邊框、底色、字形,等等 底下是個 樣式類別檔案,把常用的欄位形態定義好,以後直接取用 DefXSSFstyle.cs using System.Drawing; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.HSSF.Util; namespace XssSTYLE {     /// <summary>     /// 已經定義好的欄位樣式,如果需要新樣式,複製程式碼並賦與新名稱,修改樣式產生程式碼即可使用     /// </summary>     class DefXSSFstyle     {         /// <summary>         /// 抬頭樣式 - 01         /// 灰色底色,白色字,正黑體,無邊框         /// </summary>         /// <param name="wb"></param>         /// <returns></returns>         public XSSFCellStyle Banner01(IWorkbook wb)         {             XSSFCellStyle csh = (XSSFCellStyle)wb.CreateCellStyle();             csh.Alignment = HorizontalAlignment.Center;             csh.VerticalAlignment = VerticalAlignment.Center;             csh.WrapText = true;             csh.FillForegroundXSSFColor = new XSSFColor(Color.FromKnownColor(KnownColor.Gray));             csh.FillPattern = FillPattern.SolidForeground;             IFont f

關於 NPOI 取得 列 (Row) 和 欄(Cell) 數量

圖片
關於 NPOI 裏面如何取得 列(Row) 與欄(Cell)的數量。 NPOI 對於 IRow 或 ICell 沒有類似集合數量的 count 或是 length 可以取得, 可是相對的有 FirstRowNum / LastRowNum / FirstCellNum / LastCellNum 可以用。 它代表是 首列位置 / 末列位置 / 首欄位置 / 末欄位置 但是非常奇異的是,這兩種的取出值卻完全不是這麼一回事 正常來說,以位置來看的話, C# 計算是從 0 開始 因此以上圖 EXCEL來看應該是: FirstRowNum = 0 LastRowNum = 10 FirstCellNum  = 0 LastCellNum  = 10 列(Row) 和 欄(Cell) 和都 各11個 但是,我們實際把它取出來看卻發現詭異事情了 Console.WriteLine("FirstRowNum = " + ws1.FirstRowNum.ToString() + " ,LastRowNum = " + ws1.LastRowNum.ToString()); Console.WriteLine("FirstCellNum = " + ws1.GetRow(0).FirstCellNum.ToString() + " ,LastCellNum = " + ws1.GetRow(0).LastCellNum.ToString()); 結果: 看! LastCellNum 居然是 11  NPOI 有太多小問題真的很想吐槽了 這個問題 去年被發現 ,但是至今尚未改善 如要參照這個屬性一定要非常小心,哪天突然修正好,你的程式可能也要跟著更新與修正了。

關於 NPOI 的 ISheet.RemoveRow 會清除到錯誤的列

圖片
關於 NPOI 套件裏面的 ISheet.RemoveRow 會移除到錯誤的列 的問題 如上圖,我使用如下指令: // 移除最末行 ws1.RemoveRow(ws1.GetRow(10)); 正確來說,它應該會移除第11行的 統計列,但是卻把第10列移除了? ISheet.GetRow 的陣列是從 0 開始的。 如果你用 // 移除第一行 ws1.RemoveRow(ws1.GetRow(0)); 則甚麼事都不會發生,也就是RemoveRow處理的位置是錯誤的。 這個問題好像 在 2016年就有人提出 了,到現在還沒改善.... 使用上還是要小心

C# 使用NPOI 把資料寫到excel檔案(xlsx)

圖片
利用 NPOI 套件產生如上圖的內容到一個excel檔案 本案例 C# 為 .Net 4.5 ,NPOI 為 2.5.1 版 程式碼如下: // 樣式元件 DefXSSFstyle style = new DefXSSFstyle(); IWorkbook wb = new XSSFWorkbook(); // 建立分頁賦予分頁名稱 ISheet ws1 = wb.CreateSheet("統計表"); // 建立數字陣列 10 X 10 for(int i = 1; i<= 10; i++) {     IRow row0 = ws1.CreateRow(i - 1);     for (int j = 1; j <= 10; j++)     {         ICell cell0 = row0.CreateCell(j - 1);         cell0.SetCellValue(((i - 1) * 10) + j);     } } // 建立合計 ASCIIEncoding aSCII = new ASCIIEncoding(); XSSFCellStyle cssf = style.Field09(wb); IRow subRow = ws1.CreateRow(ws1.LastRowNum + 1); for(int k = 1; k <= 10; k++) {     // 設定公式     string headChar = aSCII.GetString(new byte[] { (byte)(64 + k) });     ICell subCell = subRow.CreateCell(k - 1);     subCell.SetCellFormula("SUM(" + headChar + "1:" + headChar + ws1.GetRow(0).LastCellNum.ToString() + ")");     // 加入樣式     subCell.CellStyle = cssf; } // 儲存 string saveFile = savePath + "\\NPOI_RES.xlsx"; //

檔案編碼轉換小工具

圖片
檔案: FileEncode.exe 運行環境: .NET 2.0 Runtime 注意,這是編碼轉換,不是翻譯喔!! 某些時候在一些新舊系統文件上就是會遇到編碼文件需求不同而傷腦筋,在某些舊程式上就是如此,也無法再改動或是更新等問題,文件本身的編碼就會導致文件交易相當不順暢。 這支小程式就是用來解決這些問題的。 但要注意的是,UNICODE萬國編碼的文字一定會比舊式編碼大得多,可能會遇到某些文字無法轉換問題,例如簡體中文(GB)轉繁體中文(BIG5)。 對於英數字文件轉換是有一定實用性的。 通常新系統會使用UTF-8編碼,舊系統會使用 BIG5編碼/ANSI編碼/ISO8895-1編碼之類的。 我這邊最多用到的是 BIG5 (950) 轉 UTF-8 (65001) 需要用的自己下載去玩吧。 下載點 使用方式: 編碼類型: 37 - IBM037 437 - IBM437 500 - IBM500 708 - ASMO-708 720 - DOS-720 737 - ibm737 775 - ibm775 850 - ibm850 852 - ibm852 855 - IBM855 857 - ibm857 858 - IBM00858 860 - IBM860 861 - ibm861 862 - DOS-862 863 - IBM863 864 - IBM864 865 - IBM865 866 - cp866 869 - ibm869 870 - IBM870 874 - windows-874 875 - cp875 932 - shift_jis 936 - gb2312 949 - ks_c_5601-1987 950 - big5 1026 - IBM1026 1047 - IBM01047 1140 - IBM01140 1141 - IBM01141 1142 - IBM01142 1143 - IBM01143 1144 - IBM01144 1145 - IBM01145 1146 - IBM01146 1147 - IBM01147 1148 - IBM01148 1149 - IBM01149 120