在Excel保存xlsx文件之前,程序无法读取该文件

本文关键字:文件 程序 读取 Excel 保存 xlsx | 更新日期: 2023-09-27 18:23:42

我们有一个应用程序,它使用Microsoft Access数据库引擎从Excel xlsx文件中读取数据。xlsx文件由第三方软件生成。该应用程序多年来一直运行良好。

生成xlsx文件的公司修改了他们的软件,结果xlsx的格式发生了变化。我们的应用程序无法再读取这些文件。但是,如果我使用Excel手动打开其中一个文件,并立即单击"保存",则新文件可以正常工作。

第三方的回应基本上是"既然你可以使用Excel打开文件,那么这表明它是一个有效的xlsx文件。问题一定在你这边"。他们确实有道理。

我已将其中一个xlsx文件的示例发布在https://drive.google.com/file/d/0B6jNYMkptFteTmc4YU9BWU1PRUk/edit?usp=sharing

下面是一个简单的测试程序(VisualStudio.net中的控制台应用程序),它再现了这个问题。

static void Main(string[] args)
{
    String fileSpec = @"C:'Temp'TestData-Original.xlsx";
    String connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileSpec + ";Extended Properties='"Excel 12.0;HDR=No;IMEX=1'"";
    DataTable dtExcelRecords = null;
    OleDbConnection con = new OleDbConnection(connectionString);
    OleDbCommand cmd = new OleDbCommand();
    cmd.CommandType = System.Data.CommandType.Text;
    cmd.Connection = con;
    OleDbDataAdapter dAdapter = new OleDbDataAdapter(cmd);
    try
    {
        con.Open();       // Throws exception here.
        DataTable dtExcelSheetNames = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        String sheetName = (dtExcelSheetNames.Rows[0]["Table_Name"].ToString()).Replace("''", "'");
        if (!(String.IsNullOrEmpty(sheetName)))
        {
            cmd.CommandText = "SELECT * FROM [" + sheetName + "]";
            dtExcelRecords = new DataTable();
            dAdapter.SelectCommand = cmd;
            dAdapter.Fill(dtExcelRecords);
        }
        con.Close();
        Console.WriteLine(String.Format("Found {0} records in file {1}", dtExcelRecords.Rows.Count, fileSpec));
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception: " + ex.Message);
    }
    finally
    {
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}

如果使用示例Excel文件运行此程序,它将失败。如果您在Excel中打开示例文件,然后单击"保存",然后运行程序,它将成功读取文件。

测试程序有两个假设:(1)xlsx文件位于C:''Temp''TestData-Original.xlsx;(2)Microsoft Access数据库引擎安装在您的计算机上。

我对此进行了研究,但运气不佳。大多数讨论都围绕着更改连接字符串以指定不同版本的Excel展开。到目前为止,没有任何变化。

注意:我注意到,当我使用Excel打开文件,然后保存它时,大小会增加大约70%。

有什么想法吗?

在Excel保存xlsx文件之前,程序无法读取该文件

我使用ClosedXML(OpenXML的包装器)没有问题。

    string fileSpec = @"C:'Temp'TestData-Original.xlsx";
    var wb = new XLWorkbook(fileSpec);
    var ws = wb.Worksheet("Sheet1");
    MessageBox.Show(ws.RowCount().ToString());