基于包含文件路径的查询在表单上嵌入多个 Excel 工作表

Posted

技术标签:

【中文标题】基于包含文件路径的查询在表单上嵌入多个 Excel 工作表【英文标题】:Embedding Multiple Excel Worksheets on a form based on a query containing file paths 【发布时间】:2013-09-23 16:53:45 【问题描述】:

首先我将描述我的目标,然后我将解释我到目前为止所做的工作。

我的目标是建立一个数据库,用户可以在其中填写一些字段,其中包括描述excel 文件所在位置以及他们想要显示的范围的字段。将有一个表格显示所有记录,其中嵌入了 excel 文件。基本上它是一个概览屏幕,其中嵌入/链接了多个 Excel 文件的内容。

 ------------------ ---------------------------------
|    Record #1     |     Embedded/Linked Excel #1    |   
|    Record #2     |     Embedded/Linked Excel #2    |
         .                             .
         .                             .
         .                             .

目前我选择了 MS Access,但我并不局限于使用 VBA/Access,而是愿意在 .NET 世界中使用一些东西。我对 OLE 对象的体验仅限于非“连续”形式的使用,因此我并不完全了解我正在尝试的内容是否可行。

在 MS Access 中,我尝试过使用未绑定对象框架。这些链接/嵌入 excel 文件很容易给定一个文件路径,但它们似乎没有能力拥有一个控制源,我可以在其中绑定来自查询的文件路径。表单需要一次显示超过 1 个记录/excel 文件。

我也尝试过使用绑定对象框将实际的 excel 文件存储在表中。这不是理想的解决方案,因为内容已经存在于不同的 excel 文件中,不希望用户必须更新两个位置的文件 - 真实文件和表中的 OLE 对象。

我的目标可以在 MS Access/VBA 中实现吗?如果不是,是否可以在 C#/WPF/Winforms 中实现?无论哪种方式,如果可能的话,我该怎么做?将不胜感激细节甚至提示/想法/沉思等。

【问题讨论】:

我的想法是,这听起来像是一个非常难以维护的数据库。如果有人决定移动或复制 Excel 文件,则您的数据库链接已损坏或过期。 澄清一下,您试图在您的ms access 应用程序 显示excel 文件的范围?在你说的object frames里我不知道怎么做,但是在c#/WPF/Winforms中是可以实现的。 我了解链接断开的风险,但是由于每天都会查看此屏幕,因此用户将受到相当严格的约束,否则每个人都会看到 A 正在处理的文件已损坏等。这就是为什么我希望他们负责维护自己的路径并从查询中获取它,而不是我只是将路径硬编码到对象中 如果我想在 C#/WPF/Winforms 中执行此操作,您有什么建议的起点吗?我从未尝试过绑定 OLE 对象,它一直是本地类型的字段。 看看我的回答,它应该会给你一个 wpf/winforms 解决方案的良好开端 【参考方案1】:

要在您的WPF/Winforms 应用程序中打开和查看Excel 文件,您需要使用Primary Interop Assemblies 来获得您计划支持的Excel 版本。

DotNetPerls 有一个很好的入门教程。

在你的情况下,它看起来像:

public void ExcelOpenSpreadsheets(string databaseStoredExcelFileName, int worksheetNumber, string startRange, string endRange)

    try
    
        Workbook workBook = _excelApp.Workbooks.Open(databaseStoredExcelFileName,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing);
        var worksheet = workbook.Worksheets[worksheetNumber] as Microsoft.Office.Interop.Excel.Worksheet;

        Excel.Range range = worksheet.get_Range(startRange, endRange);
        workBook.Close(false, thisFileName, null);
        Marshal.ReleaseComObject(workBook);

        //now do something with "range"
    
    catch
    
    

为了将 excel 文件嵌入到您的 WPF/Winforms 应用程序中,您可能需要修改 this code project 以处理 Excel 而不是 Word

【讨论】:

我通读了教程和您的代码。它解释了如何从 Excel 文件中获取数据以及如何通过 C# 编辑一个。这将允许我使用 DataGridView 或类似的东西显示/绑定数据。这不是我想要做的。我想以每个用户自己格式化的方式显示 excel 文件的“预览”。有没有办法使用interop 在 WPF 中显示或者是另一个类/lib? 我明白了,您想将 excel 文件嵌入(我可以阅读,我保证 :) 到您的应用程序中,而不是显示其数据。我发布了一个很好的教程的链接。查看我的编辑。

以上是关于基于包含文件路径的查询在表单上嵌入多个 Excel 工作表的主要内容,如果未能解决你的问题,请参考以下文章

基于字段的弹性搜索计数查询,其值包含文件系统路径

MS Access 2003 - Access 表单上的嵌入式 Excel 电子表格

如何在excel vba中传递包含excel文件路径的字符串以访问vba

MS Access:具有多个条件的双循环查询以显示在表单上

如何使用Power Query动态汇总文件夹下多个Excel文件

基于 Excel 文件数据库上的日期的 SQL 查询