2016年5月17日 星期二

[LINQ]在LINQPad中使用LinqToExcel(如何引入參考與Namespaces)

LINQPad是一個可以快速檢視LINQ查詢結果的工具(而且是麻雀雖小但五臟俱全)
不像在VS中還需要特別寫顯示的畫面,對於Demo來說相當方便
這篇文章只是從零到在LINQPad使用LinqToExcel的教學文
重點在於「如何引入參考和命名空間」
LINQPad的詳細使用可以找google小姐

LinqToExcel對針對只「讀」的資料而言,比NPOI與OpenXML更佳的選擇

LINQPad版本(官網下載的FREE版):v4.50.00
LinqToExcel版本(NuGet抓取):v1.10.1 

Step1: 取得LINQPad


不喜歡安裝的,可以點紅框處。至於選LINQPad 5 還是LINQPad 4 則取決於用的.NET Framework版本

下載後,解壓縮在尬意的位置就可以了,然後點「LINQPad.exe」執行
打開LINQPad後,畫面長這個樣子

Step2: LINQPad環境設定

要使用LinqToExcel前,需要將DLL讓LINQPad認識。(加入參考與命名空間)
點工具列的「Query」→「Query Peoperties」
在「Additional Reference」的頁籤中,利用「Browse...」將已經抓好的LinqToExcel相關DLL如圖所需添加(Name欄位才有參考價值)

再換到「Additional Namespace Imports」頁籤中添加命名空間
如果不知道要打什麼或是擔心打錯的,點「Pick from assemblies」
右側就會自動產生相應的命名空間,需要的再點「< Add Selected Namespaces」添加
最後,當然就是點「OK」

Step 3:Query它

將Language切換到「C# Program 」後 (Language詳細請參閱:LINQPad: The Ultimate .NET Scratchpad)
在輸入區打上下方語法後,Excute(F5)
----------------------------------------------------------------------------------------
void Main()
{
    var fileName=System.IO.Path.Combine(@"E:\備份\2016年度","SOP文件總攬.xlsx");
    var excelFile=new ExcelQueryFactory(fileName);
   
    var excel=excelFile.Worksheet(1); //亦可輸入工作表名 excelFile.Worksheet(“工作表1”)
    foreach (var element in excel)
    {
        element.Dump();
        "".Dump();
    }
}
----------------------------------------------------------------------------------------

然後你就得到它了

2016年2月22日 星期一

[豆知識]在網頁中貼上有上色的VS相關語法

沒技術量的筆記

以往在網頁或Blog中要貼語法又要有顏色時,不外乎這幾種選擇

  • 再自己手動上色
  • 使用網路上的語法上色器
  • 用js進行上色
  • 貼圖(需大量解說的才用方法, 畢竟處理相對耗時)


最近發現一個更簡單, 非常適合懶人的方法

  1. 將在VS中複製的語法,貼上Word
  2. 然後再從Word中複製,轉貼到網頁或Blog


當然這作法去看html原始碼時,某些有強迫症或潔癖的人會吐血(我有一點)
把很多不必要的Code都包進來了
不過當我文章大致完稿,不再去弄排版只差程式碼上色時
就會這樣使用

如果各位有更好的點子,也請多多指教了。

2016年1月29日 星期五

[CSS]利用CSS3與JQuery達成開合面板特效

測試的chrome版本: 48.0.2564.97
其他版本或瀏覽器, 可能會有呈現上的差異, 請適當的修改各處的CSS

目的:用一張圖靜態的圖搞定特效

1.滑鼠移入時三角形變亮 
2.點擊時, 旋轉三角形與展開區域









下面是原料的原始碼

●CSS
    <style type="text/css">
        /*補間動畫*/
        @keyframes arrow {
        0%   { transform:rotate(0deg);}   /*初始的呈現*/
        100% { transform:rotate(90deg); -webkit-filter: brightness(200%);} /*最終的呈現*/
        }
        @keyframes arrow_close {
        0%   { transform:rotate(90deg);}
        100% { transform: rotate(0deg); -webkit-filter: brightness(100%);}
        }

        /*圖片套用的樣式*/
        .test-arrow {
            animation-name: arrow; /*使用的補間動畫*/
            animation-duration: 0.5s; /*動畫時間長度*/
            transform:rotate(90deg); /*相對於原圖的旋轉角度*/
            -webkit-filter: brightness(200%); /*相對於原圖的亮度*/
        }

        .test-arrow-close {
            animation-name: arrow_close;
            animation-duration: 0.5s;
            transform:rotate(0deg);
            -webkit-filter: brightness(100%); /**/
        }
    </style>

●混雜著asp.net的html(編譯到網頁時, 還是會回到html)
         <table class="fastFunc" style="width: 90%;">
           <tr style="background-color: #7292CC; color: #FFFFFF;">
                <td>
                    <img id="i_arrow" class="i_toggle" src="../BlueTriangle_glow.png" />快速停用
                </td>
           </tr>
           <tr>
<td>
               <asp:Panel id="arrow" CssClass="p_toggle" runat="server" BackColor="#C6DAF8">
                  //(自由發揮)
</asp:Panel>
               </td>
</tr>
        </table>


 重這邊開始有區別, 這裡是jQuery與js主要運作的地方

第一種, 較直觀的方法(直接指定ID)

優:簡單不容易指錯, 在測試和規劃初期可以減少需排除的錯誤, 相當適合只用一次的功能
缺:想重複使用功能時, 會需要寫進所需的code, 讓檔案大幅成長

    <script type="text/javascript">
        $(document).ready(function () {
            $("#arrow").hide();
            $("#i_arrow").mouseover(function () { $(this).css("-webkit-filter", "brightness(200%)") })
            $("#i_arrow").mouseout(function () { $(this).css("-webkit-filter", "brightness(100%)") })

            $("#i_arrow").click(function () {
                $(".fastFunc").slideToggle(300);
                if (this.className == "test-arrow") {
                    this.className = "test-arrow-close";
                }
                else
                    this.className = "test-arrow";
            });
        });
    </script>


第二種, 較抽象的方阿 (利用this與遍歷)

優:只需寫一次, 並透過適當的條件選擇, 就能套用在不同區塊
缺:不熟悉selector或架構尚未定型的開發中頁面, 使用此方法反而會增加困擾

    <script type="text/javascript">
        $(document).ready(function () {
            $(".p_toggle").hide();
            $(".fastFunc .i_toggle").mouseover(function () { $(this).css("-webkit-filter", "brightness(150%)") })
            $(".fastFunc .i_toggle ").mouseout(function () { $(this).css("-webkit-filter", "brightness(100%)") })

            $(".fastFunc .i_toggle").click(function () {
                $(this).parents("tr").next().find(".p_toggle").slideToggle(300);
                if (this.className == "test-arrow")
                    this.className = "test-arrow-close";
                else
                    this.className = "test-arrow";
            })
        });
    </script>

可以注意看, 其實程式碼差不多, 而是差別在selector的寫法

2016年1月17日 星期日

[NuGet]用OpenXml在docx中套版列印 - 基本型

使用版本:
  • Visual Studio 2012
  • DocumentFormat.OpenXml v2.5

參考資料:


NPOI在excel中用起來還不錯, 但是Word中就... 不那麼直觀了(也許只是個人問題)

「基本型」就是有現成的Template, 僅是將[$...$]包夾的文字取代後Export
([$...$]是在黑暗執行緒中發現的, 覺得不錯就學起來了 :D)


步驟一:設定aspx中的控制項, 且產生Button1的Click事件
輸入的控制項使用TextBox, 按鈕的控制項使用Button

步驟二:撰寫Button1的Click事件
此段與黑大鎖寫近乎無異, 僅有綠色區域因需求而微調
綠框視控制項的設定而變, 綠線則是函數名, 結果與黑大的MakeDocx()差不多


 步驟三:撰寫editWordDoc函數
此處是參考「我如何...」編寫

到此就大功告成了

如果Export後,發現[$...$]沒有被取代

將*.docx改為*.zip去看「word→doucment.xml」(用可編輯的工具為佳, 個人是用記事本)
看是不是[$...$]不連續, 將多餘的地方刪除, 再存回docx就可以了


與OpenXml類似用途的NPOI介紹

2015年12月11日 星期五

[ASP.NET]從後台透用C#呼叫前台寫好的JavaScript function()

此文章不是如何在從*.cs中編寫一段js並到前台執行
而是在*.cs中, 使用一段前台已經寫好的js功能
此篇介紹的是作用於page內, 而非updatepanel中的js, updatepanel的請參見頁尾的msdn

假設前台(*.aspx)中有這麼一段<script>
    <script type="text/javascript">
      var optionSubjectBar = {
            'title': 'Nya~',
            'width': 200,
            'height': 300,
            vAxis: { minValue: 0 }
        };
        ...................
        function drawAxisTickColors() {
            var dataAudit = google.visualization.arrayToDataTable([
            chart.draw(dataAudit, optionAuditStackedBar);        }

        function clicktest() {
            var data = new google.visualization.DataTable();
            ...................
            chart.draw(data, optionAuditStackedBar);
        };
    </script>

在要執行該段js的C#語法中視需求插入即可
例如我想要使用「clicktest()」這個功能

(*.cs)後台
建構式為
public static void RegisterStartupScript( Page page, Type type, string key, string script, bool addScriptTags )
  • page:一般用「Page」就對了
  • type:一般用「GetType()」就對了
  • key:給後面的指令碼有個識別值, 像是ID般的存在, 不一定要跟function相同名稱
  • script: 當然就是要執行的function了,以這個例子就是輸入「clicktest()」,要直接寫一段程式碼也是可以
  • addScriptTage:true或false, 只是會不會加上<script>...<script>而已


ScriptManager.RegisterStartupScript(Page,GetType(),"clicktest","clicktest()",true)
如果在addScriptTags用false, 那就要寫成「<script>clicktest()<script>」
通常為了避免重複一直註冊key, 會多加上判斷式
-----------------------------------------------------------------------------------------------------------------------------------------------

if (!Page.ClientScript.IsStartupScriptRegistered("clicktest"))
        {
            ScriptManager.RegisterStartupScript(Page,GetType(),"clicktest","<script>clicktest()</script>",false)
        }
-----------------------------------------------------------------------------------------------------------------------------------------------

對於單純的page也許不太需要, 但是會不斷刷新的ajax就可以節省頻寬喔

使用UpdatePanel的話,請參考這MSDN的設定:(點我前往)
另外這篇文章也不錯,說明三種註冊方法的差異(本文只使用其中一種):動態註冊JavaScript至Client端


參考資料:



2015年11月26日 星期四

[EEP]Srvtools.WebDataSource元件Master發生錯誤,無法找到欄位:XXX的值

有些欄位作為Index, 又不想讓使用者看到時, 有很多種作法
像是用「System.Data.*」操作或是ViewState等狀態管理

這篇介紹兩個簡單的方法,各有其特色




  • HiddenField:還想利用JQuery或在Client端對其有動態影響時
  • Visible=False:Client看不到, 一定要PostBack
習慣用VS編寫的話,通常會直覺的利用Visible=False
但有可能導致使用者在操作WebFormView時出現
「Srvtools.WebDataSource元件Master發生錯誤,無法找到欄位:XXX的值」

這時先檢查一下該控制項的Bind設定
(錯誤)  <asp:Label ID="Label1" runat="server" Text='<%# Eval("CustID") %>'  Visible="False"></asp:Label>
(正確)  <asp:Label ID="Label1" runat="server" Text='<%# Bind("CustID") %>'  Visible="False"></asp:Label>

如果連這樣都無法解決,對於該欄位又沒有資安考量時,可以考慮使用「HiddenField」
HiddenField是VS內建的控制項

將其插入ItemTemplate的樣板(或其他有需求的樣板模式)
<asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Bind("CustID") %>' />

由於該程式碼經編譯後,在Client端看的到
會轉換成「<input type="hidden" name="WebFormView1$HiddenField1" id="WebFormView1_HiddenField1" value="1">」
與利用JQuery的hide();有相同的缺點,如果是資安考量的欄位,請勿直接使用「HiddenField」