OpenXml合并Table單元格代碼實(shí)例
using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using OpenXML.Model; using System; using System.Collections.Generic; namespace OpenXML { class Program { //表格數(shù)據(jù) public static List<List<string>> _tabData; public Program(List<List<string>> tabData) { _tabData = tabData; } static void Main(string[] args) { List<string> dataTitle = new List<string>() { "序號(hào)","姓名","性別"}; List<string> data1 = new List<string>() { "1", "張三", "男" }; List<string> data2 = new List<string>() { "2", "王五", "男" }; List<string> data3 = new List<string>() { "3", "李四", "女" }; _tabData = new List<List<string>>(); _tabData.Add(dataTitle); _tabData.Add(data1); _tabData.Add(data2); _tabData.Add(data3); CreateTable(_tabData, @"C:\Users\dzw159\Desktop\WT\VS\OpenXMLFile\openXMLTest.docx",300); //CreateOpenXMLFile(@"C:\Users\dzw159\Desktop\WT\VS\OpenXMLFile\openXMLTest.docx"); Console.WriteLine("Hello World!"); Console.Read(); } /// <summary> /// 創(chuàng)建Word /// </summary> /// <param name="filePath"></param> public static void CreateOpenXMLFile(string filePath) { using (WordprocessingDocument objWordDocument = WordprocessingDocument.Create(filePath, WordprocessingDocumentType.Document)) { MainDocumentPart objMainDocumentPart = objWordDocument.AddMainDocumentPart(); objMainDocumentPart.Document = new Document(new Body()); Body objBody = objMainDocumentPart.Document.Body; //創(chuàng)建一些需要用到的樣式,如標(biāo)題3,標(biāo)題4,在OpenXml里面,這些樣式都要自己來創(chuàng)建的 //ReportExport.CreateParagraphStyle(objWordDocument); SectionProperties sectionProperties = new SectionProperties(); PageSize pageSize = new PageSize(); PageMargin pageMargin = new PageMargin(); Columns columns = new Columns() { Space = "220" };//720 DocGrid docGrid = new DocGrid() { LinePitch = 100 };//360 //創(chuàng)建頁面的大小,頁距,頁面方向一些基本的設(shè)置,如A4,B4,Letter, //GetPageSetting(PageSize,PageMargin); //在這里填充各個(gè)Paragraph,與Table,頁面上第一級(jí)元素就是段落,表格. objBody.Append(new Paragraph()); objBody.Append(new Table()); objBody.Append(new Paragraph()); //我會(huì)告訴你這里的順序很重要嗎?下面才是把上面那些設(shè)置放到Word里去.(大家可以試試把這下面的代碼放上面,會(huì)不會(huì)出現(xiàn)打開openxml文件有誤,因?yàn)閮?nèi)容有誤) sectionProperties.Append(pageSize, pageMargin, columns, docGrid); objBody.Append(sectionProperties); //如果有頁眉,在這里添加頁眉. //if (IsAddHead) //{ //添加頁面,如果有圖片,這個(gè)圖片和上面添加在objBody方式有點(diǎn)不一樣,這里搞了好久. //ReportExport.AddHeader(objMainDocumentPart, image); //} objMainDocumentPart.Document.Save(); } } /// <summary> /// 創(chuàng)建Tab /// </summary> /// <param name="tabData"></param> /// <param name="filePath"></param> /// <param name="width"></param> public static void CreateTable(List<List<string>> tabData, string filePath,int width) { //打開Word文件 using (WordprocessingDocument d = WordprocessingDocument.Open(filePath,true)) { //聲明表格 Table tab = new Table(); //表格樣式 TableProperties tblProp = new TableProperties(new TableBorders( new TableBorders( new TopBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single),Size = 4}, new BottomBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 }, new LeftBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 }, new RightBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 }, new InsideHorizontalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 }, new InsideVerticalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 } ) )); //設(shè)置表格寬度 tblProp.TableWidth = new TableWidth() { Width = width.ToString(), Type = TableWidthUnitValues.Dxa }; //樣式添加 tab.Append(tblProp); int j = 0; //循環(huán)生成單元格 foreach (var item in tabData) { //聲明Tab行 TableRow row = new TableRow(); for (var i = 0; i < item.Count; i++) { //申明單元格 TableCell cell = new TableCell(); TableCellProperties tableCellProperties = new TableCellProperties(); //單元格樣式設(shè)置 TableCellMargin margin = new TableCellMargin(); margin.LeftMargin = new LeftMargin() { Width="100", Type = TableWidthUnitValues.Dxa }; margin.RightMargin = new RightMargin() { Width = "100", Type = TableWidthUnitValues.Dxa }; tableCellProperties.Append(margin); Paragraph par = new Paragraph(); Run run = new Run(); //如果同一列的參數(shù)相同(合并單元格) if (j < (tabData.Count - 1) && item[i] == tabData[j + 1][i]) { VerticalMerge verticalMerge = new VerticalMerge() { Val = MergedCellValues.Restart }; //RunProperties rpr = new RunProperties(); //rpr.Append(new Bold()); //run.Append(rpr); //verticalMerge.Val = MergedCellValues.Restart; //Text t = new Text(item[i]); //t.Space = new EnumValue<SpaceProcessingModeValues>(SpaceProcessingModeValues.Preserve); //run.Append(t); TableCellProperties tableCellProperties2 = new TableCellProperties(); tableCellProperties2.Append(verticalMerge); cell.Append(tableCellProperties2); Text t = new Text(item[i]); t.Space = new EnumValue<SpaceProcessingModeValues>(SpaceProcessingModeValues.Preserve); run.Append(t); } //和上一行比較(合并單元格) else if (j>0 && j < (tabData.Count) && item[i] == tabData[j -1][i]) { VerticalMerge verticalMerge = new VerticalMerge() { Val = MergedCellValues.Continue }; TableCellProperties tableCellProperties2 = new TableCellProperties(); tableCellProperties2.Append(verticalMerge); cell.Append(tableCellProperties2); Text t = new Text(item[i]); t.Space = new EnumValue<SpaceProcessingModeValues>(SpaceProcessingModeValues.Preserve); run.Append(t); } else { //RunProperties rPr = new RunProperties(); //rPr.Append(new Bold()); //run.Append(rPr); //單元格內(nèi)容添加(由內(nèi)向外順序) Text t = new Text(item[i]); t.Space = new EnumValue<SpaceProcessingModeValues>(SpaceProcessingModeValues.Preserve); run.Append(t); } par.Append(run); cell.Append(tableCellProperties); cell.Append(par); row.Append(cell); } j++; //表格添加行 tab.Append(row); } //objBody.Append(new Paragraph()); //objBody.Append(new Table()); d.MainDocumentPart.Document.Body.Append(new Paragraph(new Run(tab))); d.MainDocumentPart.Document.Save(); } } } }
注:他們有的說,標(biāo)記為MergedCellValues.Continue的縱向單元格一定要給值?。ㄟ@個(gè)我試著給賦值null或者為“”,都能正常合并)
以上就是全部知識(shí)點(diǎn)內(nèi)容,感謝大家的閱讀和對(duì)腳本之家的支持。
相關(guān)文章
C#使用帶like的sql語句時(shí)防sql注入的方法
這篇文章主要介紹了C#使用帶like的sql語句時(shí)防sql注入的方法,采用了一個(gè)比較簡(jiǎn)單的字符串過濾方法就可以有效提高sql語句的安全性,防止sql注入,需要的朋友可以參考下2014-09-09探討C#中Dispose方法與Close方法的區(qū)別詳解
本篇文章是對(duì)C#中Dispose方法與Close方法的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06淺析C#靜態(tài)類,靜態(tài)構(gòu)造函數(shù),靜態(tài)變量
這篇文章主要介紹了淺析C#靜態(tài)類,靜態(tài)構(gòu)造函數(shù),靜態(tài)變量 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析
這篇文章主要介紹了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析,以實(shí)例形式較為詳細(xì)的講述了.NET Framework里面提供的三種Timer具體用法,需要的朋友可以參考下2014-10-10C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器小功能
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01C# .NET實(shí)現(xiàn)掃描識(shí)別圖片中的文字
本文以C#及VB.NET代碼為例,介紹如何掃描并讀取圖片中的文字。文中的示例代碼介紹詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12C#?漢字與拼音互轉(zhuǎn)的實(shí)現(xiàn)示例
本文主要介紹了C#?漢字與拼音互轉(zhuǎn)的實(shí)現(xiàn)示例,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03