首页 > 其他分享 >乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - 微软开源组件Open-XML-SDK,解析Office文件

乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - 微软开源组件Open-XML-SDK,解析Office文件

时间:2023-02-04 22:36:34浏览次数:55  
标签:XML string 跨平台 var Net Open wbPart SDK

Open-XML-SDK

image

https://github.com/OfficeDev/Open-XML-SDK

Open XML SDK提供了用于处理Office Word、Excel和PowerPoint文档的工具。

它支持以下情况。

  • 高性能地生成文字处理文档、电子表格和演示文稿。
  • 文档修改,如添加、更新和删除内容和元数据。
  • 使用正则表达式搜索和替换内容。
  • 将一个文件分割(粉碎)为多个文件,并将多个文件合并为一个文件。
  • 更新Word/PowerPoint中图表的缓存数据和嵌入式电子表格。

获取Nuget包

https://www.nuget.org/packages/DocumentFormat.OpenXml.Linq

dotnet add package DocumentFormat.OpenXml.Linq

image

简单使用

读取Excel文件

public class ReadSheetCommand : IRequest<HandlerResult<IEnumerable<string>>>
{
    /// <summary>
    /// 目标路径
    /// </summary>
    public string TargetPath { get; private set; }

    /// <summary>
    /// 目标页面
    /// </summary>
    public string TargetSheet { get; private set; }

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="targetPath">目标路径</param>
    /// <param name="targetSheet">目标页面</param>
    public ReadSheetCommand(string targetPath, string targetSheet)
    {
        TargetPath = targetPath;
        TargetSheet = targetSheet;
    }
}
internal class ReadSheetCommandHandler : IRequestHandler<ReadSheetCommand, HandlerResult<IEnumerable<string>>>
{
    public async Task<HandlerResult<IEnumerable<string>>> Handle(ReadSheetCommand request, CancellationToken cancellationToken)
    {
        if(request is null || string.IsNullOrEmpty(request.TargetPath) || File.Exists(request.TargetPath) == false)
        {
            return await Task.FromResult(HandlerResult<IEnumerable<string>>.Failure("打开文件不存在"));
        }

        var allLines = new List<string>();
        try
        {
            // 创建SpreadsheetDocument对象,打开文件并且只读
            using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(request.TargetPath, false))
            {
                var wbPart = mySpreadsheet.WorkbookPart;

                Sheet targetSheet;
                if(!string.IsNullOrEmpty(request.TargetSheet))
                {
                    targetSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault(x => x.Name == request.TargetSheet);
                }
                else
                {
                    targetSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault();
                }

                var wsPart = wbPart.GetPartById(targetSheet.Id) as WorksheetPart;
                if(wsPart is not null)
                {
                    var wsRows = wsPart.Worksheet.Descendants<Row>();
                    foreach (var wsRow in wsRows)
                    {
                        var sb = new StringBuilder();
                        foreach (Cell wsCell in wsRow)
                        {
                            var wsValue = GetCellValue(wbPart, wsCell);
                            sb.Append(wsValue);
                            sb.Append(',');
                        }
                        allLines.Add(sb.ToString());
                    }
                }
            }
        }
        catch (Exception ex)
        {
            if(ex.Message.Contains("End of Central Directory record could not be found."))
            {
                return HandlerResult<IEnumerable<string>>.Failure("文件打开失败,已损坏或者格式错误");
            }
            else if (ex.Message.Contains("because it is being used by another process."))
            {
                return HandlerResult<IEnumerable<string>>.Failure("文件打开失败,它被另外一个进程占用了");
            }
            System.Console.WriteLine(ex.Message);
        }

        return await Task.FromResult(HandlerResult<IEnumerable<string>>.OK(allLines));
    }

    public static string GetCellValue(WorkbookPart wbPart, Cell theCell)
    {
        string value = theCell.InnerText;
        if (theCell.DataType != null)
        {
            switch (theCell.DataType.Value)
            {
                case CellValues.SharedString:
                    var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
                    if (stringTable != null)
                    {
                        value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
                    }
                    break;

                case CellValues.Boolean:
                    switch (value)
                    {
                        case "0":
                            value = "FALSE";
                            break;
                        default:
                            value = "TRUE";
                            break;
                    }
                    break;
            }
        }
        return value;
    }
}

参考

标签:XML,string,跨平台,var,Net,Open,wbPart,SDK
From: https://www.cnblogs.com/taylorshi/p/17092547.html

相关文章

  • kubernetes-Deployment
    Deployment它是专门用来部署应用程序的,能够让应用永不宕机,多用来发布无状态的应用,是Kubernetes里最常用也是最有用的一个对象。YAML样板apiVersion:apps/v1kind:D......
  • ASP.NET Core Web API 中控制器操作的返回类型
    ASP.NETCoreWebAPI中控制器操作的返回类型ASP.NETCore为WebAPI控制器操作返回类型提供以下选项:特定类型IActionResultActionResult<T>HttpResults特定类......
  • netty对多协议进行编解码
    1、netty如何解析多协议前提:项目地址:https://gitee.com/q529075990qqcom/NB-IOT.git我们需要一个创建mavne项目,这个项目是我已经写好的项目,项目结构图如下:   ......
  • CSharp: donet 6 create view with EF Core 6
     [Keyless]publicclassPersonOrderCount{publicstringName{get;set;}publicintCount{get;set;}}publicclassPerson{publicintPe......
  • netcore 部署问题集
    一、IIS    ①、x86部署问题1、错误信息(附截图):Couldnotfind'aspnetcorev2_inprocess.dll'.Exceptionmessage:2、错误信息(附截图):Failedtostartapplic......
  • camle rest组件怎么和netty-http进行关联起来
    rest("/apibus/busi/").produces(consumes).consumes(consumes).post("processApply").route().log("流程操作申请").to(BusiApplyRoute.ROUT......
  • uni-app + .NET 7实现微信小程序订阅消息推送
    微信小程序的订阅消息是小程序的重要能力之一,为实现服务的闭环提供更优的体验。订阅消息我们应该经常见到,比如下单成功之后的服务通知,支付成功后的支付成功通知,都属于小程......
  • 2023年 .NET Monorepo 来了
    Monorepo(monolithicrepository)是一种项目架构,简单来说就是,将多个项目或包文件放到一个git仓库来管理,很多前端项目vue3、element都是采用的这种架构模式。之所以应用mon......
  • .net 7 中使用quic示例
    之前在文章在.Net中使用Quic通信尝鲜中介绍过如何使用quic协议,在.net7中,Quic相关API已经正式可用了,不过目前还是预览状态,基本示例如下:服务端代码:usingSystem;usin......
  • .Net 7 高端玩法,自定义一个CLR运行时
    前言:曾几何时,一直想自己定制一个CLR运行时玩玩。满足下技术控的虚荣心,本篇带你一步一步打造一个属于自己的.Net7运行时。概括假设你的电脑已经安装了.Net,并且运行正......