我們有一個應用程序使用Microsoft Access數據庫引擎從Excel xlsx文件中讀取數據。 xlsx文件由第三方軟件生成。該應用程序多年來一直運行良好。程序在Excel中保存之前無法讀取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中打開示例文件,然後單擊「保存」,然後運行該程序,它將成功讀取文件。
該測試程序做出2個假設:(1)xlsx文件位於C:\ Temp \ TestData-Original.xlsx和(2)Microsoft Access數據庫引擎安裝在您的計算機上。
我研究過這個,但沒有運氣。大多數討論圍繞改變連接字符串來指定不同版本的Excel。到目前爲止,沒有任何改變。
注意:我注意到當我使用Excel打開文件,然後保存它時,大小增加了大約70%。
任何想法?
'如果你用示例Excel文件運行這個程序,它將會失敗。它是如何失敗的?它是否有例外?如果是這樣,那是什麼?它說什麼?如果在調試器中單步執行代碼會發生什麼情況? – 2014-09-19 17:08:31
第三方可以爲您提供* exact *文件格式嗎?如你所想,「Excel文件」有點模糊。 Excel可以打開純文本文件,但很難證明純文本是有效的xlsx文件。如果在純文本編輯器中打開前後文件,它們是否有一些指定格式信息的內部XML? – David 2014-09-19 17:08:46
你做過一個比較前的文件嗎?理論上,如果你在excel中沒有做任何事情,只是將其再次保存,文件應該只有很小的變化(例如,更新總時間編輯,最後編輯等等)。比較他們,看看發生了什麼。 – 2014-09-19 17:08:52