openxml对word的一些基本操作
/// <summary> /// 用于获取内容控件中指定的文档表 /// </summary> /// <param name="oxe">内容控件</param> /// <param name="tag">标签</param> /// <returns></returns> public static Table DOC_TAB_GetTable(ref OpenXmlElement _oxe, string _tag) { SdtBlock _tBlock = _oxe.Descendants<SdtBlock>().Where(el => el.SdtProperties.GetFirstChild<Tag>().Val == _tag).Single(); return _tBlock.Descendants<Table>().Single<Table>(); } /// <summary> /// 获取内容控件表中的行数 /// </summary> /// <param name="_tb">文档表对象</param> /// <returns></returns> public static int DOC_TAB_GetTableRowCount(Table _tb) { return _tb.Elements<TableRow>().Count(); } /// <summary> /// 删除指定索引的行 /// </summary> /// <param name="_tb">文档表对象</param> /// <param name="_index">删除行的索引</param> /// <returns></returns> public static bool DOC_TAB_DeleteTableRow(ref Table _tb, int _index) { if (!(_index >= 0 && _index < _tb.Elements<TableRow>().Count())) { return false; } try { _tb.RemoveChild(_tb.Elements<DocumentFormat.OpenXml.Wordprocessing.TableRow>().ElementAt(_index)); } catch (Exception e) { throw new Exception(e.Message); } return true; } /// <summary> /// 删除指定行 (重载) /// </summary> /// <param name="_tb">文档表</param> /// <param name="_tableRow">文档表行</param> /// <returns></returns> public static bool DOC_TAB_DeleteTableRow(ref Table _tb, ref TableRow _tableRow) { try { _tb.RemoveChild(_tableRow); return true; } catch { return false; } } /// <summary> /// 返回指定索引的行 /// </summary> /// <param name="_tb">文档表对象</param> /// <param name="_index">指定行的索引</param> /// <returns></returns> public static TableRow DOC_TAB_GetTableRow(ref Table _tb, int _index) { try { return _tb.Elements<TableRow>().ElementAt(_index); } catch (Exception e) { throw new Exception(e.Message); } } /// <summary> /// 返回复制后的文档表行 /// </summary> /// <param name="_tableRow">要被复制的文档表行</param> /// <returns></returns> public static TableRow DOC_TAB_CloneTableRow(TableRow _tableRow) { return (TableRow)_tableRow.Clone(); } /// <summary> /// 返回复制后的文档表行 (重载) /// </summary> /// <param name="_tb">文档表</param> /// <param name="_index">行所在索引</param> /// <returns></returns> public TableRow DOC_TAB_CloneTableRow(Table _tb, int _index) { return (TableRow)_tb.Elements<TableRow>().ElementAt(_index).Clone(); } /// <summary> /// 向文档中指定的单元格添加数据 /// </summary> /// <param name="_content">要添加的数据</param> /// <param name="_tableRow">文档行</param> /// <param name="_index">单元格的索引</param> public static void DOC_TAB_FillCellData(string _content, ref TableRow _tableRow, int _index) { TableCell _tableCell = _tableRow.Elements<TableCell>().ElementAt(_index); string[] _contentLine = System.Text.RegularExpressions.Regex.Split(_content, @"/r/n"); DOC_TAB_ClearTextTableCell(ref _tableCell); for (int i = 0; i < _contentLine.Length; i++) { string _curCellData = _contentLine[i]; //如果是第一行,则直接填充 if (0 == i) { if (_tableCell.Elements<Paragraph>().Count() > 0) { Paragraph _newParagraph = _tableCell.Elements<Paragraph>().Last(); if (_newParagraph.Elements<ParagraphProperties>().Count() > 0) { ParagraphProperties _paragraphProper = _newParagraph.Elements<ParagraphProperties>().First(); RunProperties _newRunProper = new RunProperties(); if (_paragraphProper.Elements<ParagraphMarkRunProperties>().Count() > 0) { ParagraphMarkRunProperties _paraMarkRunProper = _paragraphProper.Elements<ParagraphMarkRunProperties>().First(); for (int j = 0; j < _paraMarkRunProper.Elements().Count(); j++) { _newRunProper.Append(_paraMarkRunProper.Elements().ElementAt(j).CloneNode(true)); } } else { _newRunProper.Append(new RunFonts() { Hint = FontTypeHintValues.EastAsia }); } _newParagraph.Append(new Run(_newRunProper, new Text(_curCellData) { Space = "preserve" })); } else { _newParagraph.Append(new ParagraphMarkRunProperties(new RunFonts() { Hint = FontTypeHintValues.EastAsia })); _newParagraph.Append(new Run(new RunProperties(new RunFonts() { Hint = FontTypeHintValues.EastAsia }), new Text(_curCellData) { Space = "preserve" })); } } else { Paragraph _newParagraph = new Paragraph(); _newParagraph.Append(new ParagraphMarkRunProperties(new RunFonts().EastAsia)); _newParagraph.Append(new DocumentFormat.OpenXml.Wordprocessing.Run(new RunProperties(new RunFonts() { Hint = FontTypeHintValues.EastAsia }), new Text(_curCellData) { Space = "preserve" })); } } else { Paragraph _paragraph = _tableCell.Elements<Paragraph>().Last(); Paragraph _newParagraph = (Paragraph)_paragraph.Clone(); DocumentFormat.OpenXml.Wordprocessing.Run _newRun = _newParagraph.Elements<DocumentFormat.OpenXml.Wordprocessing.Run>().Last(); DocumentFormat.OpenXml.Wordprocessing.Text _newText = _newRun.Elements<DocumentFormat.OpenXml.Wordprocessing.Text>().Last(); _newText.Text = _curCellData; _tableCell.Append(_newParagraph); } } } /// <summary> /// 在指定行后面添加新行 /// </summary> /// <param name="_newRow">新行</param> /// <param name="_tb">文档表</param> /// <param name="_index">行索引</param> public static void DOC_TAB_InsertRowAfter(TableRow _newRow, ref Table _tb, int _index) { TableRow _tableRow = _tb.Elements<TableRow>().ElementAt(_index); _tb.InsertAfter<TableRow>(_newRow, _tableRow); } /// <summary> /// 在指定行前面添加新行 /// </summary> /// <param name="_newRow">新行</param> /// <param name="_tb">文档表</param> /// <param name="_index">行索引</param> public static void DOC_TAB_InsertRowBefore(TableRow _newRow, ref Table _tb, int _index) { TableRow _tableRow = _tb.Elements<TableRow>().ElementAt(_index); _tb.InsertBefore<TableRow>(_newRow, _tableRow); } /// <summary> /// 清除单元格中的内容,但保留其格式 /// </summary> /// <param name="_tableCell">单元格</param> public static void DOC_TAB_ClearTextTableCell(ref TableCell _tableCell) { for (int i = _tableCell.Elements<Paragraph>().Count() - 2; i >= 0; i--) { _tableCell.Elements<Paragraph>().ElementAt(i).Remove(); } Paragraph _paragraph = _tableCell.Elements<Paragraph>().Single(); foreach (Run _run in _paragraph.Elements<Run>()) { _run.RemoveAllChildren(); } } /// <summary> /// 用于插入文本内容 /// </summary> /// <param name="_oxe">要填充内容的节点</param> /// <param name="_content">填充的内容</param> public static void DOC_TEXT_FillData(ref OpenXmlElement _oxe, string _content) { string _eType = _oxe.GetType().Name; switch (_eType) { case "SdtBlock": Paragraph _paragraph = (Paragraph)_oxe.Descendants<Paragraph>().First().Clone(); Run _run = (Run)_paragraph.Elements<Run>().First().Clone(); _run.RemoveAllChildren<Text>(); _run.AppendChild<Text>(new Text(_content)); _paragraph.AppendChild<Run>(_run); _oxe.RemoveAllChildren<Paragraph>(); _oxe.AppendChild<Paragraph>(_paragraph); break; case "SdtRun": SdtRun _sdtRun = (SdtRun)_oxe; _sdtRun.SdtProperties.RemoveAllChildren<SdtPlaceholder>(); RunProperties _runPro = (RunProperties)_sdtRun.Elements<RunProperties>().Single().Clone(); Text _runText = new Text(_content); Run _runAnother = _sdtRun.SdtContentRun.Elements<Run>().Single(); _runAnother.RemoveAllChildren(); _runAnother.AppendChild(_runPro); _runAnother.AppendChild(_runText); break; case "Run": _oxe.RemoveAllChildren(); _oxe.AppendChild(new Text(_content)); break; } }
using System.Collections.Generic; using System.Linq; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; namespace openxml_word { public static class WordStyleExtensions { public static string GetStyleIdFromStyleName(MainDocumentPart mainPart, string styleName) { StyleDefinitionsPart stylePart = mainPart.StyleDefinitionsPart; string styleId = stylePart.Styles.Descendants<StyleName>().Where(c => c.Val.Value.Equals(styleName)) .Select(c => ((Style)c.Parent).StyleId).FirstOrDefault(); return styleId ?? styleName; } public static IEnumerable<Paragraph> ParagraphByStyleName(this MainDocumentPart mainPart, string styleName) { string styleId = GetStyleIdFromStyleName(mainPart, styleName); IEnumerable<Paragraph> paraList = mainPart.Document.Descendants<Paragraph>().Where(p => IsParagraphInStyle(p, styleId)); return paraList; } public static bool IsParagraphInStyle(Paragraph p, string styleId) { ParagraphProperties pPr = p.GetFirstChild<ParagraphProperties>(); if (pPr != null) { ParagraphStyleId paraStyle = pPr.ParagraphStyleId; if (paraStyle != null) { return paraStyle.Val.Value.Equals(styleId); } } return false; } public static IEnumerable<Run> RunByStyleName(this MainDocumentPart mainPart, string styleName) { string styleId = GetStyleIdFromStyleName(mainPart, styleName); IEnumerable<Run> runList = mainPart.Document.Descendants<Run>().Where(r => IsRunInStyle(r, styleId)); return runList; } public static bool IsRunInStyle(Run p, string styleId) { RunProperties rPr = p.GetFirstChild<RunProperties>(); if (rPr != null) { RunStyle runStyle = rPr.RunStyle; if (runStyle != null) { return runStyle.Val.Value.Equals(styleId); } } return false; } } }
1 /// <summary> 2 /// 用于获取内容控件中指定的文档表 3 /// </summary> 4 /// <param name="oxe">内容控件</param> 5 /// <param name="tag">标签</param> 6 /// <returns></returns> 7 public static Table DOC_TAB_GetTable(ref OpenXmlElement _oxe, string _tag) 8 { 9 SdtBlock _tBlock = _oxe.Descendants<SdtBlock>().Where(el => el.SdtProperties.GetFirstChild<Tag>().Val == _tag).Single(); 10 return _tBlock.Descendants<Table>().Single<Table>(); 11 } 12 13 /// <summary> 14 /// 获取内容控件表中的行数 15 /// </summary> 16 /// <param name="_tb">文档表对象</param> 17 /// <returns></returns> 18 public static int DOC_TAB_GetTableRowCount(Table _tb) 19 { 20 return _tb.Elements<TableRow>().Count(); 21 } 22 23 /// <summary> 24 /// 删除指定索引的行 25 /// </summary> 26 /// <param name="_tb">文档表对象</param> 27 /// <param name="_index">删除行的索引</param> 28 /// <returns></returns> 29 public static bool DOC_TAB_DeleteTableRow(ref Table _tb, int _index) 30 { 31 if (!(_index >= 0 && _index < _tb.Elements<TableRow>().Count())) 32 { 33 return false; 34 } 35 try 36 { 37 _tb.RemoveChild(_tb.Elements<DocumentFormat.OpenXml.Wordprocessing.TableRow>().ElementAt(_index)); 38 } 39 catch (Exception e) 40 { 41 throw new Exception(e.Message); 42 } 43 return true; 44 } 45 46 /// <summary> 47 /// 删除指定行 (重载) 48 /// </summary> 49 /// <param name="_tb">文档表</param> 50 /// <param name="_tableRow">文档表行</param> 51 /// <returns></returns> 52 public static bool DOC_TAB_DeleteTableRow(ref Table _tb, ref TableRow _tableRow) 53 { 54 try 55 { 56 _tb.RemoveChild(_tableRow); 57 return true; 58 } 59 catch 60 { 61 return false; 62 } 63 } 64 65 /// <summary> 66 /// 返回指定索引的行 67 /// </summary> 68 /// <param name="_tb">文档表对象</param> 69 /// <param name="_index">指定行的索引</param> 70 /// <returns></returns> 71 public static TableRow DOC_TAB_GetTableRow(ref Table _tb, int _index) 72 { 73 try 74 { 75 return _tb.Elements<TableRow>().ElementAt(_index); 76 } 77 catch (Exception e) 78 { 79 throw new Exception(e.Message); 80 } 81 } 82 83 /// <summary> 84 /// 返回复制后的文档表行 85 /// </summary> 86 /// <param name="_tableRow">要被复制的文档表行</param> 87 /// <returns></returns> 88 public static TableRow DOC_TAB_CloneTableRow(TableRow _tableRow) 89 { 90 return (TableRow)_tableRow.Clone(); 91 } 92 93 /// <summary> 94 /// 返回复制后的文档表行 (重载) 95 /// </summary> 96 /// <param name="_tb">文档表</param> 97 /// <param name="_index">行所在索引</param> 98 /// <returns></returns> 99 public TableRow DOC_TAB_CloneTableRow(Table _tb, int _index) 100 { 101 return (TableRow)_tb.Elements<TableRow>().ElementAt(_index).Clone(); 102 } 103 104 /// <summary> 105 /// 向文档中指定的单元格添加数据 106 /// </summary> 107 /// <param name="_content">要添加的数据</param> 108 /// <param name="_tableRow">文档行</param> 109 /// <param name="_index">单元格的索引</param> 110 public static void DOC_TAB_FillCellData(string _content, ref TableRow _tableRow, int _index) 111 { 112 TableCell _tableCell = _tableRow.Elements<TableCell>().ElementAt(_index); 113 string[] _contentLine = System.Text.RegularExpressions.Regex.Split(_content, @"/r/n"); 114 DOC_TAB_ClearTextTableCell(ref _tableCell); 115 116 for (int i = 0; i < _contentLine.Length; i++) 117 { 118 string _curCellData = _contentLine[i]; 119 //如果是第一行,则直接填充 120 if (0 == i) 121 { 122 if (_tableCell.Elements<Paragraph>().Count() > 0) 123 { 124 Paragraph _newParagraph = _tableCell.Elements<Paragraph>().Last(); 125 if (_newParagraph.Elements<ParagraphProperties>().Count() > 0) 126 { 127 ParagraphProperties _paragraphProper = _newParagraph.Elements<ParagraphProperties>().First(); 128 129 RunProperties _newRunProper = new RunProperties(); 130 if (_paragraphProper.Elements<ParagraphMarkRunProperties>().Count() > 0) 131 { 132 ParagraphMarkRunProperties _paraMarkRunProper = _paragraphProper.Elements<ParagraphMarkRunProperties>().First(); 133 for (int j = 0; j < _paraMarkRunProper.Elements().Count(); j++) 134 { 135 _newRunProper.Append(_paraMarkRunProper.Elements().ElementAt(j).CloneNode(true)); 136 } 137 } 138 else 139 { 140 _newRunProper.Append(new RunFonts() { Hint = FontTypeHintValues.EastAsia }); 141 } 142 _newParagraph.Append(new Run(_newRunProper, new Text(_curCellData) { Space = "preserve" })); 143 } 144 else 145 { 146 _newParagraph.Append(new ParagraphMarkRunProperties(new RunFonts() { Hint = FontTypeHintValues.EastAsia })); 147 _newParagraph.Append(new Run(new RunProperties(new RunFonts() { Hint = FontTypeHintValues.EastAsia }), new Text(_curCellData) { Space = "preserve" })); 148 } 149 } 150 else 151 { 152 Paragraph _newParagraph = new Paragraph(); 153 _newParagraph.Append(new ParagraphMarkRunProperties(new RunFonts().EastAsia)); 154 _newParagraph.Append(new DocumentFormat.OpenXml.Wordprocessing.Run(new RunProperties(new RunFonts() { Hint = FontTypeHintValues.EastAsia }), new Text(_curCellData) { Space = "preserve" })); 155 } 156 } 157 else 158 { 159 Paragraph _paragraph = _tableCell.Elements<Paragraph>().Last(); 160 Paragraph _newParagraph = (Paragraph)_paragraph.Clone(); 161 DocumentFormat.OpenXml.Wordprocessing.Run _newRun = _newParagraph.Elements<DocumentFormat.OpenXml.Wordprocessing.Run>().Last(); 162 DocumentFormat.OpenXml.Wordprocessing.Text _newText = _newRun.Elements<DocumentFormat.OpenXml.Wordprocessing.Text>().Last(); 163 _newText.Text = _curCellData; 164 _tableCell.Append(_newParagraph); 165 } 166 } 167 } 168 169 /// <summary> 170 /// 在指定行后面添加新行 171 /// </summary> 172 /// <param name="_newRow">新行</param> 173 /// <param name="_tb">文档表</param> 174 /// <param name="_index">行索引</param> 175 public static void DOC_TAB_InsertRowAfter(TableRow _newRow, ref Table _tb, int _index) 176 { 177 TableRow _tableRow = _tb.Elements<TableRow>().ElementAt(_index); 178 _tb.InsertAfter<TableRow>(_newRow, _tableRow); 179 } 180 181 /// <summary> 182 /// 在指定行前面添加新行 183 /// </summary> 184 /// <param name="_newRow">新行</param> 185 /// <param name="_tb">文档表</param> 186 /// <param name="_index">行索引</param> 187 public static void DOC_TAB_InsertRowBefore(TableRow _newRow, ref Table _tb, int _index) 188 { 189 TableRow _tableRow = _tb.Elements<TableRow>().ElementAt(_index); 190 _tb.InsertBefore<TableRow>(_newRow, _tableRow); 191 } 192 193 /// <summary> 194 /// 清除单元格中的内容,但保留其格式 195 /// </summary> 196 /// <param name="_tableCell">单元格</param> 197 public static void DOC_TAB_ClearTextTableCell(ref TableCell _tableCell) 198 { 199 for (int i = _tableCell.Elements<Paragraph>().Count() - 2; i >= 0; i--) 200 { 201 _tableCell.Elements<Paragraph>().ElementAt(i).Remove(); 202 } 203 204 Paragraph _paragraph = _tableCell.Elements<Paragraph>().Single(); 205 foreach (Run _run in _paragraph.Elements<Run>()) 206 { 207 _run.RemoveAllChildren(); 208 } 209 } 210 211 /// <summary> 212 /// 用于插入文本内容 213 /// </summary> 214 /// <param name="_oxe">要填充内容的节点</param> 215 /// <param name="_content">填充的内容</param> 216 public static void DOC_TEXT_FillData(ref OpenXmlElement _oxe, string _content) 217 { 218 string _eType = _oxe.GetType().Name; 219 switch (_eType) 220 { 221 case "SdtBlock": 222 Paragraph _paragraph = (Paragraph)_oxe.Descendants<Paragraph>().First().Clone(); 223 Run _run = (Run)_paragraph.Elements<Run>().First().Clone(); 224 _run.RemoveAllChildren<Text>(); 225 _run.AppendChild<Text>(new Text(_content)); 226 _paragraph.AppendChild<Run>(_run); 227 228 _oxe.RemoveAllChildren<Paragraph>(); 229 _oxe.AppendChild<Paragraph>(_paragraph); 230 break; 231 case "SdtRun": 232 SdtRun _sdtRun = (SdtRun)_oxe; 233 _sdtRun.SdtProperties.RemoveAllChildren<SdtPlaceholder>(); 234 235 RunProperties _runPro = (RunProperties)_sdtRun.Elements<RunProperties>().Single().Clone(); 236 Text _runText = new Text(_content); 237 238 Run _runAnother = _sdtRun.SdtContentRun.Elements<Run>().Single(); 239 _runAnother.RemoveAllChildren(); 240 _runAnother.AppendChild(_runPro); 241 _runAnother.AppendChild(_runText); 242 break; 243 case "Run": 244 _oxe.RemoveAllChildren(); 245 _oxe.AppendChild(new Text(_content)); 246 break; 247 } 248 }