# 在linux下使用OOxml Validator校验Office文档
由于某些原因,需要在linux下验证Office文档的正确性,所以进行了一些校验工具的调研,vscode上有OOxml Validator插件,本质也是调用的微软的Document.OpenXml SDK, 在windows上有微软提供的安装程序安装运行,可以去官网下载,linux以及macos上暂时没发现有相应的工具可以使用,好在macos和linux上都有dotnet的支持,为linux上实现调用C#库提供了条件
# linux下dotnet开发环境的安装
本文基于CentOs8 其他版本的安装方法可以参照微软官网
- 安装SDK
.NET SDK 使你可以开发 .NET 开发应用。 如果安装 .NET SDK,则无需安装相应的运行时
sudo dnf install dotnet-sdk-5.0
- 安装运行时
通过 ASP.NET Core 运行时,可以运行使用 .NET 开发且未提供运行时的应用。 以下命令将安装 ASP.NET Core 运行时,这是与 .NET 最兼容的运行时
sudo dnf install aspnetcore-runtime-5.0
- 安装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 |
* 转载请注明出处