Aspose系列的控件,,功能都挺好,,之前一直在我的Winform開發(fā)框架中用Aspose.Cell來做報(bào)表輸出,可以實(shí)現(xiàn)多樣化的報(bào)表設(shè)計(jì)及輸出,,由于一般輸出的內(nèi)容比較正規(guī)化或者多數(shù)是表格居多,所以一般使用Aspose.Cell來實(shí)現(xiàn)我想要的各種Excel報(bào)表輸出,。雖然一直也知道Aspose.Word是用來生成Word文檔的,,而且深信其也是一個(gè)很強(qiáng)大的控件,但一直沒用用到,,所以就不是很熟悉,。 偶然一次機(jī)會,一個(gè)項(xiàng)目的報(bào)表功能指定需要導(dǎo)出為Word文檔,,因此尋找了很多篇文章,,不過多數(shù)介紹的比較簡單一點(diǎn),于是也參考了官方的幫助介紹,,終于滿足了客戶的需求,。下面我由淺入深來介紹這個(gè)控件在實(shí)際業(yè)務(wù)中的使用過程吧。 1,、二維表格的Word操作日常中,,常見的內(nèi)容輸出就是二維表格的方式,表頭比較固定,內(nèi)容每行一條,,那么在實(shí)際的使用控件我們該如何操作呢,,其實(shí)這個(gè)控件這方面介紹的文章很多,參考一下就能做出來了,。其實(shí)介紹這個(gè)就是要說明書簽的重要性,,這個(gè)在Aspose.Cell控件也是如此,書簽除了可以用來替換內(nèi)容,,還可以用來標(biāo)記內(nèi)容輸入的開始位置等等功能,。 首先我們在一個(gè)空白的Word文檔中繪制一個(gè)表格頭,然后再換行的開始插入一個(gè)標(biāo)簽引用,,插入書簽有兩種方式,,一種是在Word(2007、2010)的【插入】-【書簽】中插入制定位置的書簽引用,,如下所示,。 一種是在Word的自定義快速訪問工具欄上添加其他命令,如下步驟所示 前者插入的書簽是沒有文字或者特別的標(biāo)記,,但是確實(shí)存在,,后者會插入一個(gè)灰色塊作為占位符,如下所示,,我這這個(gè)二維表格的例子里面使用后者進(jìn)行測試(兩者同等效果的) 這樣設(shè)計(jì)好Word模板后,,下一步就是如何利用代碼生成二維表格了。首先這里提示一下,,就是我故意設(shè)置了每個(gè)表格單元格的寬度不同,,所以也就要求生成的行要和頭部對應(yīng),所以表格生成每行之前,,肯定要獲得對應(yīng)列的樣式屬性的,,否則就會對應(yīng)不上了。下面看代碼,。 try { Aspose.Words.Document doc = new Aspose.Words.Document(templateFile); Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc); DataTable nameList = DataTableHelper.CreateTable("編號,姓名,時(shí)間"); DataRow row = null; for (int i = 0; i < 50; i++) { row = nameList.NewRow(); row["編號"] = i.ToString().PadLeft(4, '0'); row["姓名"] = "伍華聰 " + i.ToString(); row["時(shí)間"] = DateTime.Now.ToString(); nameList.Rows.Add(row); } List<double> widthList = new List<double>(); for (int i = 0; i < nameList.Columns.Count; i++) { builder.MoveToCell(0, 0, i, 0); //移動單元格 double width = builder.CellFormat.Width;//獲取單元格寬度 widthList.Add(width); } builder.MoveToBookmark("table"); //開始添加值 for (var i = 0; i < nameList.Rows.Count; i++) { for (var j = 0; j < nameList.Columns.Count; j++) { builder.InsertCell();// 添加一個(gè)單元格 builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.Borders.Color = System.Drawing.Color.Black; builder.CellFormat.Width = widthList[j]; builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None; builder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;//垂直居中對齊 builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;//水平居中對齊 builder.Write(nameList.Rows[i][j].ToString()); } builder.EndRow(); } doc.Range.Bookmarks["table"].Text = ""; // 清掉標(biāo)示 doc.Save(saveDocFile); if (MessageUtil.ShowYesNoAndTips("保存成功,,是否打開文件?") == System.Windows.Forms.DialogResult.Yes) { System.Diagnostics.Process.Start(saveDocFile); } } catch (Exception ex) { LogHelper.Error(ex); MessageUtil.ShowError(ex.Message); return; } 以上代碼的步驟就是 1)創(chuàng)建Aspose.Words.Document 和 Aspose.Words.DocumentBuilder對象,,然后生成數(shù)據(jù)的二維表格內(nèi)容,。 2)遍歷模板表格,或者每一列的寬度,,以備后用,。 3)移動到表格的書簽位置,然后開始錄入數(shù)據(jù),,Word表格的每個(gè)Cell都要求制定樣式和寬度,,這樣才能和表格頭部吻合。 4)保存文件內(nèi)容到新的文件里面即可。 輸出的效果如下所示,。 2,、單元格合并的操作常見的Word文件或者Excel文件中,都經(jīng)??吹胶喜卧竦膬?nèi)容,,因此這個(gè)部分也是非常常見的操作,必須掌握,。 我們先看一個(gè)例子代碼及效果,。 try { Aspose.Words.Document doc = new Aspose.Words.Document(templateFile); Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc); builder.InsertCell(); builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.Borders.Color = System.Drawing.Color.Black; builder.CellFormat.VerticalMerge = CellMerge.First; builder.Write("Text in merged cells."); builder.InsertCell(); builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.Borders.Color = System.Drawing.Color.Black; builder.CellFormat.VerticalMerge = CellMerge.None; builder.Write("Text in one cell"); builder.EndRow(); builder.InsertCell(); builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.Borders.Color = System.Drawing.Color.Black; // This cell is vertically merged to the cell above and should be empty. builder.CellFormat.VerticalMerge = CellMerge.Previous; builder.InsertCell(); builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.Borders.Color = System.Drawing.Color.Black; builder.CellFormat.VerticalMerge = CellMerge.None; builder.Write("Text in another cell"); builder.EndRow(); doc.Save(saveDocFile); if (MessageUtil.ShowYesNoAndTips("保存成功,是否打開文件,?") == System.Windows.Forms.DialogResult.Yes) { System.Diagnostics.Process.Start(saveDocFile); } } catch (Exception ex) { LogHelper.Error(ex); MessageUtil.ShowError(ex.Message); return; } 他的效果如下 關(guān)于合并單元格的介紹,,你還可以參考下這篇官方介紹:http://www./docs/display/wordsnet/Working+with+Merged+Cells 如果上面的例子還不夠明白,OK,,我在介紹一個(gè)實(shí)際的例子,來說明合并單元格的操作模式,。 實(shí)際文檔生成如下所示: 文檔的模板如下所示: 其實(shí)這個(gè)里面的“測試”內(nèi)容是使用代碼寫入的,,其實(shí)就是一行業(yè)務(wù)數(shù)據(jù),,用兩行來展示,其中有些合并的單元格,,這是一個(gè)實(shí)際項(xiàng)目的表格形式,。我們注意到,,每行有13個(gè)單元格,其中第一,、第二,、第十三列是合并列。和并列有一個(gè)特點(diǎn),就是它的兩個(gè)索引都有效,,不過只是能使用第一個(gè)索引來對它進(jìn)行操作復(fù)制,,利用第二個(gè)沒有用處的。 如第一個(gè)列是和并列,,它應(yīng)該有0、13這樣的索引,,第二列也是和并列,它也有1,、14的索引,,其他的類推。 了解這樣的邏輯關(guān)系后,,我們看實(shí)際操作的代碼如下所示,。 try { Aspose.Words.Document doc = new Aspose.Words.Document(templateFile); Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc); List<double> widthList = new List<double>(); for (int i = 0; i < 13; i++) { builder.MoveToCell(0, 2, i, 0); //移動單元格 double width = builder.CellFormat.Width;//獲取單元格寬度 widthList.Add(width); } builder.MoveToBookmark("table"); //開始添加值 Table table = builder.StartTable(); builder.RowFormat.HeadingFormat = true; builder.ParagraphFormat.Alignment = ParagraphAlignment.Center; for (int j = 0; j < 26; j++) { builder.InsertCell();// 添加一個(gè)單元格 builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.Borders.Color = System.Drawing.Color.Black; int cellIndex = (j > 12) ? (j-13) : j; //位于第幾個(gè)單元格 builder.CellFormat.Width = widthList[cellIndex]; builder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;//垂直居中對齊 builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;//水平居中對齊 builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None; if (cellIndex == 0 || cellIndex == 1 || cellIndex == 12) { if (j > 12) { builder.CellFormat.VerticalMerge = CellMerge.Previous; } else { builder.CellFormat.VerticalMerge = CellMerge.First; } } builder.Write("測試" + j.ToString()); if (cellIndex == 12 ) { builder.EndRow(); } } builder.EndTable(); doc.Save(saveDocFile); if (MessageUtil.ShowYesNoAndTips("保存成功,是否打開文件,?") == System.Windows.Forms.DialogResult.Yes) { System.Diagnostics.Process.Start(saveDocFile); } } catch (Exception ex) { LogHelper.Error(ex); MessageUtil.ShowError(ex.Message); return; } |
|