2009年10月27日 星期二

2009 秋季敗家單

10-11月因為工作的關係,都不能去爬山,所以只好上網逛逛敗家了。

這次的敗家清單有:


  • Arc'teryx Bora 65 hip belt Men's - M:Arc'teryx 去百岳試背過,男款Bora M號的背長對我來說太長,女款M號的背長、腰帶又太短。所以最後我買了一個Men's S Size,不過還是覺得腰帶沒有M 號來的合身(中年男子的特徵就是鮪魚肚阿....)。

  • Arc'teryx Gamma SV 女款 L號(我覺得我比較喜歡女款...一方面因為合身,但最重要的,是女款的價格總是比較漂亮!不過有個問題,穿起來胸部靠腋下那兩邊總是會有點空啊...)

  • Marmot PerCip Full Zip Men's - M:我有兩件雨褲,第一件是在百岳買的500元雨褲,雖然袋子上寫的是防水透氣雨褲,不過,這種雨褲其實是"雙濕牌",下雨天爬山真的是內外雙濕。所以不久後,我又買了第二件雨褲Sierra Designs Elevation Pants,這是在STP買的,一件大約NT$1500,很薄很輕,但也很容易壞!因為快被我洗壞了,所以又買了我登山第三件雨褲:Marmot PerCip Full Zip,希望可以撐久點(不過很難啦,因為這件也是又輕又薄又不耐用的~)

  • MSR HyperFlow MicroFilter:這個濾水器就是無心之過了,其實本來沒想到要買這東西的,只是剛好看到打6折...所以手殘就點下去了,克制力真是低阿!











2009年10月26日 星期一

Word 套表之2

之前有發表第一種Word套表方式其實蠻簡單的,單機也很好用。
但要放到Web Server讓ASP呼叫,那可就一點都不好玩了。
找了一天資料後,決定還是用Word 2007 OPEN XML格式文件來解決我的問題。
至於使用者沒有Office 2007怎麼辦?那就在網頁加個連結,讓User 下載相容套件囉。

首先,先了解一下Word OPEN XML格式,在這版本中,Word其實是由一些XML壓縮起來的檔案,所以.docx檔案可以用壓縮軟體(如7-zip)解壓縮,就可以看到構成word檔的那些XML。

一個基本的.docx包含了4個目錄,而這裡面最重要的,就是word目錄。因為主要文件檔就是word\document.xml。一些簡單的文字取代,我就在範本中先加入特定字串,然後使用XMLDocument尋找這些字串,然後取代。
但Image就不能這樣做了,在word中加入Image,在.docx內的動作其實分為下面幾個步驟:
  1. 複製圖片到 word\media\
  2. [Content_Types].xml 增加ContentType
  3. 在word\_rel\document.xml.rels 增加ImagePart
  4. 在主要的word\document.xml 增加與ImagePart ID對應的XML
前面三個步驟其實很簡單,只要幾行指令:

ImagePart part = m_Document.MainDocumentPart.AddImagePart(ImagePartType.Jpeg);

using (FileStream stream = new FileStream(imageFile, FileMode.Open))
{
part.FeedData(stream);
}
但第四個步驟可就困擾我很久了...
因為我看到的範例,幾乎都是先建立一個XML檔或資源檔,裡面存放Image的XML,要插入這個片段時,再把關鍵字取代(如圖片寬、高,還有最重要的ImagePart ID...)。接著把這個片段插入指定的段落中。難就難在範例都沒寫到怎麼把特定位置的XML Node找出來...最後雖然有解決了,但我還是決定不用這方法了。若有興趣,可參考http://openxmldeveloper.org/forums/post/7189.aspx
因為我的圖片是要放到Word表格某個cell,所以最後我還是決定參考http://msdn.microsoft.com/en-us/library/ee342530.aspxhttp://msdn.microsoft.com/en-us/library/cc850835%28office.14%29.aspx這2篇文章。
使用Open XML Format SDK 2.0 來解決我的問題。 而且,用這種方式要修改Table或段落的格式也方便多了。

2009年10月25日 星期日

Word 套表

上周為了寫Word 套表,花了很多時間去找尋解決方案。

其實之前就已經用過把Word 2003存成XML格式,然後用更新字串的方式解決Word簡單套表。

不過這次的需求是,要把圖片從資料庫讀出,塞到指定的儲存格上。



一開始想說不是每個使用者都有Word 2007,所以規劃就是使用Microsoft.Office.Interop.Word來插入圖片。

[範例] 使用bookmark,這種適用Word 2003。

開啟Word 範本,在要插入圖片位置上插入書簽,存檔,關閉。

在程式加入Microsoft.Office.Interop.Word 參考。

object oMissing = Type.Missing;

object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;

doc.Content.Collapse(ref oCollapseEnd);

string filename = @"c:\temp\WordMLImage.bmp";



//把圖片塞到Word

bookmarkName = "StuPhoto";

if (doc.Bookmarks.Exists(bookmarkName)) {

Object name = bookmarkName;

Microsoft.Office.Interop.Word.Range range = doc.Bookmarks.get_Item(ref name).Range;

range.InlineShapes.AddPicture(filename,ref oMissing, ref oMissing, ref oMissing);

}


//save file

object newFileName = @"C:\temp\changedFile.doc";

doc.SaveAs(ref newFileName, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

_wordApp.Quit(ref oMissing, ref oMissing, ref oMissing);

但這種方式只適合單機程式,因為看了一些文章後,發現這種方式在WEB 多人使用情況會造成鎖死與資源浪費的問題。