Aspose.Words for .NET使用表格教程之處理合并的單元格
推薦閱讀:【Aspose.Words for .NET使用表格教程之應(yīng)用格式——將格式應(yīng)用于表,行和單元格】
Aspose.Words For .Net是一種高級Word文檔處理API,用于執(zhí)行各種文檔管理和操作任務(wù)。API支持生成,修改,轉(zhuǎn)換,呈現(xiàn)和打印文檔,而無需在跨平臺應(yīng)用程序中直接使用Microsoft Word。此外,API支持所有流行的Word處理文件格式,并允許將Word文檔導(dǎo)出或轉(zhuǎn)換為固定布局文件格式和最常用的圖像/多媒體格式。
接下來我們將進(jìn)入“使用格式”的介紹,其中包括應(yīng)用格式、介紹和創(chuàng)建表、添加和拆分表以及使用列和行。本文將為大家講解如何在表格中運用自動調(diào)整設(shè)置。
>>Aspose.Words for .NET更新至最新版v19.10,歡迎下載體驗
致改變世界的程序員——現(xiàn)在購買Aspose系列產(chǎn)品最高可享10000元高額減免!更多活動詳情可咨詢在線客服哦~
在一個表中,幾個單元格可以合并到一個單元格中。當(dāng)某些行需要標(biāo)題或跨表寬度的大塊文本時,此功能很有用。這只能通過將表中的某些單元格合并為一個單元格來實現(xiàn)。當(dāng)使用所有輸入格式(包括導(dǎo)入HTML內(nèi)容)時,Aspose.Words支持合并的單元格。
Aspose.Words中的合并單元格
在Aspose.Words中,合并的單元格由CellFormat.HorizontalMerge和CellFormat.VerticalMerge表示。所述CellFormat.HorizontalMerge屬性描述如果所述細(xì)胞是細(xì)胞的水平合并的一部分。同樣,CellFormat.VerticalMerge屬性描述單元格是否是單元格垂直合并的一部分。這些屬性的值定義了單元格的合并行為。
- 合并單元格序列中的第一個單元格將具有CellMerge.First。
- 任何隨后合并的單元格將具有CellMerge.Previous。
- 未合并的單元格將具有CellMerge.None。
檢查單元格是否合并
要檢查某個單元格是否為合并單元格序列的一部分,我們只需檢查CellFormat.HorizontalMerge和CellFormat.VerticalMerge屬性。 下面的示例顯示單元格的水平和垂直合并類型。您可以從此處下載該示例的模板文件。
Document doc = new Document(dataDir + "Table.MergedCells.doc"); // Retrieve the first table in the document. Table table = (Table)doc.GetChild(NodeType.Table, 0, true); foreach (Row row in table.Rows) { foreach (Cell cell in row.Cells) { Console.WriteLine(PrintCellMergeType(cell)); } }
合并表格中的單元格
使用相同的技術(shù)來設(shè)置表中單元格的合并行為。使用DocumentBuilder構(gòu)建具有合并單元格的表時,需要為每個單元格設(shè)置適當(dāng)?shù)暮喜㈩愋?。另外,您必須記住清除合并設(shè)置,否則表中的所有單元格將被合并??梢酝ㄟ^將適當(dāng)?shù)暮喜傩缘闹翟O(shè)置為CellMerge.None來完成。 下面的示例創(chuàng)建一個具有兩行的表,其中第一行的單元格水平合并。
Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.InsertCell(); builder.CellFormat.HorizontalMerge = CellMerge.First; builder.Write("Text in merged cells."); builder.InsertCell(); // This cell is merged to the previous and should be empty. builder.CellFormat.HorizontalMerge = CellMerge.Previous; builder.EndRow(); builder.InsertCell(); builder.CellFormat.HorizontalMerge = CellMerge.None; builder.Write("Text in one cell."); builder.InsertCell(); builder.Write("Text in another cell."); builder.EndRow(); builder.EndTable(); dataDir = dataDir + "Table.HorizontalMerge_out.doc"; // Save the document to disk. doc.Save(dataDir);
下面的示例創(chuàng)建一個具有兩列的表格,第一列中的單元格垂直合并。
Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.InsertCell(); builder.CellFormat.VerticalMerge = CellMerge.First; builder.Write("Text in merged cells."); builder.InsertCell(); builder.CellFormat.VerticalMerge = CellMerge.None; builder.Write("Text in one cell"); builder.EndRow(); builder.InsertCell(); // This cell is vertically merged to the cell above and should be empty. builder.CellFormat.VerticalMerge = CellMerge.Previous; builder.InsertCell(); builder.CellFormat.VerticalMerge = CellMerge.None; builder.Write("Text in another cell"); builder.EndRow(); builder.EndTable(); dataDir = dataDir + "Table.VerticalMerge_out.doc"; // Save the document to disk. doc.Save(dataDir);
在不使用構(gòu)建器的其他情況下(例如在現(xiàn)有表中),以這種方式合并單元可能不是那么簡單。 取而代之的是,我們可以將將合并屬性應(yīng)用于單元格所涉及的基本操作包裝到一種使任務(wù)輕松得多的方法中。 此方法類似于自動合并方法,該方法被稱為合并表中的一系列單元格。 下面的代碼將合并表中從給定單元格到結(jié)束單元格的單元格范圍。 此范圍可以跨越許多行或列。 一種合并表中所有單元格在指定單元格范圍內(nèi)的方法。
internal static void MergeCells(Cell startCell, Cell endCell) { Table parentTable = startCell.ParentRow.ParentTable; // Find the row and cell indices for the start and end cell. Point startCellPos = new Point(startCell.ParentRow.IndexOf(startCell), parentTable.IndexOf(startCell.ParentRow)); Point endCellPos = new Point(endCell.ParentRow.IndexOf(endCell), parentTable.IndexOf(endCell.ParentRow)); // Create the range of cells to be merged based off these indices. Inverse each index if the end cell if before the start cell. Rectangle mergeRange = new Rectangle( System.Math.Min(startCellPos.X, endCellPos.X), System.Math.Min(startCellPos.Y, endCellPos.Y), System.Math.Abs(endCellPos.X - startCellPos.X) + 1, System.Math.Abs(endCellPos.Y - startCellPos.Y) + 1); foreach (Row row in parentTable.Rows) { foreach (Cell cell in row.Cells) { Point currentPos = new Point(row.IndexOf(cell), parentTable.IndexOf(row)); // Check if the current cell is inside our merge range then merge it. if (mergeRange.Contains(currentPos)) { if (currentPos.X == mergeRange.X) cell.CellFormat.HorizontalMerge = CellMerge.First; else cell.CellFormat.HorizontalMerge = CellMerge.Previous; if (currentPos.Y == mergeRange.Y) cell.CellFormat.VerticalMerge = CellMerge.First; else cell.CellFormat.VerticalMerge = CellMerge.Previous; } } } }
下面的示例合并兩個指定單元格之間的單元格范圍。
// Open the document Document doc = new Document(dataDir + "Table.Document.doc"); // Retrieve the first table in the body of the first section. Table table = doc.FirstSection.Body.Tables[0]; // We want to merge the range of cells found inbetween these two cells. Cell cellStartRange = table.Rows[2].Cells[2]; Cell cellEndRange = table.Rows[3].Cells[3]; // Merge all the cells between the two specified cells into one. MergeCells(cellStartRange, cellEndRange); dataDir = dataDir + "Table.MergeCellRange_out.doc"; // Save the document. doc.Save(dataDir);
ASPOSE技術(shù)交流QQ群(642018183)已開通,各類資源及時分享,歡迎交流討論!
掃描關(guān)注“慧聚IT”微信公眾號,及時獲取更多產(chǎn)品最新動態(tài)及最新資訊