【问题标题】:visual basic 2010 windows form application read excel file values into arrayvisual basic 2010 windows窗体应用程序将excel文件值读入数组
【发布时间】:2016-05-10 21:25:21
【问题描述】:

我不会在这里称自己为程序员来侮辱真正的程序员;我充其量是个业余爱好者。现在解决手头的问题:

我正在编写一个程序,允许紧急操作中心的用户快速登录并处理无线电流量和其他数据。该软件不会处理任何敏感信息,因此无需担心数据机密性。然而,完整性和可靠性是。将有多个实例,该程序需要从可以在程序外部编辑的某些数据源中读取,并且在进行更新时将文件简单地复制到适当的位置(我将处理该部分)。我们选择 Excel 是因为它本身就以表格形式进行布局,并且 xlsx 文件几乎可以通过软件在每个平台上轻松维护。

我想要做的是:当主窗体打开时,我希望它在Module1 中调用一个公共子(因为其他窗体可能也需要使用这个子)并打开文件Facilities.xlsx 为已读只要。有两列:A 包含设施类型(医院、EOC、现场指挥部),B 包含设施名称(格林维尔纪念馆、斯巴达堡县 EOC),依此类推。随着设施的添加和删除,行数会发生变化,不过我会处理更新分发。另一个 Excel 文件 Personnel.xlsx 将有更多的列和未知的行数。

我需要做的是 A) 确定要填充的数组的大小,包括所需的维数,因为这将随着列数和行数而变化,并且 B) 将数据读入数组以进一步通过决策结构进行处理或最终写入另一个 excel 文件以用于其他目的。出于所有意图和目的,数组应该是 As String,因为我将处理的所有值都是字符串。

我找到了几十个示例,其中许多使用固定范围 (A1:B38) 和类似的,还有其他使用 ADO 甚至以某种方式将 SQL 带入这种组合的示例,以及其他不完整的示例,我无法甚至确定它们如何适应其他示例。这段代码需要小、简单、轻量级,只需要将文件中的数据读入数组即可。所有的数据都是字符串,所以没有花哨的计算或其他问题。

截至目前,我确实有 Microsoft Excel 12.0 对象库和 Microsoft Office 12.0 对象库(我猜 Office 与 Excel 一起标记)COM 引用,并且在 Module1 中我有:

Imports Excel = Microsoft.Office.Interop.Excel 

帮助简化对命名空间的引用。

迄今为止,我已经尝试了十几个不同的示例,并且出现了一些运行时崩溃、读取任何数据失败以及一些产生不允许构建的错误的问题。我很茫然,即将放弃 Excel 到其他不太可靠的来源。我真的需要一些帮助。如果有代码轻量级、资源节省的解决方案,请帮助我。

【问题讨论】:

    标签: vb.net visual-studio-2010


    【解决方案1】:

    如果您使用 xslx 文件,请不要使用 Microsoft.Office.Interop,则不需要它。查看 OpenXml 库 (https://msdn.microsoft.com/en-us/library/office/bb448854.aspx) 或者您可以尝试使用 koogra (http://sourceforge.net/projects/koogra/)

    如果您想使用互操作,此代码可能会对您有所帮助:

            Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
            Workbook wb = excelApp.Workbooks.Open(@"c:\temp_10\sample1.xlsx");
            Worksheet ws = wb.Worksheets[1];
            Range excelRange = ws.UsedRange;
    
            List<string> rows = new List<string>();
    
            for (int i=1;i<=excelRange.Rows.Count;i++)
            {
                string r = "";
               for (int k=1;k<=excelRange.Columns.Count; k++)
               {
                   r += (excelRange.Cells[i, k] as Microsoft.Office.Interop.Excel.Range).Value.ToString();
                   r += ";";
               }
                rows.Add(r);
            }
    

    【讨论】:

    • 感谢您以不同的角度看待这个问题。我需要考虑两件事:OpenXML 库在资源上是否更轻松,在代码上是否更轻松?我已经提取了您提供的链接,我将注释掉我当前的代码并尝试其中一些示例。我仍然在处理数组,并且可能仍然需要帮助。首先,将数据放入字符串数组中,其次,能够以一维为条件,在双列、可变行(大约 40 个)二维数组中提取第二维上的字符串。
    • 我一直在研究这个解决方案,但我认为它对我不起作用。 MSDN 说 openxml 库是 2013 年或更高版本的,而我并没有那么远。我正在使用 Visual Studio 2010 和 Office 2007,所以两者都没有。我可以单独获得这个 sdk 还是必须回到 Interop?
    • 我在 Visual Studio 2010 中使用过 OpenXml 2.5。文件格式 xslx 与 office 2007/2010/2013 相同。我认为你可以使用它
    • 在与几个将参与该程序的人交谈并多次尝试获取 OpenXML SDK(并收到由 microsoft.com 触发的强制服务器锁定、VPN 断开连接和VM 关闭)我已经决定,虽然这是一个优雅的解决方案,但出于兼容性和(显然)安全性的原因,我确实想继续使用 Interop 解决方案。在我解决 OpenXML SDK 问题之前,是否有一个简单的解决方案可以将动态列数和行数读入字符串数组?
    • 不知道你遇到了什么安全问题,我从这里下载了安装程序:microsoft.com/en-us/download/details.aspx?id=30425。读取的简单解决方案是使用互操作吗?而且文件格式总是xslx?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多