# 在linux下使用OOxml Validator校验Office文档

由于某些原因,需要在linux下验证Office文档的正确性,所以进行了一些校验工具的调研,vscode上有OOxml Validator插件,本质也是调用的微软的Document.OpenXml SDK, 在windows上有微软提供的安装程序安装运行,可以去官网下载,linux以及macos上暂时没发现有相应的工具可以使用,好在macos和linux上都有dotnet的支持,为linux上实现调用C#库提供了条件

# linux下dotnet开发环境的安装

本文基于CentOs8 其他版本的安装方法可以参照微软官网

  1. 安装SDK

.NET SDK 使你可以开发 .NET 开发应用。 如果安装 .NET SDK,则无需安装相应的运行时

sudo dnf install dotnet-sdk-5.0
  1. 安装运行时

通过 ASP.NET Core 运行时,可以运行使用 .NET 开发且未提供运行时的应用。 以下命令将安装 ASP.NET Core 运行时,这是与 .NET 最兼容的运行时

sudo dnf install aspnetcore-runtime-5.0
  1. 安装runtime

作为 ASP.NET Core 运行时的一种替代方法,你可以安装不包含 ASP.NET Core 支持的 .NET 运行时

sudo dnf install dotnet-runtime-5.0

安装成功后,使用dotnet --info 可以查看到已经安装的dotnet信息, 以下已经成功安装了dotnet5.0.2版本

.NET SDK (reflecting any global.json):
 Version:   5.0.102
 Commit:    71365b4d42

Runtime Environment:
 OS Name:     tencentos
 OS Version:  3.2
 OS Platform: Linux
 RID:         centos.8-x64
 Base Path:   /usr/lib64/dotnet/sdk/5.0.102/

Host (useful for support):
  Version: 5.0.2
  Commit:  cb5f173b96

.NET SDKs installed:
  5.0.102 [/usr/lib64/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 5.0.2 [/usr/lib64/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 5.0.2 [/usr/lib64/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET runtimes or SDKs:
  https://aka.ms/dotnet-download

# linux下使用dotnet创建工程

所有的命令可参考微软官网 .Net CLI (opens new window)

mkdir ooxml_validator & cd ooxml_validator
dotnet new OOXmlValidator

执行后会有OOXmlValidator.csproj文件生成,这个文件是dotnet工程的配置文件

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <AssemblyName>OOXmlValidator</AssemblyName>
    <Optimize>true</Optimize>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
  </ItemGroup>
</Project>

PropertyGroup 代表了工程的属性设置 PackageReference 代表了工程的依赖 tips: 通过nuget来管理后,PackageReference已经不需要手动来管理

# 安装nuget库依赖

所有工程依赖的库推荐直接使用nuget提供的库,并且通过dotnet add package 来安装,因为某些库可能存在依赖库

# 添加库
dotnet add [<PROJECT>] package <PACKAGE_NAME>
    [-f|--framework <FRAMEWORK>] [--interactive]
    [-n|--no-restore] [--package-directory <PACKAGE_DIRECTORY>]
    [--prerelease] [-s|--source <SOURCE>] [-v|--version <VERSION>]

dotnet add package -h|--help

# 删除库
dotnet remove [<PROJECT>] package <PACKAGE_NAME>

dotnet remove package -h|--help

# 查看已经安装的库
dotnet list [<PROJECT>|<SOLUTION>] package [--config <SOURCE>]
    [--deprecated]
    [--framework <FRAMEWORK>] [--highest-minor] [--highest-patch]
    [--include-prerelease] [--include-transitive] [--interactive]
    [--outdated] [--source <SOURCE>] [-v|--verbosity <LEVEL>]
    [--vulnerable]

dotnet list package -h|--help

添加需要使用的三个库

dotnet add package Newtonsoft.Json 13.0.1
dotnet add package System.IO.Packaging 6.0.0
dotnet add package Document.OpenXml 2.15.0

以上Validator的所有依赖就安装完成了,可以直接写调用validator接口的代码了

# 调用Document.OpenXml对文档进行校验

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Validation;
using System;
using System.Collections.Generic;
using System.Text;

// 根据扩展名,调用相应的Office文档打开接口获取实例
public dynamic GetDocument(string filePath)
{
    string fileExtension = filePath.Substring(Math.Max(0, filePath.Length - 4)).ToLower();
    if (!new string[] { "docx", "pptx", "xlsx" }.Contains(fileExtension)) {
        throw new ArgumentException("file must be a .docx, .xlsx, or .pptx");
    }
    dynamic doc = null;
    switch (fileExtension)
    {
        case "docx":
            doc = WordprocessingDocument.Open(filePath, false);
            break;
        case "pptx":
            doc = PresentationDocument.Open(filePath, false);
            break;
        case "xlsx":
            doc = SpreadsheetDocument.Open(filePath, false);
            break;
        default:
            break;
    }

    return doc;
}
// 使用打开的文档进行校验
public IEnumerable<ValidationErrorInfo> Validate(dynamic doc, FileFormatVersions version)
  OpenXmlValidator openXmlValidator = new OpenXmlValidator(version);
  return openXmlValidator.Validate(doc);
}

// 目前仅支持以下标准的文档
// namespace DocumentFormat.OpenXml {
//   [System.Flags]
//   public enum FileFormatVersions {
//     None = 0,
//     Office2007 = 1,
//     Office2010 = 2,
//     Office2013 = 3,
//   }
// }

# 打包运行时发布

dotbuild相关用法 (opens new window)

dotnet build [<PROJECT>|<SOLUTION>] [-a|--arch <ARCHITECTURE>]
    [-c|--configuration <CONFIGURATION>] [-f|--framework <FRAMEWORK>]
    [--force] [--interactive] [--no-dependencies] [--no-incremental]
    [--no-restore] [--nologo] [--no-self-contained] [--os <OS>]
    [-o|--output <OUTPUT_DIRECTORY>] [-r|--runtime <RUNTIME_IDENTIFIER>]
    [--self-contained [true|false]] [--source <SOURCE>]
    [-v|--verbosity <LEVEL>] [--version-suffix <VERSION_SUFFIX>]

dotnet build -h|--help
# 不带参数 debug
dotnet build
# 编译Release
dotnet build -c Release
# 发布Release 带运行时(linux-x64)
dotnet publish -c Release --self-contained -r linux-x64 -o out

# 附录 (macos和linux各版本支持的dotnet版本)

各系统版本支持情况可查微软官网 (opens new window)

# macos

操作系统 .NET Core 3.1 .NET 5 .NET 6
macOS 12.0“Monterey” ✔️ 3.1 ✔️ 5.0
macOS 11.0“Big Sur” ✔️ 3.1 ✔️ 5.0
macOS 10.15“Catalina” ✔️ 3.1 ✔️ 5.0

# linux

只介绍Ubuntu、CentOs、RHEL、Debian,其他系统可以在微软官网进行查询

# Ubuntu

在 version < 20.04 之前只支持LTS版本,且支持所有的.net版本 在 version > 20.04 后某些版本支持部分.net 版本

Ubuntu .NET Core 3.1 .NET 5 .NET 6
✔️ 21.10 ✔️ 3.1 ✔️ 5.0 ✔️ 6.0
✔️ 21.04 ✔️ 3.1 ✔️ 5.0 ✔️ 6.0
❌ 20.10 ✔️ 3.1 ✔️ 5.0 ❌ 6.0

# CentOS

CentOS .NET Core 2.1 .NET Core 3.1 .NET 5
✔️ 8 ❌ 2.1 ✔️ 3.1 ✔️ 5.0
✔️ 7 ❌ 2.1 ✔️ 3.1 ✔️ 5.0

# RHEL

RHEL .NET Core 2.1 .NET Core 3.1 .NET 5
✔️ 8 ❌ 2.1 ✔️ 3.1 ✔️ 5.0
✔️ 7 ❌ 2.1 ✔️ 3.1 ✔️ 5.0

# Debian

Debian .NET Core 3.1 .NET 5 .NET 6
✔️ 11 ✔️ 3.1 ✔️ 5.0 ✔️ 6.0
✔️ 10 ✔️ 3.1 ✔️ 5.0 ✔️ 6.0
✔️ 9 ✔️ 3.1 ✔️ 5.0 ✔️ 6.0
❌ 8 ❌ 3.1 ❌ 5.0 ❌ 6.0

* 转载请注明出处