TOP

2015年5月7日 星期四

NPOI 讀取Excel、匯出Excel

下載DLL 並加入參考 >>下載<<

Imports NPOI.HPSF
Imports NPOI.HSSF
Imports NPOI.HSSF.UserModel
Imports NPOI.POIFS
Imports NPOI.Util
NPOI 讀取Excel
 Public Shared Function LoadExcel(Optional ByVal FilePath As String = "", _
               Optional ByVal SheetName As String = "", _
               Optional ByVal SheetIndex As Integer = 0)
        Dim OpenXls As New OpenFileDialog
        Dim table As New DataTable
        OpenXls.Filter = "XLS File|*.xls"

        If String.IsNullOrWhiteSpace(FilePath) = True Then
            If OpenXls.ShowDialog = DialogResult.OK Then
                FilePath = OpenXls.FileName
            End If
        End If
        If File.Exists(FilePath) = False Then
            Return table
        End If

        Dim tmpXs As String = Application.StartupPath & "\tmp.xls"
        If File.Exists(tmpXs) = True Then
            File.Delete(tmpXs)
        End If

        File.Copy(FilePath, tmpXs)
        FilePath = tmpXs


        Try
            Dim Fs As FileStream = File.OpenRead(FilePath)
            Dim workbook As HSSFWorkbook = New HSSFWorkbook(Fs)
            Try
                Dim sheet As HSSFSheet
                If SheetName <> "" Then
                    sheet = workbook.GetSheet(SheetName)
                Else
                    sheet = workbook.GetSheetAt(SheetIndex)
                End If

                Dim headerRow As HSSFRow = sheet.GetRow(0)
                Dim cellCount As Int32 = headerRow.LastCellNum

                For i As Int32 = headerRow.FirstCellNum To cellCount - 1
                    Dim column As DataColumn = New DataColumn(headerRow.GetCell(i).StringCellValue)
                    table.Columns.Add(column)
                Next

                Dim rowCount As Int32 = sheet.LastRowNum

                For i As Int32 = (sheet.FirstRowNum + 1) To sheet.LastRowNum

                    Dim row As HSSFRow = sheet.GetRow(i)
                    Dim dataRow As DataRow = table.NewRow()
                    Dim NullCount As Integer = 0
                    For j As Int32 = row.FirstCellNum To cellCount - 1

                        If Not (row.GetCell(j) Is Nothing) Then
                            dataRow(j) = row.GetCell(j).ToString()
                        End If
                        If IsDBNull(dataRow(j)) = True Then
                            NullCount += 1
                        ElseIf String.IsNullOrWhiteSpace(dataRow(j)) = True Then
                            NullCount += 1
                        End If
                    Next
                    If NullCount <> table.Columns.Count Then
                        table.Rows.Add(dataRow)
                    End If
                Next
                sheet = Nothing

            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                Fs.Dispose()
                Fs.Close()
            End Try
            workbook = Nothing
            Return table
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Return table
        End Try

    End Function


NPOI 寫入EXCEL檔

Public Shared Function SaveExcel(ByVal obj As Object, Optional ByVal FilePath As String = "") As Boolean
        Try
            Dim SaveXls As New SaveFileDialog
            Dim i As Integer = 1
            SaveXls.Filter = "Excel檔(*xls)|*.xls"

            If FilePath <> "" Then

            ElseIf SaveXls.ShowDialog = DialogResult.OK Then
                FilePath = SaveXls.FileName
            Else
                Return False
            End If

            Dim Ds As New DataSet
            Select Case obj.GetType
                Case GetType(DataSet)
                    Ds = obj.copy
                Case GetType(DataTable)
                    Ds.Tables.Add(obj.copy)
                Case Else
                    Dim Json As String = JsonConvert.SerializeObject(obj)
                    Dim dt As DataTable = JsonConvert.DeserializeObject(Of DataTable)(Json)
                    Ds.Tables.Add(dt)
            End Select

            Dim workbook As HSSFWorkbook = New HSSFWorkbook()
            Dim ms As MemoryStream = New MemoryStream()
            For Each dt As DataTable In Ds.Tables
                If dt.TableName = "" Then
                    dt.TableName = "sheet" & i
                    i = i + 1
                End If

                Dim sheet As HSSFSheet = workbook.CreateSheet(dt.TableName)


                Dim headerRow As HSSFRow = sheet.CreateRow(0)


                ' 欄位資料
                Dim column As DataColumn
                For Each column In dt.Columns
                    headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName)
                Next column

                ' 資料內容
                Dim rowIndex As Int32 = 1
                Dim row As DataRow
                For Each row In dt.Rows
                    Dim DataRow As HSSFRow = sheet.CreateRow(rowIndex)

                    For Each column In dt.Columns
                        If IsDBNull(row(column)) = False Then
                            DataRow.CreateCell(column.Ordinal).SetCellValue(row(column))

                        End If
                    Next column
                    rowIndex = rowIndex + 1
                Next row
                sheet.CreateFreezePane(0, 1, 0, 1)    '凍結視窗
                sheet = Nothing
                headerRow = Nothing
            Next


            workbook.Write(ms)
            ms.Flush()
            ms.Position = 0
            workbook = Nothing
            Dim fs As FileStream = New FileStream(FilePath, FileMode.Create, FileAccess.Write)
            Dim data As Byte() = ms.ToArray()
            fs.Write(data, 0, data.Length)
            fs.Flush()
            fs.Close()
            data = Nothing
            ms = Nothing
            fs = Nothing
            Ds.Dispose()
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

2014年10月20日 星期一

[教學]取得FB貼文中按讚/留言人數

想要取得所有按讚人數/留言人數,沒聽過[FB API]的人,應該會用傳統方式展開一筆一筆複製下來,以下教學提供大家使用API快速取得所有清單。

舉例取得以下貼文(本教學僅提供貼文使用,其他分享、圖片、連結的取得方式不同)

步驟一:貼文右上角按下「嵌入貼文」




步驟二:複製嵌入語法


步驟三:取得貼文編號






步驟四:

說明:  https://graph.facebook.com/貼文編號/comments?
取得以下資料(內容會以 JSON格式呈現)。

步驟五:使用程式解析JSON格式資料(以VB.NET舉例)
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Newtonsoft.Json 的使用方式請自行參考網路說明
    Public Function Get_FB_Likes(ByVal Post_ID As String) As String()

        Dim returnAry As String() = Nothing
        Try

            Dim objWebClient As New System.Net.WebClient
            Dim url As String = String.Format("https://graph.facebook.com/{0}/likes?limit=1000", Post_ID) '注意:回傳結果每次最多1000筆,設定再多都無效

            Dim list As New List(Of String)

            Do Until String.IsNullOrWhiteSpace(url) = True
                Dim JsonResult As String = Encoding.UTF8.GetString(objWebClient.DownloadData(New Uri(url.Trim))) '以UTF-8取得結果
                Dim JObj As JObject = JsonConvert.DeserializeObject(JsonResult)

                Dim Data As String = JObj.item("data").ToString
                Dim JAerry As JArray = JsonConvert.DeserializeObject(Data) '取得陣列型態資料

                Dim TmpAry = (From p In JAerry Select p.Item("name")).ToArray

                For Each s In TmpAry
                    list.Add(s.ToString)
                Next

                If JObj.Item("paging").Item("next") IsNot Nothing Then '檢查是否有分頁
                    url = JObj.Item("paging").Item("next").ToString
                Else
                    url = ""
                End If

            Loop
            returnAry = list.ToArray '完成後轉換成陣列
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        Return returnAry
    End Function

以上產生出來的資料就是所有按讚的人數 

2013年7月25日 星期四

[JQuery]Selector使用教學

JQuery提供的提供了許多selector用法 >>連結<<
熟悉這些Selector可以讓你快速的選到正確的物件,提升開發速度,以下替各位整理一些常用的指令
  //選取所有元素
  $('*');
  
  //使用HTML DOM選取(常用selector)
  $('a');$('div');$('p');$('input');
  
  //使用class選取(常用selector)
  $('.link');
  
  //使用type選取(常用selector)
  $(':checkbox');
xxx 
OOO
+++

//$('selector[attribute="value"]')選取attribute為title且value為link1
$('a[title="link1"]').size(); //1

//$('selector[attribute|="value"]')選取attribute為url且value開頭單字為en
$('a[url|="en"]').size(); //2

//$('selector[attribute*="value"]')選取attribute為name且value內容包含man(任意位置)
$('a[name*="man"]').size(); //3

//$('selector[attribute~="value"]')選取attribute為name且value內容包含完整單字good
$('a[name~="good"]').size(); //1

//$('selector[attribute^="value"]')選取attribute為title且value開頭為link
$('a[title^="link"]').size(); //3

//$('selector[attribute$="value"]')選取attribute為name且value結尾包含man
$('a[name$="man"]').size(); //2

//選取第一個a
$('a:first').text();//XXX
$('a').eq(0).text();//OOO

//選取第二個a
$('a:eq(1)').text();//OOO
$('a').eq(1).text();//OOO

//選取最後一個a
$('a:last').text();//+++

//選取有class這個attribute的物件
$('a[class]').text();//xxx

//選取子物件為img的物件
$('a:has(img)').size();//1

//選取index 1,3,5,7....的物件
$("a:odd").css("background-color", "#bbbbff");
 
 //取得下拉式選單選取得值
  $('select[name="sel1"] option:selected').text();
  
  //取得所有class為Ck_add且被選取的checkbox
  $('input[class="Ck_add"]:checked').size();
  
  //選擇正在播放動畫的DIV
  $('div:animated');
  

Corey

Yehuda

Adam

Todd

Nobody

Jorn

Scott

Timo

//$('selector:gt(index)') 取index後的所有p
$( "p:gt(1)" ).text('oo');
//$('selector:gt(-index)') 取得總數量減去index後的所有p
$( "p:gt(-2)" ).text('xx');


//各區塊內第一個變色
$("span:first-of-type").css('background-color','#123');
//區塊內最後一個變色
$("span:last-of-type").css('background-color','#123');

2013年7月11日 星期四

[JQuery]去除符號

寫網頁時遇到輸入的地方都要特別小心使用者輸入了一些不法字元
為了降低SQL injection的發生,我們可以用JQuery動一些手腳

var txt='!@#$&^&*(&*(*&()';
txt=txt.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g,' ');
alert(txt);
※預防SQL injection,建議在Server端再做些防護,因為瀏覽器的 console介面可以讓懂JQuery語法的人下語法去讓整的驗證機制失效

2013年7月4日 星期四

[JQuery]超簡單GoTop按鈕

將CSS放入<head></head>




下列語法放入<body></body>

TOP

JQuery語法放在<body></body>最後面
註:須先將JQuery的JS檔包進來
$(function(){

  $(window).scroll(function() {
     if ($(window).scrollTop() > 0) {
        $('#TopBtn').css('display','block')
     } else {
        $('#TopBtn').css('display','none')
     };
  }).scroll();
  
  $('#TopBtn').click(function(){
     $("html,body").animate({scrollTop: 0}, 500);
  })

});

2013年7月3日 星期三

[JQuery]調整視窗大小時,版面跟著調整

如果想要讓您的網頁,根據瀏覽器視窗大小,而決定要顯示多少內容
可以透過JQuery來處理,不多說我們直接進入範例

首先在您Js檔及CSS放入<head></head> 中

並且將以四個DIV加入Body
JQuery的程式碼您可以考慮寫在<Body></Body>中,不過在開發大型網頁時,小編建議也包成一個JS檔方便管理
$(function(){
    $(window).resize(function(){ 
        $('.box').each(function(){
              if ( $(window).width() < ($(this).index()+1)*200)
              {
                 $(this).css('display','none');
              }
              else
              {
                 $(this).css('display','');
              }
         });
  
     });
});
(此範例紅、黃、綠的底色為黑色,視窗縮小後上層色即消失)

2013年7月1日 星期一

[SQL]Trigger(觸發程序)大批異動資料時,要注意的事


看這篇文章前,您必須先瞭解什麼是Trigger(觸發程序),Trigger可以想像它是一個警報器,只有三件事情可以使這個警報器發揮作用,
Insert、Update和Delete這三個指令,而這個警報器用在資料表被這三個指令使用時觸發,因此我們可以讓資料表插入資料時,讓Trigger
去幫我們檢查或是更新資料時另外加一筆資料到另一張資料表,今天介紹Trigger不是重點,今天要說的是大批異動資料時通常會忽略的事。

以下使用北風資料庫來做範例
[Orders2]             (訂單資料表)
[OrderDetails2]    (訂單明細)

為了快速達成Demo效果先建立資料表
Orders2、OrderDetails2,並將資料轉入
CREATE TABLE [dbo].[Orders2](
 [OrderID] [int]  NOT NULL,
 [CustomerID] [nvarchar](5) NULL,
 [EmployeeID] [int] NULL,
 [OrderDate] [datetime] NULL,
 [RequiredDate] [datetime] NULL,
 [ShippedDate] [datetime] NULL,
 [ShipVia] [int] NULL,
 [Freight] [money] NULL,
 [ShipName] [nvarchar](40) NULL,
 [ShipAddress] [nvarchar](60) NULL,
 [ShipCity] [nvarchar](15) NULL,
 [ShipRegion] [nvarchar](15) NULL,
 [ShipPostalCode] [nvarchar](10) NULL,
 [ShipCountry] [nvarchar](15) NULL)
 
INSERT INTO [Orders2] SELECT * FROM [Orders]
------------------------------------------------------------- 
CREATE TABLE [dbo].[OrderDetails2](
 [OrderID] [int] NOT NULL,
 [ProductID] [int] NOT NULL,
 [UnitPrice] [money] NOT NULL,
 [Quantity] [smallint] NOT NULL,
 [Discount] [real] NOT NULL)
 
INSERT INTO  [OrderDetails2] SELECT * FROM [OrderDetails]

建立Trigger




















一般來說Trigger會這樣寫,這樣可以讓刪除[orders]的資料時可以將刪除的動作觸發Trigger並且刪除[OrderDetails]

--Trigger01
Create TRIGGER [dbo].[Orders2_trigger_del] ON [dbo].[Orders2]
FOR Delete --指定Delete觸發本事件
AS
DECLARE @orderid int
 SELECT @orderid=orderID FROM DELETED
 Delete OrderDetails2 where OrderID=@orderid 


今天我們要刪除訂單,以下指令將會刪除14筆資料
DELETE orders  where EmployeeID=5 AND ShipVia=1

如果使用 Trigger01 的方式,就會發現刪了14筆訂單主檔跟第一筆訂單的明細,可是其他訂單的明細卻沒有跟著刪除
 

--Trigger02 
Alter TRIGGER [dbo].[Orders2_trigger_del] ON [dbo].[Orders2]
FOR Delete --指定Delete觸發本事件
AS
    Delete OrderDetails2 where OrderID in
    (SELECT orderID FROM DELETED)--此Trigger包含N筆資料
Trigger02這種方式也可以改用迴圈去處理各筆資料,
如此一來,我們刪除訂單的同時,Trigger也會確實地將明細也一併清除