使用NOPI讀取Word、Excel文檔內容
使用NOPI讀取Excel的例子很多,讀取Word的例子不多。
Excel的解析方式有多中,可以使用ODBC查詢,把Excel作為一個數(shù)據(jù)集對待。也可以使用文檔結構模型的方式進行解析,即解析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() })); } //循環(huán)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); //循環(huán)行 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); //循環(huán)列(各行的列數(shù)可能不同) 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(); //循環(huán)處理WorkBook中的各Sheet頁 List<List<List<string>>>.Enumerator enumeratorWorkBook = excelContent.GetEnumerator(); while (enumeratorWorkBook.MoveNext()) { //循環(huán)處理當期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) { //循環(huán)表格行 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#教程
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5230.html
您可能感興趣的文章
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#使用Dispose模式實現(xiàn)手動對資源的釋放
- 01-10C#3.0使用EventLog類寫Windows事件日志的方法
- 01-10C#實現(xiàn)讀取被進程占用的文件實現(xiàn)方法
- 01-10C#使用windows服務開啟應用程序的方法
- 01-10c# ArrayList的使用方法小總結
- 01-10C#使用ADO.Net部件來訪問Access數(shù)據(jù)庫的方法
- 01-10C# readnodefile()不能讀取帶有文件名為漢字的osg文件解決方法
- 01-10C#使用Mutex簡單實現(xiàn)程序單實例運行的方法
- 01-10使用Nopcommerce為商城添加滿XX減XX優(yōu)惠券功能


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實例總結