DevExpress Office File API使用记录

目录

    • [1 RichEditorControl控件不包含Save类型事件](#1 RichEditorControl控件不包含Save类型事件)
    • [2 Document和SubDocument关系](#2 Document和SubDocument关系)
    • [3 如何在类库中使用DevExpress Office File API](#3 如何在类库中使用DevExpress Office File API)
    • [4 测试Demo创建记录](#4 测试Demo创建记录)
      • [4.1 创建类库](#4.1 创建类库)
      • [4.2 创建Winform项目](#4.2 创建Winform项目)

1 RichEditorControl控件不包含Save类型事件

2 Document和SubDocument关系

Document和SubDocument都是interface,SubDocument是Document基类,SubDocument定义了基本功能,Document在其基础上定义了特定功能,在正文的处理中,只能使用Document对象,针对页眉页脚的操作,使用SubDocument对象,可保证适用于正文的那些操作不会误操作到页眉页脚。

3 如何在类库中使用DevExpress Office File API

1.添加Nuget包:DevExpress.Document.Processor

DevExpress.RichEdit.Core

2.示例代码:

复制代码
/// <summary>
/// 文档打开/保存/编辑
/// </summary>
public class DocumentService : IReportEditor, IDisposable
{
  private readonly RichEditDocumentServer _server;

  public DocumentService()
  {
    _server = new RichEditDocumentServer();
  }

  /// <summary>
  /// 打开 Word 文档,返回可编辑的文档流
  /// </summary>
  /// <param name="filePath"></param>
  /// <returns></returns>
  public Task<Stream> OpenDocumentAsync(string filePath)
  {
    return Task.Run(() =>
    {
      _server.LoadDocument(filePath);
      var stream = new MemoryStream();
      _server.SaveDocument(stream, DocumentFormat.OpenXml);
      stream.Position = 0;
      return (Stream)stream;
    });
  }

  /// <summary>
  /// 从流创建新文档
  /// </summary>
  /// <returns></returns>
  public Task<Stream> CreateNewAsync()
  {
    return Task.Run(() =>
    {
      _server.CreateNewDocument();
      var stream = new MemoryStream();
      _server.SaveDocument(stream, DocumentFormat.OpenXml);
      stream.Position = 0;
      return (Stream)stream;
    });
  }
  /// <summary>
  /// 保存文档
  /// </summary>
  /// <param name="documentStream"></param>
  /// <param name="savePath"></param>
  /// <returns></returns>
  public Task SaveDocumentAsync(Stream documentStream, string savePath)
  {
    return Task.Run(() =>
    {
      documentStream.Position = 0;
      _server.LoadDocument(documentStream, DocumentFormat.OpenXml);
      _server.SaveDocument(savePath, DocumentFormat.OpenXml);
    });
  }

  /// <summary>
  /// 导出为 PDF
  /// </summary>
  /// <param name="documentStream"></param>
  /// <param name="pdfPath"></param>
  /// <returns></returns>
  public Task ExportToPdfAsync(Stream documentStream, string pdfPath)
  {
    return Task.Run(() =>
    {
      documentStream.Position = 0;
      _server.LoadDocument(documentStream, DocumentFormat.OpenXml);
      _server.ExportToPdf(pdfPath);
    });
  }

  public void Dispose()
  {
    _server?.Dispose();
  }
}

4 测试Demo创建记录

4.1 创建类库

  1. 创建类库项目,目标框架:.NET Standard 2.1
  2. 在项目中引入包:DevExpress.Document.Processor、DevExpress.RichEdit.Core和DevExpress.Xpo
  3. 创建4个文件夹:Blazor(Blazor网站使用)、Common(公共类,平台无关)、Models(实体对象类)、Win(Winform窗体应用使用)
  4. 在Models文件夹下创建TReportData类,用以保存报告数据
  5. 在Win文件夹下创建TReportEditorWin类,用以和窗体类应用程序交互
  6. 在TReportEditorWin类中添加域函数插入方法(InsertVariableField)和加载数据方法(LoadData)
  7. 添加TReportTemplet数据实体保存模板二进制流数据
  8. 在TReportEditorWin类中添加模板二进制流保存和获取方法
  9. 在TReportEditorWin类中添加除指定域函数外其他部分不可编辑的设置方法ProtectDocumentExceptFields

4.2 创建Winform项目

  1. 创建窗体项目,目标框架:.NET 8.0(注:DevExpress项目)
  2. 主界面设置一系列功能按钮,不同的按钮打开不同的界面
  3. 模板编辑界面使用RichEditControl加CreateAllTabs,在右侧留出一小块位置模拟域函数数据列表
  4. 在模板编辑界面初始化时:初始化模拟自定义域函数及其拖拽事件,左键点击选择域函数行并拖动,拖到RichEditor编辑区域松开,将域函数插入到鼠标光标处
  5. 在模板编辑界面加载报告模板时,会将报告模板的二进制流数据保存到数据库中
  6. 添加报告编辑界面,用来加载模板,合并数据,进行报告信息编辑
  7. 在报告编辑界面调用ProtectDocumentExceptFields设置报告那些部分可编辑(目前整个文档禁止编辑,尚未处理)
相关推荐
samble4 小时前
从零搭建灌装监控系统(十七):LiveCharts 实时温度曲线
c#·wpf·mvvm·modbus·工业控制
kimnoic4 小时前
Python数据库学习心得:SQLite、MySQL、PostgreSQL优缺点
开发语言·python
必须得开心呀5 小时前
python编写带界面的软件,需要安装哪些插件
开发语言·python
沫璃染墨7 小时前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
达子6668 小时前
RUST 图解 第 3 章:通用编程概念(Common Programming Concepts)
开发语言·算法·rust
道尔柯南8 小时前
C++ 面向对象编程入门:类和对象(上)
开发语言·c++·算法
楠楠子呀9 小时前
英语、西语、阿语客户各开一个口:多语言获客的分流方案
开发语言·javascript·ecmascript·跨境电商·whatsapp·营销工具
tachibana29 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
临床数据科学和人工智能兴趣组9 小时前
正则表达式的基础语法的基本符号
开发语言·人工智能·python·正则表达式·r语言·r语言-4.2.1·workbudyy
王中阳Go9 小时前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型