程序无法读取xlsx文件,直到Excel保存为止

时间:2014-09-19 17:04:19

标签: c# excel xls file-format

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

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

来自第三方的响应基本上是#34;由于您可以使用Excel打开文件,因此显示它是有效的xlsx文件。问题必须在你的最后#34;。他们确实有一点意义。

我已在https://drive.google.com/file/d/0B6jNYMkptFteTmc4YU9BWU1PRUk/edit?usp=sharing

发布了其中一个xlsx文件的示例

这是一个简单的测试程序(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%。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

    string fileSpec = @"C:\Temp\TestData-Original.xlsx";

    var wb = new XLWorkbook(fileSpec);
    var ws = wb.Worksheet("Sheet1");

    MessageBox.Show(ws.RowCount().ToString());