目录
- 1 RichEditorControl控件不包含Save类型事件
- 2 Document和SubDocument关系
- 3 如何在类库中使用DevExpress Office File API
- 4 测试Demo创建记录
- 4.1 创建类库
- 4.2 创建Winform项目
相关demo:https://download.csdn.net/download/mingjing941018/929636961 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 创建类库
- 创建类库项目,目标框架:.NET Standard 2.1
- 在项目中引入包:DevExpress.Document.Processor、DevExpress.RichEdit.Core和DevExpress.Xpo
- 创建4个文件夹:Blazor(Blazor网站使用)、Common(公共类,平台无关)、Models(实体对象类)、Win(Winform窗体应用使用)
- 在Models文件夹下创建TReportData类,用以保存报告数据
- 在Win文件夹下创建TReportEditorWin类,用以和窗体类应用程序交互
- 在TReportEditorWin类中添加域函数插入方法(InsertVariableField)和加载数据方法(LoadData)
- 添加TReportTemplet数据实体保存模板二进制流数据
- 在TReportEditorWin类中添加模板二进制流保存和获取方法
- 在TReportEditorWin类中添加除指定域函数外其他部分不可编辑的设置方法ProtectDocumentExceptFields
4.2 创建Winform项目
- 创建窗体项目,目标框架:.NET 8.0(注:DevExpress项目)
- 主界面设置一系列功能按钮,不同的按钮打开不同的界面
- 模板编辑界面使用RichEditControl加CreateAllTabs,在右侧留出一小块位置模拟域函数数据列表
- 在模板编辑界面初始化时:初始化模拟自定义域函数及其拖拽事件,左键点击选择域函数行并拖动,拖到RichEditor编辑区域松开,将域函数插入到鼠标光标处
- 在模板编辑界面加载报告模板时,会将报告模板的二进制流数据保存到数据库中
- 添加报告编辑界面,用来加载模板,合并数据,进行报告信息编辑
- 在报告编辑界面调用ProtectDocumentExceptFields设置报告那些部分可编辑(目前整个文档禁止编辑,尚未处理)