我可以使用OleDbConnection Excel ACE Driver从不可搜索的System.IO.Stream而不是文件中读取Excel文件吗?

7
这里有一个类似的问题 In Memory OleDbConnection to Excel File,但是通过另一种方式来回答了这个问题。
以下是使用 OleDbConnection 访问磁盘上的 Excel 文件的示例代码:
static void Main(string[] args)
{
    String filePathToExcelFile = "c:\\excelfile.xls";
    Boolean hasHeaders = true;

    String connectionString = String.Format(
        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};" +
        "Extended Properties=\"Excel 12.0;HDR={1};IMEX=2\"",
        filePathToExcelFile, hasHeaders ? "Yes" : "No");

    using(OleDbConnection conn = new OleDbConnection(connectionString))
    using (OleDbCommand command = new OleDbCommand("SELECT * FROM [Sheet1$]", 
        conn))
    {
        conn.Open();
        OleDbDataReader datareader = command.ExecuteReader();

        while(datareader.Read())
        {
            Object[] values = new object[datareader.FieldCount];
            datareader.GetValues(values);

            Console.WriteLine(String.Join(",", values));
        }
    }
}

我希望能够从一个不可寻址的 System.IO.Stream 中提取 Excel 文件,而不是执着于磁盘上的持久文件。
这个问题可以分解为两个部分:a)我可以“指向”OleDbConnection 到一个 System.IO.Stream 吗?b)如果可以,它可以是一个只向前的流而不是可寻址的流吗?
FYI:如果您想运行此代码片段,则需要安装 Microsoft Access Database Engine 2010 Redistributable。如果您安装了 64 位版本,则需要将项目定位为 x64,反之亦然。

我非常怀疑在不可寻址的限制下你能否完成这个任务。无论是你展示的混乱二进制的.xls文件,还是有组织的XML格式的.xlsx(OOXML)文件,都以明显的非串行格式存储信息。也就是说,纯粹按顺序处理Excel文件是不可能的。 - Joshua Honig
请查看以下答案:https://dev59.com/3UfRa4cB1Zd3GeqP_roM - Artem Koshelev
1个回答

0

如果有帮助,请查看此链接:http://epplus.codeplex.com/

还有示例代码:

string fileName = System.Windows.Forms.Application.StartupPath + "\\Resources\\SUPPLIERDECISIONKEYLIST.xlsx";
using (var pck = new OfficeOpenXml.ExcelPackage())
{
using (var stream = File.OpenRead(fileName))
{
pck.Load(stream);
}
var ws = pck.Workbook.Worksheets[SheetNo];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接