使用NOPI读取Word、Excel文档内容
更新时间:2020年6月25日 11:16 点击:2049
使用NOPI读取Excel的例子很多,读取Word的例子不多。
Excel的解析方式有多中,可以使用ODBC查询,把Excel作为一个数据集对待。也可以使用文档结构模型的方式进行解析,即解析Workbook(工作簿)、Sheet、Row、Column。
Word的解析比较复杂,因为Word的文档结构模型定义较为复杂。解析Word或者Excel,关键是理解Word、Excel的文档对象模型。
Word、Excel文档对象模型的解析,可以通过COM接口调用,此类方式使用较广。(可以录制宏代码,然后替换为对应的语言)
也可以使用XML模型解析,尤其是对于2007、2010版本的文档的解析。
using NPOI.POIFS.FileSystem; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.XWPF.UserModel; using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Text; namespace eyuan { public static class NOPIHandler { /// <summary> /// /// </summary> /// <param name="fileName"></param> /// <returns></returns> public static List<List<List<string>>> ReadExcel(string fileName) { //打开Excel工作簿 XSSFWorkbook hssfworkbook = null; try { using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { hssfworkbook = new XSSFWorkbook(file); } } catch (Exception e) { LogHandler.LogWrite(string.Format("文件{0}打开失败,错误:{1}", new string[] { fileName, e.ToString() })); } //循环Sheet页 int sheetsCount = hssfworkbook.NumberOfSheets; List<List<List<string>>> workBookContent = new List<List<List<string>>>(); for (int i = 0; i < sheetsCount; i++) { //Sheet索引从0开始 ISheet sheet = hssfworkbook.GetSheetAt(i); //循环行 List<List<string>> sheetContent = new List<List<string>>(); int rowCount = sheet.PhysicalNumberOfRows; for (int j = 0; j < rowCount; j++) { //Row(逻辑行)的索引从0开始 IRow row = sheet.GetRow(j); //循环列(各行的列数可能不同) List<string> rowContent = new List<string>(); int cellCount = row.PhysicalNumberOfCells; for (int k = 0; k < cellCount; k++) { //ICell cell = row.GetCell(k); ICell cell = row.Cells[k]; if (cell == null) { rowContent.Add("NIL"); } else { rowContent.Add(cell.ToString()); //rowContent.Add(cell.StringCellValue); } } //添加行到集合中 sheetContent.Add(rowContent); } //添加Sheet到集合中 workBookContent.Add(sheetContent); } return workBookContent; } /// <summary> /// /// </summary> /// <param name="fileName"></param> /// <returns></returns> public static string ReadExcelText(string fileName) { string ExcelCellSeparator = ConfigurationManager.AppSettings["ExcelCellSeparator"]; string ExcelRowSeparator = ConfigurationManager.AppSettings["ExcelRowSeparator"]; string ExcelSheetSeparator = ConfigurationManager.AppSettings["ExcelSheetSeparator"]; // List<List<List<string>>> excelContent = ReadExcel(fileName); string fileText = string.Empty; StringBuilder sbFileText = new StringBuilder(); //循环处理WorkBook中的各Sheet页 List<List<List<string>>>.Enumerator enumeratorWorkBook = excelContent.GetEnumerator(); while (enumeratorWorkBook.MoveNext()) { //循环处理当期Sheet页中的各行 List<List<string>>.Enumerator enumeratorSheet = enumeratorWorkBook.Current.GetEnumerator(); while (enumeratorSheet.MoveNext()) { string[] rowContent = enumeratorSheet.Current.ToArray(); sbFileText.Append(string.Join(ExcelCellSeparator, rowContent)); sbFileText.Append(ExcelRowSeparator); } sbFileText.Append(ExcelSheetSeparator); } // fileText = sbFileText.ToString(); return fileText; } /// <summary> /// 读取Word内容 /// </summary> /// <param name="fileName"></param> /// <returns></returns> public static string ReadWordText(string fileName) { string WordTableCellSeparator = ConfigurationManager.AppSettings["WordTableCellSeparator"]; string WordTableRowSeparator = ConfigurationManager.AppSettings["WordTableRowSeparator"]; string WordTableSeparator = ConfigurationManager.AppSettings["WordTableSeparator"]; // string CaptureWordHeader = ConfigurationManager.AppSettings["CaptureWordHeader"]; string CaptureWordFooter = ConfigurationManager.AppSettings["CaptureWordFooter"]; string CaptureWordTable = ConfigurationManager.AppSettings["CaptureWordTable"]; string CaptureWordImage = ConfigurationManager.AppSettings["CaptureWordImage"]; // string CaptureWordImageFileName = ConfigurationManager.AppSettings["CaptureWordImageFileName"]; // string fileText = string.Empty; StringBuilder sbFileText = new StringBuilder(); #region 打开文档 XWPFDocument document = null; try { using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { document = new XWPFDocument(file); } } catch (Exception e) { LogHandler.LogWrite(string.Format("文件{0}打开失败,错误:{1}", new string[] { fileName, e.ToString() })); } #endregion #region 页眉、页脚 //页眉 if (CaptureWordHeader == "true") { sbFileText.AppendLine("Capture Header Begin"); foreach (XWPFHeader xwpfHeader in document.HeaderList) { sbFileText.AppendLine(string.Format("{0}", new string[] { xwpfHeader.Text })); } sbFileText.AppendLine("Capture Header End"); } //页脚 if (CaptureWordFooter == "true") { sbFileText.AppendLine("Capture Footer Begin"); foreach (XWPFFooter xwpfFooter in document.FooterList) { sbFileText.AppendLine(string.Format("{0}", new string[] { xwpfFooter.Text })); } sbFileText.AppendLine("Capture Footer End"); } #endregion #region 表格 if (CaptureWordTable == "true") { sbFileText.AppendLine("Capture Table Begin"); foreach (XWPFTable table in document.Tables) { //循环表格行 foreach (XWPFTableRow row in table.Rows) { foreach (XWPFTableCell cell in row.GetTableCells()) { sbFileText.Append(cell.GetText()); // sbFileText.Append(WordTableCellSeparator); } sbFileText.Append(WordTableRowSeparator); } sbFileText.Append(WordTableSeparator); } sbFileText.AppendLine("Capture Table End"); } #endregion #region 图片 if (CaptureWordImage == "true") { sbFileText.AppendLine("Capture Image Begin"); foreach (XWPFPictureData pictureData in document.AllPictures) { string picExtName = pictureData.suggestFileExtension(); string picFileName = pictureData.GetFileName(); byte[] picFileContent = pictureData.GetData(); // string picTempName = string.Format(CaptureWordImageFileName, new string[] { Guid.NewGuid().ToString() + "_" + picFileName + "." + picExtName }); // using (FileStream fs = new FileStream(picTempName, FileMode.Create, FileAccess.Write)) { fs.Write(picFileContent, 0, picFileContent.Length); fs.Close(); } // sbFileText.AppendLine(picTempName); } sbFileText.AppendLine("Capture Image End"); } #endregion //正文段落 sbFileText.AppendLine("Capture Paragraph Begin"); foreach (XWPFParagraph paragraph in document.Paragraphs) { sbFileText.AppendLine(paragraph.ParagraphText); } sbFileText.AppendLine("Capture Paragraph End"); // // fileText = sbFileText.ToString(); return fileText; } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
下一篇: C# 实现窗口无边框,可拖动效果
相关文章
- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 这篇文章主要介绍了c#读取excel方法,实例分析了C#读取excel文件的原理与相关技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了Python导入数值型Excel数据并生成矩阵操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-09
- 下面小编就为大家带来一篇C# winform打开Excel文档的方法总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- C# 导出 Excel 的6种简单方法:数据表导出到 Excel,对象集合导出到 Excel,数据库导出到 Excel,微软网格控件导出到 Excel,数组导出到 Excel,CSV 导出到 Excel,你都会了吗?需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
C#实现Excel表数据导入Sql Server数据库中的方法
这篇文章主要介绍了C#实现Excel表数据导入Sql Server数据库中的方法,结合实例形式详细分析了C#读取Excel表数据及导入Sql Server数据库的具体操作步骤与相关操作技巧,需要的朋友可以参考下...2020-06-25- 这篇文章主要介绍了C#获取Word文档中所有表格的实现代码分享,小编亲测可用,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#实现将数据导出到word或者Excel中的方法,涉及C#操作word及Excel格式文件的方法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#使用Ado.Net更新和添加数据到Excel表格的方法,较为详细的分析了OLEDB的原理与使用技巧,可实现较为方便的操作Excel数据,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家详细介绍了C#使用Aspose.Cells创建和读取Excel文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了C#使用oledb导出数据到excel的方法,结合实例形式分析了C#操作oledb导出数据的相关技巧与注意事项,需要的朋友可以参考下...2020-06-25
C#将Word转换成PDF方法汇总(基于Office和WPS)
这篇文章主要汇总了C#将Word转换成PDF方法,基于Office和WPS的两种解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25- 本篇文章是对使用c#在word文档中创建表格的方法进行了详细的分析介绍,需要的朋友参考下...2020-06-25
- 这篇文章主要介绍了C#操作excel打印的示例,帮助大家利用c#打印表格,提高办公效率,感兴趣的朋友可以了解下...2020-12-08
- 这篇文章主要介绍了C#生成Word文档代码示例,本文直接给出代码实例,需要的朋友可以参考下...2020-06-25
- 在本篇文章里小编给大家分享了关于C#删除Excel中的图片的实例代码内容,有兴趣的朋友们参考学习下。...2020-06-25
- 本文介绍Aspose.Cells基础的用法,供大家参考。...2020-06-25
- 首先 你需要添加引用Microsoft Excel 11.0 Object Library...2020-06-25
- 这篇文章主要介绍了C#实现简单合并word文档的方法,涉及C#针对word文档的读取、插入、保存等技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 今天小编就为大家分享一篇关于C#实现Word转为PDF的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-06-25