估計很多開發人員都爲導出Excel或者Word煩擾吧..網上有各種各樣的導出方法...經常用到的方法就是畫網頁..例如下面的GridView導出excel的代碼..這段代碼雖然有效..但是其實非常不好用..不僅不能改變Excel單元的大小..而且還有亂七八糟的排版問題..這篇文章說得是導出Word的..扯到Excel有點遠了,但是主要說明的是導出方法千奇百怪..大家要選擇一種好的有效的..不要盲目的做..到時候覺得不行的時候又要改。今天我和大家說得是Aspose組件,不僅可以導出Excel還能導出Word和其他不同格式的...好了進入正題.
System.Web.HttpContext.Current.Response.Clear(); System.Web.HttpContext.Current.Response.Buffer
= true ; System.Web.HttpContext.Current.Response.Write( "<html
xmlns:x=\"urn:schemas-microsoft-com:office:excel\">" ); System.Web.HttpContext.Current.Response.Write( "<head>" ); System.Web.HttpContext.Current.Response.Write( "<meta
http-equiv=Content-Type content=text/html;charset=gb2312>" ); //解決中文亂碼問題,導出數據在20行內容易出現亂碼 System.Web.HttpContext.Current.Response.Write( "<!--[if
gte mso 9]><xml>" ); System.Web.HttpContext.Current.Response.Write( "<x:ExcelWorkbook>" ); System.Web.HttpContext.Current.Response.Write( "<x:ExcelWorksheets>" ); System.Web.HttpContext.Current.Response.Write( "<x:ExcelWorksheet>" ); System.Web.HttpContext.Current.Response.Write( "<x:Name>sheet1</x:Name>" ); System.Web.HttpContext.Current.Response.Write( "<x:WorksheetOptions>" ); System.Web.HttpContext.Current.Response.Write( "<x:Print>" ); System.Web.HttpContext.Current.Response.Write( "<x:ValidPrinterInfo/>" ); System.Web.HttpContext.Current.Response.Write( "</x:Print>" ); System.Web.HttpContext.Current.Response.Write( "</x:WorksheetOptions>" ); System.Web.HttpContext.Current.Response.Write( "</x:ExcelWorksheet>" ); System.Web.HttpContext.Current.Response.Write( "</x:ExcelWorksheets>" ); System.Web.HttpContext.Current.Response.Write( "</x:ExcelWorkbook>" ); System.Web.HttpContext.Current.Response.Write( "</xml>" ); System.Web.HttpContext.Current.Response.Write( "<![endif]-->
" ); |
我們要導出如下圖樣式的Word
首先我們來畫模板..其實很簡單的...模板就是下面這幅圖.我來簡單的介紹一下 <TableStart:All> 是表示從名爲All的 DataTable 裏面獲取數據 <TableEnd:All>就是結束的位置,中間的<jylx> <my> 之類的都是名爲All這個的DataTable的列名.中間還有另外一個<TableStart:Item> <TableStart:Item> 同理這個是名爲Item的DataTable 他們中間的<mc> <sl>就是Item這個表的列名。
上面介紹了怎麼畫模板,我突然忘了告訴大家如何插入那些標籤了...其實很簡單只要在Word裏面插入域即可..如下圖所示.
下面我來說說代碼應該如何寫,首先構造一個DataSet包含兩個DataTable一個叫All 一個叫Item..添加代碼大致如下,之後就是填充這2個DataTable即可
private DataSet GetOneDs() { DataTable dt1 = new DataTable("All"); dt1.Columns.Add("jylx"); dt1.Columns.Add("my"); dt1.Columns.Add("mc");// dt1.Columns.Add("mz");// dt1.Columns.Add("mjz");// //dt1.Columns.Add("mqt");//其他 dt1.Columns.Add("sjbm");// dt1.Columns.Add("yqwcrq");//要求完成日期 dt1.Columns.Add("jyyj");//檢驗依據 dt1.Columns.Add("szq");//自取 dt1.Columns.Add("sdzwd");//電子文檔 dt1.Columns.Add("sqt");//其它 dt1.Columns.Add("ztwz");//完整 dt1.Columns.Add("ztqx");//缺陷 dt1.Columns.Add("ztms");//描述 dt1.Columns.Add("sjbmfzr");//送檢部門負責人 dt1.Columns.Add("syrrq");//送檢人/日期 dt1.Columns.Add("jybmfzr");//檢測部門負責人 dt1.Columns.Add("jyrrq");//接樣人/日期 DataRow dr1 = dt1.NewRow(); dr1["my"] = "□";// dr1["mc"] = "□";// dr1["mz"] = "□";// dr1["mbz"] = "□";// dr1["ztwz"] = "□";//完整 dr1["ztqx"] = "□";//缺陷 dr1["sdzwd"] = "□";//完整 dr1["szq"] = "□";//缺陷 dt1.Rows.Add(dr1); DataTable dt2 = new DataTable("Item"); dt2.Columns.Add("bh"); dt2.Columns.Add("mc"); dt2.Columns.Add("sl"); dt2.Columns.Add("rq"); DataSet ds = new DataSet(); ds.Tables.Add(dt1); ds.Tables.Add(dt2); return ds; }
最後只要根據DataSet填充模板輸出即可..代碼如下
Document doc = new Document(strPath); doc.MailMerge.ExecuteWithRegions(ds); doc.Save(Page.Response, "C010.doc", ContentDisposition.Attachment, SaveOptions.CreateSaveOptions(SaveFormat.Doc));
由於這篇文章的報表是內部報表我不方便公開代碼..所以我儘量寫的詳細了..希望大家理解..有什麼不懂可以留言探討.
Aspose.Words 下載地址:http://files.cnblogs.com/cracker/Aspose.Words.rar