顯示具有 csv 標籤的文章。 顯示所有文章
顯示具有 csv 標籤的文章。 顯示所有文章

2012年7月19日 星期四

xsl 副程式分享, 產生N個tab

假設有一個系統, 允許使用者勾選要顯示的欄位如下圖所示:

產生出來的 HTML 表格如下:

html 的 table 可以使用 colspan=N 來控制合併儲存格的數量, 如果想使用 xsl 產生 .csv 的檔案出來,  要怎麼產生出對應該的儲存格間距呢?  我的解法是透過 xsl 的副程式來解決, 計算儲存格間距的問題.


步驟1: 第1層要增加的tab 數(level1tabs) 
= (第3層的數量 x 第2層的數量) - 1 
= (2 x 3) -1 
= 5

<xsl:variable name="level1tabs"><xsl:value-of select="($level3count*$fieldCount)-1"/></xsl:variable>


步驟2: 呼叫副程式, 並傳入變數5
<xsl:call-template name="outputTabs"><xsl:with-param name="maxNum"><xsl:value-of select="$level1tabs"/></xsl:with-param></xsl:call-template>


步驟3: 被呼叫的副程式如下:
<xsl:template name="outputTabs">
<xsl:param name="currentNum">1</xsl:param>
<xsl:param name="maxNum"/><![CDATA["" ]]><xsl:if test="$maxNum!=''"><xsl:if test="$currentNum &lt; $maxNum"><xsl:call-template name="outputTabs">
<xsl:with-param name="currentNum"><xsl:value-of select="$currentNum + 1" /></xsl:with-param>
<xsl:with-param name="maxNum"><xsl:value-of select="$maxNum" /></xsl:with-param>
</xsl:call-template></xsl:if></xsl:if></xsl:template>


update: 2012-08-22, 副程式升級, 可以自行定義要輸出的符號.

2012年5月24日 星期四

csv 欄位內容裡的 數字0 透過 Excel 開啟後消失的解法

最近做了一個匯出 csv 的功能, 一般的情況下手機都是數字 0 開頭, 例如: 09xx-xxx-xxx 但是用 Excel 開啟後該欄位的0 會被Excel 刪掉, 剩下 9xx-xxx-xxx 以前的解法是增加一個單引號為起始符號, 這個解法目前也還可以用, 但單引號也會一起出來, 變的不好看也很奇怪, 由於是要匯給 Excel 所以就透過公式的等號(=) 來解決, csv 內容如下:




再透過 Excel 開啟, 就可以看到漂亮的數字0 了, 感動ing.



2012年5月21日 星期一

Asp 中強迫輸出 BOM 字元的方式

做了一個匯出資料的功能, 但產生出來的 Utf-8 編碼 csv 檔, 用 Excel 檔開啟都會是亂碼, 他應該是誤以為是 ANSI 格式, 這次的目的是要讓 Excel  正常開啟 Utf-8 編碼 csv 檔.


如果是 asp.net 的話可以透過:

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    Response.BinaryWrite(new byte[] { 0xEF, 0xBB, 0xBF }); 
}


來產生, utf-8 識別用的(BOM)字元.


如果是  php 的話, 就是:
fwrite($fp, "\xEF\xBB\xBF".$output)


如果是 asp 的話, 可以透過下列的函數來丟出 BOM 字元,

sub SendHex(valHex)
    for cHex = 1 to Len(valHex) step 2
        Response.BinaryWrite ChrB(CByte("&H" & Mid(valHex,cHex,2)))
    next
end sub

我比較建議使用下面這個方法:

    Response.CodePage = 65001
    Response.BinaryWrite(chrb(239))
    Response.BinaryWrite(chrb(187))
    Response.BinaryWrite(chrb(191))



另一個解法是透過 Server.CreateObject("ADODB.Stream") 物件來增加(或移除) BOM 字元, 參考看看: http://www.andmm.cn/post/48.html


我是透過ADODB.Stream 來處理, 最後用 Excel 開啟 csv 檔就正常了.

Facebook 留言板