2012年5月3日 星期四

Reporting Service BarCode自己做

最近被教務處追殺,一寫就是長達一年的系統,每天都是很精實在寫程式阿。
導致現在一整個就把我的小天地荒廢掉了。
剛好最近很常在用Reporting Service,然後最近有需要用到Bar Code
之前google不是灌字型就是引用別人的dll檔
然後專業的你分析一下。
  1. 灌字型:一整個就很不專業,人如果在外面,不就還要在別人的電腦灌字型後才能印報表。(一整個遜掉了)
  2. 別人的dll檔:不覺的人家把東西封裝起來的東西,就是...怕怕的,會不會傳一些資料出去。
所以...決定在自己的Reporting Service用.NET Framework的Drawing來畫畫啦。
首先,當然先準備以下東西
  1. .NET Framework 2.0以上版本(廢話)
  2. Reporting Service 2005 以上
  3. 沒了,沒錯以上兩個就好了!!
接下來就來一些基本的設定啦

第一步:當然是打開報表伺服器專案準備寫報表程式了
事前安裝設定可以參考這篇到第10步驟就可以繼續下去。


第二步:選擇報表=>然後點選報表屬性...

第三步:接下來會看到這個畫面,點選參考這個項目,因為我們要把
.Net Frame work的Drawing元件放進去。

第四步:然後點選...,進去加入System.Drawing點選下方的加入

第五步:點完加入後確定,切換到程式碼的位置

接下來就是打點字啦

Public Function MakeBarcodeImage(ByVal datastring As String) As Byte()
        Dim sCode As String = String.Empty
        '清除該頁輸出緩存,設置該頁無緩存 
     
        '將Code39條碼寫入記憶體流,並將其以 "image/Png" 格式輸出  
        Dim oStream As New System.IO.MemoryStream()
        Try
             Dim oBmp As System.Drawing.Bitmap = GetCode39(datastring)
            oBmp.Save(oStream, System.Drawing.Imaging.ImageFormat.Png)
            oBmp.Dispose()
            Return oStream.ToArray()
        Finally
            '釋放資源  
            oStream.Dispose()
        End Try
    End Function
       
   
    Private Function GetCode39(ByVal strSource As String) As System.Drawing.Bitmap
        Dim x As Integer = 5
        '左邊界
        Dim y As Integer = 0
        '上邊界
        Dim WidLength As Integer = 2
        '粗BarCode長度
        Dim NarrowLength As Integer = 1
        '細BarCode長度
        Dim BarCodeHeight As Integer = 24
        'BarCode高度
        Dim intSourceLength As Integer = strSource.Length
        Dim strEncode As String = "010010100"
        '編碼字串 初值為 起始符號 *
        Dim AlphaBet As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*"
        'Code39的字母
        'Code39的各字母對應碼
      
        Dim Code39 As String() = {"000110100", "100100001", "001100001", "101100000", "000110001", "100110000", _
         "001110000", "000100101", "100100100", "001100100", "100001001", "001001001", _
         "101001000", "000011001", "100011000", "001011000", "000001101", "100001100", _
         "001001100", "000011100", "100000011", "001000011", "101000010", "000010011", _
         "100010010", "001010010", "000000111", "100000110", "001000110", "000010110", _
         "110000001", "011000001", "111000000", "010010001", "110010000", "011010000", _
         "010000101", "110000100", "011000100", "010101000", "010100010", "010001010", _
         "000101010", "010010100"}
        strSource = strSource.ToUpper()
        '實作圖片
        Dim objBitmap As New System.Drawing.Bitmap(((WidLength * 3 + NarrowLength * 7) * (intSourceLength + 2)) + (x * 2), BarCodeHeight + (y * 2))
        Dim objGraphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(objBitmap)
        '宣告GDI+繪圖介面
        '填上底色
        objGraphics.FillRectangle(System.Drawing.Brushes.White, 0, 0, objBitmap.Width, objBitmap.Height)

        For i As Integer = 0 To intSourceLength - 1
            '檢查是否有非法字元
            If AlphaBet.IndexOf(strSource(i)) = -1 OrElse strSource(i) = "*"c Then
                objGraphics.DrawString("含有非法字元", System.Drawing.SystemFonts.DefaultFont, System.Drawing.Brushes.Red, x, y)
                Return objBitmap
            End If
            '查表編碼
            strEncode = String.Format("{0}0{1}", strEncode, Code39(AlphaBet.IndexOf(strSource(i))))
        Next

        strEncode = String.Format("{0}0010010100", strEncode)
        '補上結束符號 *
        Dim intEncodeLength As Integer = strEncode.Length
        '編碼後長度
        Dim intBarWidth As Integer

        For i As Integer = 0 To intEncodeLength - 1
            '依碼畫出Code39 BarCode
            If strEncode(i) = "1"c Then
                intBarWidth = WidLength
            Else
                intBarWidth = NarrowLength
            End If
            If i Mod 2 = 0 Then
                objGraphics.FillRectangle(System.Drawing.Brushes.Black, x, y, intBarWidth, BarCodeHeight)
            Else
                objGraphics.FillRectangle(System.Drawing.Brushes.White, x, y, intBarWidth, BarCodeHeight)
            End If
            x = x + intBarWidth
        Next
        Return objBitmap
    End Function


第六步:點選確定後,就可以趕緊來圖片控制項來試試看啦。






第七步:跑出精靈啦,直接下一步


 第八步:點選資料庫


 第九步:影像欄位點選你要製成BarCode的數字或是英文欄位,MIME記得
切換成image/png

第十步: 按住產生的image控制項,找到屬性修改一下value

第十一步: 修改一下你的Value裡面的運算式


=code.MakeBarcodeImage(欄位描述)




第十二步:快把報表打開,你已經完成了!









不用再裝奇怪的東西嚕 :-)
希望能給需要的朋友一些幫助,一起加油!





Reporting Services Barcode

6 則留言:

  1. 您好,
    終於在網上找到ssrs可以加barcode的做法,
    但我照您的上述做法(除了第一步沒有照做), 在執行時出現錯誤
    影像Image1的value運算式包含錯誤:[BC30455]'Public Function MakeBarcodeImage(datastring As String) As Byte()的參數'datastring '未指定引數
    請問是code那裏有錯嗎? 我是將您的code整個copy貼上的~~
    能幫我解惑嗎? 跪求~~

    回覆刪除
  2. 您好,
    可以先試試看在第11步的地方先把value裡的值修改
    ----
    =code.MakeBarcodeImage("123")
    ----
    如果有跑出來表示到第11步是沒問題的。

    接下來就是繫結至您的資料表的欄位名稱
    如果您的欄位名稱為ID
    在資料表內通常是
    ----
    =code.MakeBarcodeImage(Fields!ID.Value)
    ----
    如果在表頭或是表尾
    ----
    =code.MakeBarcodeImage(First(Fields!ID.Value),您資料集的名稱)
    ----

    希望有幫助到您,謝謝

    回覆刪除
  3. 想再請教個問題, 請問能透過code產生如以下網站的條碼嗎
    http://www.ubscode.com/en-ww/how-to-do-it/6/codigos-de-barras

    回覆刪除
  4. 你想做的是EAN Code吧

    可以參考這篇
    https://www.codeproject.com/Articles/10162/Creating-EAN-Barcodes-with-C

    希望有幫助到您

    回覆刪除
  5. 你真的好強, 我來研究看看, 謝謝你~~

    回覆刪除