【愚公系列】2023年02月 .NET CORE工具案例-办公文档神器Toxy的使用
2023-06-13 09:17:28 时间
文章目录
前言
作为一个开发者对于写代码操作各种办公文件是非常常见的需求,但是操作这些不同办公文件需要安装各种对应的第三方包来处理,下面就来介绍统一的第三方包Toxy,Toxy是一个.NET数据/文本提取框架,类似于Java中的Apache Tika。它支持许多流行的格式,如docx,xlsx,xls,pdf,csv,txt,epub,html等。
Toxy的架构图如下:
如上图所示,该项目对各种文件格式进行底层封装,我们只需专注业务的开发,不需要了解底层细节。
Toxy的网址:https://github.com/nissl-lab/toxy
一、办公文档神器Toxy的使用
Toxy相关对象如下:
- ToxyDocument - 为文档提取的数据结构
- ToxySpreadsheet - 为电子表格提取的数据结构
- ToxyEmail - 为电子邮件提取的数据结构
- ToxyBusinessCard - 为名片提取的数据结构
- ToxyDom - 为基于 DOM 的文档提取的数据结构
- ToxyMetadata - 为其他具有元数据的文件提取的数据结构
1.安装对应的包
Toxy
2.Word文档操作
2.1 普通文档解析
1、ITextParser解析文档
//解析docx文档
using ConsoleTest;
using NUnit.Framework;
using Toxy;
ParserContext context = new ParserContext(TestDataSample.GetWordPath("SampleDoc.docx"));
ITextParser parser = ParserFactory.CreateText(context);
string doc = parser.Parse();
Assert.IsNotNull(doc);
string[] lines = doc.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
Assert.AreEqual(7, lines.Length);
Assert.AreEqual("I am a test document", lines[0]);
Assert.AreEqual("This is page 1", lines[1]);
Assert.AreEqual("I am Calibri (Body) in font size 11", lines[2]);
Assert.AreEqual("\n", lines[3]);
Assert.AreEqual("This is page two", lines[4]);
Assert.AreEqual("It’s Arial Black in 16 point", lines[5]);
Assert.AreEqual("It’s also in blue", lines[6]);
Console.ReadLine();
2、IDocumentParser解析文档
//解析docx文档
using ConsoleTest;
using NUnit.Framework;
using Toxy;
ParserContext context = new ParserContext(TestDataSample.GetWordPath("SampleDoc.docx"));
IDocumentParser parser = ParserFactory.CreateDocument(context);
ToxyDocument doc = parser.Parse();
Assert.AreEqual(7, doc.Paragraphs.Count);
Assert.AreEqual("I am a test document", doc.Paragraphs[0].Text);
Assert.AreEqual("This is page 1", doc.Paragraphs[1].Text);
Assert.AreEqual("I am Calibri (Body) in font size 11", doc.Paragraphs[2].Text);
Assert.AreEqual("\n", doc.Paragraphs[3].Text);
Assert.AreEqual("This is page two", doc.Paragraphs[4].Text);
Assert.AreEqual("It’s Arial Black in 16 point", doc.Paragraphs[5].Text);
Assert.AreEqual("It’s also in blue", doc.Paragraphs[6].Text);
Console.ReadLine();
2.2 表格文档解析
1、IDocumentParser解析文档
//解析docx文档
using ConsoleTest;
using NUnit.Framework;
using Toxy;
ParserContext context = new ParserContext(TestDataSample.GetWordPath("simple-table.docx"));
IDocumentParser parser = ParserFactory.CreateDocument(context);
ToxyDocument doc = parser.Parse();
Assert.AreEqual(8, doc.Paragraphs.Count);
Assert.AreEqual("This is a Word document that was created using Word 97 – SR2. It contains a paragraph, a table consisting of 2 rows and 3 columns and a final paragraph.",
doc.Paragraphs[0].Text);
Assert.AreEqual("This text is below the table.", doc.Paragraphs[1].Text);
Assert.AreEqual("Cell 1,1", doc.Paragraphs[2].Text);
Assert.AreEqual("Cell 1,2", doc.Paragraphs[3].Text);
Assert.AreEqual("Cell 1,3", doc.Paragraphs[4].Text);
Assert.AreEqual("Cell 2,1", doc.Paragraphs[5].Text);
Assert.AreEqual("Cell 2,2", doc.Paragraphs[6].Text);
Assert.AreEqual("Cell 2,3", doc.Paragraphs[7].Text);
Console.ReadLine();
3.Excel文件操作
后续都已一种方式,不在像word那样了
//解析xlsx文档
using ConsoleTest;
using NUnit.Framework;
using Toxy;
ParserContext context = new ParserContext(TestDataSample.GetExcelPath("Employee.xls"));
ISpreadsheetParser parser = ParserFactory.CreateSpreadsheet(context);
ToxySpreadsheet ss = parser.Parse();
//获取Excel表格数量与名称
Assert.AreEqual(3, ss.Tables.Count);
Assert.AreEqual("Sheet1", ss.Tables[0].Name);
Assert.AreEqual("Sheet2", ss.Tables[1].Name);
Assert.AreEqual("Sheet3", ss.Tables[2].Name);
//获取总行数
Assert.AreEqual(5, ss.Tables[0].Rows.Count);
Assert.AreEqual(0, ss.Tables[1].Rows.Count);
Assert.AreEqual(0, ss.Tables[2].Rows.Count);
//获取指定行数
ToxyTable table = ss.Tables[0];
Assert.AreEqual(1, table.Rows[0].RowIndex);
Assert.AreEqual(2, table.Rows[1].RowIndex);
Assert.AreEqual(3, table.Rows[2].RowIndex);
Assert.AreEqual(4, table.Rows[3].RowIndex);
Assert.AreEqual(5, table.Rows[4].RowIndex);
//获取总表格数
Assert.AreEqual(1, table.Rows[0].Cells.Count);
Assert.AreEqual(0, table.Rows[1].Cells.Count);
Assert.AreEqual(2, table.Rows[2].Cells.Count);
Assert.AreEqual(2, table.Rows[3].Cells.Count);
Assert.AreEqual(2, table.Rows[4].Cells.Count);
//获取指定表格的值
Assert.AreEqual("Employee Info", table.Rows[0].Cells[0].ToString());
Assert.AreEqual(1, table.Rows[0].Cells[0].CellIndex);
Console.ReadLine();
4.PDF文档操作
using NUnit.Framework;
using Toxy.Parsers;
using Toxy;
string path = TestDataSample.GetPdfPath("Sample1.PDF");
var parser = new PDFDocumentParser(new ParserContext(path));
var result = parser.Parse();
//获取段落数
Assert.AreEqual(1474, result.Paragraphs.Count);
//判断第一段落的文本
Assert.AreEqual("LA MARCHE MONDIALE DES FEMMES : UN MOUVEMENT IRRÉVERSIBLE", result.Paragraphs[0].Text);
Console.ReadLine();
5.图片文件操作
//解析jpg图片
using ConsoleTest;
using NUnit.Framework;
using Toxy;
string path = Path.GetFullPath(TestDataSample.GetImagePath("sample_sony1.jpg"));
ParserContext context = new ParserContext(path);
IMetadataParser parser = (IMetadataParser)ParserFactory.CreateMetadata(context);
ToxyMetadata x = parser.Parse();
//属性数量
Assert.AreEqual(12, x.Count);
//图片宽模式时间等信息
Assert.AreEqual(2592, x.Get("PhotoHeight").Value);
Assert.AreEqual(95, x.Get("PhotoQuality").Value);
Assert.AreEqual(3872, x.Get("PhotoWidth").Value);
Assert.AreEqual("DSLR-A200", x.Get("Model").Value);
Assert.AreEqual((uint)400, x.Get("ISOSpeedRatings").Value);
Assert.AreEqual(5.6, x.Get("FNumber").Value);
Assert.AreEqual((double)35, x.Get("FocalLength").Value);
Assert.AreEqual((uint)52, x.Get("FocalLengthIn35mmFilm").Value);
Assert.AreEqual(new DateTime(2009, 11, 21, 12, 39, 39), x.Get("DateTime").Value);
Console.ReadLine();
总结
以上是部分文件格式的解析例子,更多功能,大家可以下载源码学习,针对每一种格式,都有非常详细的单元测试例子,看完例子完全不需要文档。
相关文章
- [.NET控件]Telerik RadControls for ASP.NET AJAX 2008 Q1 net 2.0 Web.UI「建议收藏」
- ASP.NET MVC商城网站后台管理系统
- [接上篇]在Window10/11的Linux子系统Docker上部署VB.NET Asp.Net Core WebAPI应用
- 【愚公系列】2023年01月 .NET CORE工具案例-SharpConfig配置文件读取库
- 【愚公系列】2023年02月 .NET CORE工具案例-AspNetCoreRateLimit限流的使用
- 【愚公系列】2023年02月 .NET CORE工具案例-Workflow-Core轻量级工作流引擎(简单使用)
- 开发积极探索Mysql.Net 开发之路(mysql.net)
- 联手开发:.NET与Oracle的合作之路(.net和oracle)
- 原理揭秘.NET 运用Redis图灵缓存原理(.net缓存redis)
- Net开发Oracle数据库新技术攻关挑战(.net开发oracle)
- NET 与 Oracle技术结合开启数据库新篇章(.net事物oracle)
- 使用NET来连接MySQL数据库的简单方法(.net怎么连mysql)
- Net和MySQL互相受益的强大组合(.net 与mysql)
- 分类NET 5与MySQL分类新加坡开发者技术展望(.net 5 mysql)
- 探索Oracle中NET位置的背后秘密(oracle中net位置)
- 使用Oracle64位Net突破技术极限(oracle64位net)
- 我今天开始正式学习.net遇到的问题
- asp.net程序编译调试时偶尔出现访问被拒绝的错误的解决方法
- ASP.NET动态加载用户控件的实现方法
- ASP.NET路径问题的解决方法
- asp.net产生随机颜色实现代码
- .NET中的异步编程-EAP/APM使用方法及案例介绍
- ASP.net中获取客户端参数操作系统信息